Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЦСП_КП_ЭльГамаль_Расш_поля_Галуа_Шифрование.docx
Скачиваний:
0
Добавлен:
04.02.2026
Размер:
919.17 Кб
Скачать

Приложение г текст дополнительной программы для демонстрации выполения заданных функций мпкс

.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;