 
        
        - •Министерство цифрового развития, связи и массовых коммуникаций российской федерации
- •Московский технический университет связи и информатики
- •Введение
- •1. Формирование технического задания на составную часть эскизного проекта
- •2. Краткие теоретические основы
- •2.1 Математический аппарат
- •2.2 Распространение ключей в симметричных криптосистемах по алгоритму Диффи-Хелмана
- •3. Разработка и описание функциональной схемы микропроцессорного устройства
- •4. Разработка программного обеспечения микропроцессорного устройства
- •4.1 Генерация ключей
- •4.2 Программный код генерации ключей
- •4.3 Вывод программы генерации ключей
- •4.4 Разработка подпрограммы передачи ключей для абонента c
- •4.5 Программный код для Диффи-Хелмана 3 абонента
- •Программный код 2 – Программный код передачи ключей по потоку e1
- •4.6 Вывод программы Генерации ключей:
- •5. Анализ результатов работы программного обеспечения микропроцессорного устройства
- •Список использованной литературы
- •Приложение 1
- •2 Цель разработки, наименование и обозначение изделия
- •2.1 Цель разработки
- •3 Технические требования к изделию
- •4 Технико-экономические требования
- •5 Требования к видам обеспечения
- •11 Этапы выполнения эскизного проекта
- •12 Порядок выполнения и приемки этапов эскизного проекта
- •Приложение 2
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; 
 
 
 | 
