Добавил:
Да поможет вам Котельников Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая / Распределение ключей по алгоритму Диффи Хелмана в рассширенных полях Галуа абонент C.docx
Скачиваний:
23
Добавлен:
23.06.2024
Размер:
794.36 Кб
Скачать

4. Разработка программного обеспечения микропроцессорного устройства

В данном разделе приводятся блок-схемы алгоритмов программы на рисунках 5 - 21, а также программный код 1 - 2.

Рисунок 5 – Блок – схема основной программы

Рисунок 6 – Блок-схема прерывающих подпрограмм SPORT0 для передачи

Рисунок 7 – Блок-схема прерывающих подпрограмм SPORT0 для приёма

4.1 Генерация ключей

Рисунок 8 – Блок-схема подпрограммы Генерации ключей

Рисунок 9 – Блок-схема подпрограммы генерации ключа n

Рисунок 10 – Блок-схема подпрограммы генерации ключа z

Рисунок 11 – Схема передачи ключей между абонентами

4.2 Программный код генерации ключей

import random

from math import *

import math

n = 106513

n2 = 65536

z = int(random.uniform(1,n2))

print('n = ', n ,' - является полиномом')

print('z = ', z , ' - является индивидуальным ключом абонента B')

Программный код 1 – Подпрограмма генерации ключей

4.3 Вывод программы генерации ключей

Рисунок 12 – Вывод подпрограммы генерации ключей

4.4 Разработка подпрограммы передачи ключей для абонента c

Рисунок 13 – Блок-схема подпрограммы возведения в степень

Рисунок 14 – Блок-схема возведение в степень

Рисунок 15 – Блок-схема умножения

4.5 Программный код для Диффи-Хелмана 3 абонента

.SECTION/DM vars;

// Переменные для обработки сигнала

.var t;

.var k;

.var z = 62023;

.var n = 40977;

.var sd;

.var otvet;

.var/circ bank[16];

//

.var got_fl = 0;

.var i2_soh ;

.var i3_soh ;

.var l2_soh ;

.var l3_soh ;

.var ar_soh ;

.var/circ rx_buf[31] = 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0;

.var/circ tx_buf[31] = 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0;

.var/circ vhod[31] = 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0;

.var/circ vihod[31] = 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0;

.SECTION/PM varsp;

.SECTION/PM program;

jump start; rti; rti; rti;

rti; rti; rti; rti;

rti; rti; rti; rti;

rti; rti; rti; rti;

jump peredacha; rti; rti; rti;

jump priem; rti; rti; rti;

rti; rti; rti; rti;

rti; rti; rti; rti;

rti; rti; rti; rti;

rti; rti; rti; rti;

rti; rti; rti; rti;

rti; rti; rti; rti;

//----------------Подпрограмма обработки информации -----------//

//Генерация ключей по алгоритму Диффи-Хелмана в расширенных полях Галуа

//-----------------------------------------------------------//

def:

ena m_mode;

dis ar_sat;

//Возведение сообщения в степень z

ax0 = dm(i4,m4);

dm(t) = ax0;

ax0 = dm(z);

dm(k) = ax0;

call stepen;

dm(i5,m4) = ar;

//----------------------------------------------------------------//

// Банк степеней(заполнение)

//----------------------------------------------------------------//

stepen:

I0 = bank;

L0 = length(bank);

m1 = 1;

ar = dm(t);

mr0 = dm(t);

dm(I0,m1) = ar;

cntr = 15;

do ms until ce;

call umn;

dm(I0,m1) = ar;

ms: mr0 = ar;

//----------------------------------------------------------------//

// Банк степеней(возведение)

//----------------------------------------------------------------//

ax0 = dm(k);

sr0 = 1;

dm(sd) = sr0;

se = 1;

mr0 = 1;

dm(otvet) = mr0;

ar = 1;

cntr = 16;

do p1 until ce;

ar = dm(I0,m1);

mr0 = dm(otvet);

ay0 = dm(sd);

none = ax0 and ay0;

if ne call umn;

sr0 = dm(sd);

sr = lshift sr0(lo);

dm(sd) = sr0;

p1: nop;

rts;

//----------------------------------------------------------------//

// Умножение в расширенных полях Галуа

//----------------------------------------------------------------//

umn:

ay0 = 0;

se = 1;

af = pass ay0;

ay1 = dm(n);

sr0 = 1;

se = 1;

ay0 = sr0;

none = mr0 and ay0;

if NE af = pass ar;

CNTR = 15;

do cicle until CE;

sr = lshift sr0 (lo),

ay0 = ar;

ar = ar + ay0;

ay0 = sr0;

if ac ar = ar xor ay1;

none = mr0 and ay0;

cicle: if ne af = ar xor af;

ar = pass af;

dm(otvet) = ar;

RTS;

//------Программа передачи потока E1 c помощью SPORT0---------//

//------------------------------------------------------------//

start: ar = dm(0x3fff);

ar = clrbit 0xc of ar; //отключение SPORT0 Для настройки

dm(0x3fff) = ar;

ar = B#001010000111; //Включение ПМ и ПД автобуфирирования

//Шаг пприём - M1

dm(0x3ff3) = ar; //I0 -> к приёму

i0 = rx_buf;

l0 = length(rx_buf);//привязка

i1 = tx_buf;

l1 = length(tx_buf);

m1 = 1;

i4 = vhod;

l4 = length(vhod);

i5 = vihod;

l5 = length(vihod);

m4 = 1;

ar = B#1000001000000111; /*настройка порта - длина слова = 8 бит

слева нули

RFS0,TFS0 - активный уровень - высокий

RFS0 - внешний сигнал

*/

dm(0x3ff6) = ar;

ar = 0x0200; //активация младших и старших регистров приёмника и передатчика SPORT0

dm(0x3ff7) = ar;

dm(0x3ff9) = ar;

ar = dm(0x3fff);

ar = setbit 0xc of ar; //включение SPORT0 для сохранения настроек

dm(0x3fff) = ar;

ifc = 0x00ff; //сброс прерываний

nop;

imask = B#0001100000;// маскирование прерывание - разрешение SPORT0 ПД и ПМ

nop;

//------------Подпрограмма обработки информации ----------------//

//-----------------------------------------------------------//

z1:

ar = dm(got_fl);

ar = pass ar;

// Запись rx

call z_rx;

//rx ->vhod

call zac1;

if eq jump z1;

//ПРОГРАММА ОБРАБОТКИ СИГНАЛА

cntr = 31;

do s2 until ce;

call def;

s2: nop;

//vihod ->tx

call zac2;

//передача c tx

call z_tx;

ar = 0;

dm(got_fl) = ar;

jump z1;

//------------ПОДПРОГРАММА ПРЕРЫВАНИЙ ПЕРЕДАЧИ------------------------//

//--------------------------------------------------------------------//

peredacha: dm(i2_soh) = i2;

dm(i3_soh) = i3;

dm(l2_soh) = l2;

dm(l3_soh) = l3;

dm(ar_soh) = ar;

i2 = tx_buf;

l2 = length(tx_buf);

i3 = vihod;

l3 = length(vihod);

//vihod -> tx_bf на передачу

cntr = 31;

do vic1 until ce;

ar = dm(i3, m1);

vic1: dm(i2, m1) = ar;

//восстановление значение используемых в регистре

ar = dm(ar_soh);

i2 = dm(i2_soh);

i3 = dm(i3_soh);

l2 = dm(l2_soh);

l3 = dm(l3_soh);

rti;

//------------ПОДПРОГРАММА ПРЕРЫВАНИЙ ПРИЁМА------------------------//

//------------------------------------------------------------------//

priem: dm(i2_soh) = i2;

dm(i3_soh) = i3;

dm(l2_soh) = l2;

dm(l3_soh) = l3;

dm(ar_soh) = ar;

//приём rx_bf -> vhod

i2 = rx_buf;

l2 = length(rx_buf);

i3 = vhod;

l3 = length(vhod);

cntr = 31;

do vic2 until ce;

ar = dm(i2, m1);

vic2: dm(i3, m1) = ar;

//восстановление значение используемых в регистре

ar = dm(ar_soh);

i2 = dm(i2_soh);

i3 = dm(i3_soh);

l2 = dm(l2_soh);

l3 = dm(l3_soh);

//установка флага готовности

ar = 0x55;

dm(got_fl) = ar;

rti;

//------------------------------------------------------------------//

//Форсирование прерываний

//------------------------------------------------------------------//

zac1: ax0 = dm(got_fl);

ar = pass ax0;

if eq ar = setbit 13 of ar;

ifc = ar;

nop;

rts;

zac2: ax0 = dm(got_fl);

ar = pass ax0;

if ne ar = setbit 14 of ar;

ifc = ar;

nop;

rts;

//------------------------------------------------------------------//

//Заполнение информации с входа и на выход

//------------------------------------------------------------------//

z_rx: cntr = 31;

do r until ce;

ax0 = io(0);

r: dm(i0,m1) = ax0;

rts;

z_tx: cntr = 31;

do t2 until ce;

ax0 = dm(i1,m1);

t2: io(1) = ax0;

rts;

Соседние файлы в папке Курсовая