- •Введение
- •Глава 1 формирование технического задания на составную часть эскизного проекта
- •Глава 2 краткие теоретические основы
- •Глава 3 разработка и описание функциональной семы микропроцессорной криптографической системы
- •Глава 4 разработка программного обеспечения микропроцессорного устройства
- •4.1 Описание алгоритмов и блок-схем
- •4.2 Описание основного программного обеспечения
- •4.3 Демонстрационное программное обеспечение и отладка
- •Глава 5 анализ результатов работы программного обеспечения микропроцессорного устройства
- •5.1 Оценка корректности функционирования программного обеспечения
- •5.2 Надежность и устойчивость работы
- •5.3 Выводы по результатам анализа
- •Заключение
- •Список использованных источников
- •Приложение а техническое задание
- •1. Наименование, шифр, основание, исполнитель и сроки выполнения эскизного проекта
- •2 Цель разработки, наименование и обозначение изделия
- •2.1 Цель разработки
- •3 Технические требования к изделию
- •4 Технико-экономические требования
- •5 Требования к видам обеспечения
- •11 Этапы выполнения эскизного проекта
- •12 Порядок выполнения и приемки этапов эскизного проекта
- •Приложение б текст основной программы шифрования
- •Приложение г текст дополнительной программы для демонстрации выполения заданных функций мпкс
- •Приложение д инструкция по работе с мпкс
Приложение г текст дополнительной программы для демонстрации выполения заданных функций мпкс
.SECTION/DM vars;
/* 1 = ENCRYPT */ /* 0 = DECRYPT */ .VAR MODE = 1;
/* Init. data */ .var P = 0x8003; /* Pollynom */ .var G = 4952; /* Generator */ .var X = 11497; /* Private */ .var Y = 0; /* Public = 0 */ .var K = 5042; /* Session key */
.var P_A = 0x1001; // A .var P_B = 0x0011; // B
.var TEMP_A = 0; .var TEMP_B = 0; .var TEMP_M = 0;
.var TEMP_RES = 0; .var TEMP_EXP = 0; .var TEMP_BASE = 0;
.var EXP_; .var X_; .var P_;
.var/circ bank_step[16];
.var cntr_save = 0; .var cntr_save_in = 0;
.var got_fl = 0; .var irq_i2_save; .var irq_i3_save; .var irq_l2_save; .var irq_l3_save;
/* --- Buffers --- */ .var/circ rx_buf[32]; .var/circ tx_buf[32]; .var/circ vhod[32]; .var/circ vihod[32]; .SECTION/PM varsp; // A,B shifrotext RX,TX .var/circ signal_rx[32] = 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, 0; .var/circ signal_tx[32] = 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, 0;
.SECTION/PM program;
/* --- VEKTORA PRERYVANIY --- */ jump start; rti; rti; rti; /* Reset */ rti; rti; rti; rti; /* IRQ2 */ rti; rti; rti; rti; /* IRQL1 */ rti; rti; rti; rti; /* IRQL0 */ jump tx_cb; rti; rti; rti; /* SPORT0 TX (bit 3) */ jump rx_cb; rti; rti; rti; /* SPORT0 RX (bit 4) */
start: dis ar_sat; ena m_mode; // Nastroika buferov DM pamyati i0 = rx_buf; l0 = length(rx_buf); i1 = tx_buf; l1 = length(tx_buf); m1 = 1; i2 = vihod; l2 = length(vihod); i3 = vhod; l3 = length(vhod); // Nastroika PM buferov i5 = signal_rx; l5 = length(signal_rx); i6 = signal_tx; l6 = length(signal_tx); m5 = 1; // Nastroika SPORT0 ar = dm(0x3fff); ar = clrbit 0xc of ar; dm(0x3fff) = ar; AX0 = 0; dm(0x3FF4) = AX0; dm(0x3FF5) = AX0; AX0 = 0x0C00; dm(0x3FF2) = AX0; dm(0x3FF3) = AX0;
ar = B#1000100000000111; dm(0x3ff6) = ar; ar = 0x0200; dm(0x3ff7) = ar; dm(0x3ff9) = ar; ar = dm(0x3fff); ar = setbit 0xc of ar; dm(0x3fff) = ar; // Generaciya Y odin raz CALL find_Y;
// Vkluchenie preryvaniy ifc = 0x00ff; nop; imask = 0x0060; nop; ena ints; jump MAIN; // Osn. zicl MAIN: ar = dm(got_fl); ar = pass ar; call z_rx; // Chtenie IO(0) call zac1; // Forsiruem priem preriv. if eq jump MAIN;
// Copirovanie VHOD -> SIGNAL_RX i3 = vhod; l3 = length(vhod); i5 = signal_rx; l5 = length(signal_rx);
ax0 = dm(MODE); ar = pass ax0; if eq jump setup_decrypt_in;
setup_encrypt_in: cntr = 16; // Shifrator: 16 slov jump do_copy_in; setup_decrypt_in: cntr = 32; // Deshifrator: 32 slov do_copy_in: do copy_in_loop until ce; ar = dm(i3, m1); copy_in_loop: pm(i5, m5) = ar; i5 = signal_rx; i6 = signal_tx; ax0 = dm(MODE); ar = pass ax0; // Vyzov Algoritma if eq jump call_dec; CALL ENCRYPT; jump after_algo; call_dec: CALL DECRYPT; after_algo:
// Copirovanie SIGNAL_TX -> VIHOD i2 = vihod; l2 = length(vihod); i6 = signal_tx; l6 = length(signal_tx);
ax0 = dm(MODE); ar = pass ax0; if eq jump setup_decrypt_out; setup_encrypt_out: cntr = 32; // Vyhod shifratora: 32 slov jump do_copy_out; setup_decrypt_out: cntr = 16; // Vyhod deshifratora: 16 slov
do_copy_out: do copy_out_loop until ce; ar = pm(i6, m5); copy_out_loop: dm(i2, m1) = ar;
// Otpravka call zac2; // Preryvanie peredachi call z_tx; // Vyvod v IO(1) ar = 0; dm(got_fl) = ar; jump MAIN;
// EL-GAMAL ALGORITM find_Y: AR = DM(X); DM(EXP_) = AR; AR = DM(G); DM(X_) = AR; CALL UMN_step; DM(Y) = MR0; RTS; // SHIFRATOR ENCRYPT: // Obnovlenie K call gen_K;
// A = G^K AR = DM(K); DM(EXP_) = AR; AR = DM(G); DM(X_) = AR; CALL UMN_step; DM(TEMP_A) = MR0;
// S = Y^K AR = DM(K); DM(EXP_) = AR; AR = DM(Y); DM(X_) = AR; CALL UMN_step; dm(P_A) = MR0; // S -> P_A
cntr = 16; do enc_loop until ce; // Chitaem M AR = PM(I5,M5); dm(P_B) = AR; // M -> P_B DM(TEMP_M) = AR;
AR = DM(TEMP_A); PM(I6, M5) = AR; call UMN_gf_n;
PM(I6,M5) = MR0; enc_loop: nop; RTS;
// DESHIFRATOR DECRYPT: AR = PM(I5,M5); DM(TEMP_A) = AR; AR = PM(I5,M5); DM(TEMP_B) = AR; // S = A^X AR = DM(X); DM(EXP_) = AR; AR = DM(TEMP_A); DM(X_) = AR; CALL UMN_step; DM(X_) = MR0; /* Inv = S^(-1) = S^32766 */ AR = 32766; DM(EXP_) = AR; CALL UMN_step; DM(P_B) = MR0;
// 1 AX0 = DM(TEMP_B); DM(P_A) = AX0; CALL UMN_gf_n; PM(I6,M5) = MR0;
cntr = 15; do dec_loop until ce; AR = PM(I5,M5); // A AR = PM(I5,M5); DM(P_A) = AR; // B CALL UMN_gf_n; PM(I6,M5) = MR0; dec_loop: nop; RTS;
// generate k kogurentn. (K * 5 + 13) mod 2^16 gen_K: MX0 = DM(K); MY0 = 5; MR = MX0 * MY0 (UU); AX0 = MR0; AY0 = 13; AR = AX0 + AY0; DM(K) = AR; RTS;
// step. UMN_step: DM(cntr_save) = cntr; CALL bank_fill; AX0 = 1; DM(TEMP_RES) = AX0; AX0 = DM(EXP_); DM(TEMP_EXP) = AX0;
I7 = bank_step; L7 = length(bank_step); M5 = 1; CNTR = 16; DO bank_loop UNTIL CE; MY0 = DM(I7, M5); SI = DM(TEMP_EXP); SR = LSHIFT SI BY 0 (LO); AR = TSTBIT 0 OF SR0; IF EQ JUMP no_bank_mult; /* Res = Res * Bank[i] */ DM(P_B) = MY0; AR = DM(TEMP_RES);
DM(P_A) = AR; CALL UMN_gf_n; DM(TEMP_RES) = MR0; no_bank_mult: // shift exp SI = DM(TEMP_EXP); SR = LSHIFT SI BY -1 (LO); SI = SR0; DM(TEMP_EXP) = SI; bank_loop: nop; MR0 = DM(TEMP_RES); CNTR = dm(cntr_save); RTS;
bank_fill: I7 = bank_step; L7 = length(bank_step); M5 = 1;
// Bank[0] = X^1 = X_ AX0 = DM(X_); DM(I7, M5) = AX0; DM(TEMP_BASE) = AX0; // save step. // Bank[1]..Bank[15] CNTR = 15; DO fill_loop UNTIL CE; // Base = Base * Base AR = DM(TEMP_BASE); DM(P_A) = AR; DM(P_B) = AR; CALL UMN_gf_n; DM(TEMP_BASE) = MR0; DM(I7, M5) = MR0; fill_loop: nop; RTS;
UMN_gf_n: dm(cntr_save_in) = CNTR; AX0 = DM(P_A); SI = DM(P_B); AY1 = DM(P); MR0 = 0; CNTR = 16;
DO mul_loop UNTIL CE; SR = LSHIFT SI BY 0 (LO); AR = TSTBIT 0 OF SR0; IF EQ JUMP no_add; AY0 = MR0; AR = AX0 XOR AY0; MR0 = AR; no_add: SR = LSHIFT SI BY -1 (LO); SI = SR0; AR = AX0; AY0 = 0x4000; NONE = AR AND AY0; SR = LSHIFT AR BY 1 (LO); AX0 = SR0; IF EQ JUMP no_reduce; AR = AX0; AR = AR XOR AY1; AX0 = AR; no_reduce: mul_loop: nop; CNTR = dm(cntr_save_in); RTS;
// Int. tx_cb: ena sec_reg; dm(irq_i2_save) = i2; dm(irq_i3_save) = i3; dm(irq_l2_save) = l2; dm(irq_l3_save) = l3; i2 = tx_buf; l2 = length(tx_buf); i3 = vihod; l3 = length(vihod); cntr = 32; do vic1 until ce; ar = dm(i3, m1); vic1: dm(i2, m1) = ar; i2 = dm(irq_i2_save); i3 = dm(irq_i3_save); l2 = dm(irq_l2_save); l3 = dm(irq_l3_save); dis sec_reg; rti; rx_cb: ena sec_reg; dm(irq_i2_save) = i2; dm(irq_i3_save) = i3; dm(irq_l2_save) = l2; dm(irq_l3_save) = l3; i2 = rx_buf; l2 = length(rx_buf); i3 = vhod; l3 = length(vhod); cntr = 32; do vic2 until ce; ar = dm(i2, m1); vic2: dm(i3, m1) = ar; ar = 0x55; dm(got_fl) = ar; i2 = dm(irq_i2_save); i3 = dm(irq_i3_save); l2 = dm(irq_l2_save); l3 = dm(irq_l3_save); dis sec_reg; rti; zac1: ax0 = dm(got_fl); ar = pass ax0; if ne rts; 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: ax0 = io(0); ar = pass ax0; if eq rts; i0 = rx_buf; l0 = length(rx_buf); dm(i0,m1) = ax0; ax0 = dm(MODE); ar = pass ax0; if eq jump z_rx_32; cntr = 15; jump z_rx_; z_rx_32: cntr = 31; z_rx_: do z_rx_loop_end until ce; ax0 = io(0); z_rx_loop_end: dm(i0, m1) = ax0; ax0 = 0; io(0) = ax0; rts; z_tx: i1 = tx_buf; l1 = length(tx_buf); ax0 = dm(MODE); ar = pass ax0; if eq jump z_tx_16; cntr = 32; jump z_tx_; z_tx_16: cntr = 16; z_tx_: do z_tx_loop_end until ce; ax0 = dm(i1,m1); z_tx_loop_end: io(1) = ax0; rts; |
