Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Экспорт и импорт криптографии за рубежом 2 страница



leftt ^ = (work << 16);

work = ((right >> 2) leftt) & Ox33333333L;

leftt ^= work;

right ^= (work << 2);

work = ((right >> 8) leftt) & OxOOtfOOffL;

leftt ^= work;

right ^= (work << 8);

right = ((right << 1) | ((right >> 31) & 1L)) & OxffffffffL;

work = (leftt ^ right) & OxaaaaaaaaL;

leftt ^= work;

right ^=work;

leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & OxffffffffL;

for(round = 0; round <8; round++) {

work = (right << 28) | (right >> 4);

work ^=*keys++;

fval = SP7[ work & Ox3fL];

fval |= SP5[(work >> 8) & Ox3fL];

fval |= SP3[(work >> 16) & Ox3fL];

fval | =SP1[(work >> 24) & Ox3fl-:l;

work = right ^ *keys++;

fval | = SP81* work & Ox3fL];

fval |= SP6[(work >> 8) & Ox3fL];

fval |= SP4[(work >> 16) & Ox3fL];

fval | = SP2[(work >> 24) & Ox3fL];

leftt ^= fval;

work = (leftt << 28) | (leftt >> 4);

work = *keys++;

fval = SP7[ work & Ox3fL];

fval |= SP5[(work >> 8) & Ox3fL];

tval |= SP3[(work >> 16) & Ox3fL];

fval |= SP1[(work >> 24) & Ox3fL];

work = leftt ^*keys++;

fval |= SPEC work & Ox3fL];

fval |= SP6[(work >> 8) & Ox3fL];

fval |= SP4[(work >> 16) & Ox3fL];

fval |= SP2[(work >> 24) & Ox3fL];

right ^= fval;

}

right = (right << 31) | (right >> 1);

work = (letft ^right) & OxaaaaaaaaL;

leftt ^=work;

right ^= work;

leftt = (leftt << 31) | (leftt >> 1);

work = ((leftt >> 8) right) & OxOOffOOffL;

right ^=work;

leftt ^= (work << 8);

work = ((leftt >>2) right) & Ox33333333L;

right ^=work;

leftt ^= (work << 2);

work = ((right >> 16) leftt) & OxOOOOffffL;

leftt ^=work;

right ^=(work << 16);

work = ((right >> 4) leftt) & OxOfOfOfOfL;

leftt ^=work;

right ^=(work << 4);

*block++ = right;

*block = leftt;

return;

}

/* Наборы для проверки:

* Ключ одинарной длины, открытый текст одинарной длины

* Ключ 0123 4567 89ab cdef

* открытый текст 0123 4567 89ab cde7

* шифротекст c957 4425 6a5e d31d

****************************************************************************************/

void des_key(des_ctx *dc, unsigned char *key){

deskey(key, EN0);

cpkey (dc -> ek);

deskey(key, DE1);

cpkey (dc ->dk);

}

/* Шифрование нескольких блоков в режиме ECB. За короткие блоки отвечает вызывающая функция. */

void des_enc(des_ctx *dc, unsigned char *data, int blocks){

unsigned long work[2];

int i;

unsigned char *cp;

cp = data;

for (i =0; i <blocks; i ++) {

scrunch(cp, work);

desfunc(work, dc ->ek);

unscrun(work, cp);

cp+=8;

}

}

void des_dec(des_ctx *dc, unsigned char *data, int blocks){

unsigned long work[2];

int i;

unsigned char *cp;

cp = data;

for (i=O; i <blocks; i ++) {

scrunch(cp, work);

desfunc(work, dc ->dk);

unscrun(work, cp);

cp+=8

}

}

void main (void) {

des_ctx dc;

int i;

unsigned long data[10];

char *cp,key[8] = {OxO1,Ox23,Ox45,Ox67,Ox89,Oxab,Oxcd,Oxef};

char x[8] = {OxO1,Ox23,Ox45,Ox67,Ox89,Oxab,Oxcd,Oxe7};

cp = x;

des_key(&dc, key);

des_enc(&dc, cp, 1);

printf(" Enc(0..7, 0..7)=");

for(i=0;i<8;i++) printf("%02x ((unsigned int) cp[i])&OxOOff);

printf("\n");

des_dec(&dc, cp, 1);

printf("Dec(above,0..7) = ");

for(i=0;i<8;i++) printf("%02x ((unsigned int) cp[i])&OxOOff);

printf("\n");

cp = (char *) data;

for(i=0; i <10; i++)data[i]=i;

des_enc(&dc,cp,5); /* Шифрование 5 блоков. */

for(i=0;i<10;i+=2) printf("Блок *Old = %081x %081x.\n",i/2, data[i], data[i+l])

des_dec(&dc, cp, 1)

des_dec(&dc, cp+8, 4);

for(i=0;i<10;i+=2) printf("Блок *Old = %081x %081x.\n",i/2, data[i], data[i+l])

}

LOKI91

#include <stdio.h>

#deflne LOKIBLK 8 /* Количество байтов в блоке LOKI */

#deflne ROUNDS 16 /* Количество этапов LOKI */

typedef unsigned long Long; /* определение типов для выровненных блоков LOKI */

extern Long lokikey[2]; /* 64-битовый ключ, используемый в процедурах LOKI */

extern char *loki_lib_ver; /* Строка с номером версии copyright *

#ifdef _STDC_ /* объявление прототипов библиотечных функций *

extern void enloki(char *b);

extern void deloki(char *b);

extern void setloklkeytchar key[LOKiBLK]);

#else /* если объявляются только внешние функции */

extern void enloki(), deloki(), setlokikey();

#endif _STDC_

char P[32] = {

31, 23, 15, 7, 30, 22, 14, 6,

29, 21, 13, 5, 28, 20, 12, 4,

27, 19, 11, 3, 26, 18, 10, 2,

25, 17, 9, 1, 24, 16, 8, 0

};

typedef struct {

short gen; /* неприводимый многочлен, используемый в этом поле */

short exp; /* показатель степени, используемый для генерации этой функции s */

} sfn_desc;

sfn_desc sfn[] = {

{ /* lO111O111 */ 375, 31}, { /* 101111O11 */ 379, 31},

{ /* 11OOOO111 */ 391, 31}, { /* 11OOO1O11 */ 395, 31},

{ /* 11OOO11O1 */ 397, 31}, { /* llOO11111 */ 415, 31},

{ /* llO1DOO11 */ 419, 31}, { /* llO1O1OO1 */ 425, 31},

{ /*11O11OOO1 */ 433, 31}, { /* llO1111O1 */ 445, 31},

{ /* 111000011 */ 451, 31}, { /* 111001111 */ 463, 31},

{ /* 111O1O111 */ 471, 31}, { /*111011101 */ 477, 31},

{ /* 1111OO111 */ 487, 31}, { /* 11111OO11 */ 499, 31},

{ 00, 00) };

typedef struct {

Long loki_subkeys[ROUNDS];

} loki_ctx;

static Long f(); /* объявление функции LOKI f */

static short s(); /* объявление функции LOKI s */

#deflne ROL12(b) b = ((b << 12) | (b >> 20));

#deflne ROL13(b) b = ((b << 13) | (b >> 19));

#ifdef LITTLE_ENDIAN

#define bswap(cb) { \

register char c; \

c = cb[0]; cbLO] = cb[3]; cb[3] = c; \

c = cbLi]; cb[l] = cb[2]; cb[2] = c; \

c = cb[4]; cb[4] = cb[7]; cb[7] = c; \

c = cb[5]; cb[5] = cb[6]; cb[6] = c; \

}

#endif

void

setlokikey(lokl_ctx *c, char *key)

{

register i;

register Long KL, KR;

#ifdef Lml-E*NDiAN

bswapfke.)'); /* swap bytes round if little-endlan */

rfend i f

KL = ((Long *)key)[0];

KR = ((Long *)ke*l:l;

for (|=0; K*ROUNDS; l+=4) i /* Generate the 16 subkeys */

c->lokl_sl<bke*s[l] = KL;

ROLi2 (KL);

c->lokl_subke*s[*l+l] = KL;

ROLi3 (KL);

c->lokl_subke*sl*l+2] = KR;

ROLi2 (KR);

c->lokl_sljbke*s[*l+3] = KR;

ROLi3 (KR);

#lfdef LiTTLE-ENDiAN

bswap(ke*); /* swap b*tes back if little-endlan */

f*/e nd i f

v o i d

enlokl (lokl_ct.x *c, char *b)

register };

register Long L, R; /* left & right data halves */

#lfdet LiTTLE-ENDiAN

bswaptb); /* swap bytes round if little-endlan */

#end i f

L = ((Long *)b)l*0];

R = (fLong *)b)l*l];

for (*O; l<ROUNDS; l+=2) i /* Encrypt with the 16 subkeys */

L "= f (R, c)loklsllbkeysl'l]);

R *= f (L, c->lokl_subke*sl*l+l]);

(tLong *)b)l*0] = R; /* Y = smaptLR) */

(fLong *)b)!_l-1 * L;

rflfdef LiTTLEENDiAN

bslb*ap(b); /* swap b*tes round if little-endlan */

#e nd i f

v o i d

delokl(lokl_ctx *c, char *b)

register };

register Long L, R; /* left & right data halves */

rflfdef LiTTLE-ENDiAN

bsmapCb); it gmap bytes round if llttleendlan */

#end i f

L = (fLong *)b)[0]; /* LR = X XOR K */

R = ((Long *) b) !_ i ]

for (*ROUNDS; l>0; 1-=2) i /* Subkeys in reverse order */

L "= ffR, c->lokl_subkeys[ll]);

R "= ftL, c->lokl_subkeys[l-2]);

((Long *)b)l*0] = R; /* Y = LR XOR k */

((Long *)b)[l] = L;

*define MASKi2 OxOfff /* 12 bit mask for expansion E */

static Long

ftr, k)

register Long r; /* Data value Rtl-l) */

Long k; /*Key Kfl) */

Long a, b, c; /* 32 bit S-b0x output, & P output */

a - r k; /* A = Rt i - i) XOR Kt i) */

/* mant to use slow speed/small size version */

b * ((Long) s ((a & MASKi2))) i /* B = S (E (Rt i i)) *Kt i)) */

((Long)s(((a >> 8) & MASKi2)) << 8) 1

((Long)s(((a >> 16) & MASKi2)) << 16) 1

((Long)s((((a >> 24) 1 (a << 8)) & MASKi2)) << 24);

perm32t&c, &b, P); /* C = Pest EtRtl-l)) XOR Km)) */

returnee); /* f returns the result C */

static short stl)

register Long }; /* return S-b0x value for input i */

register short r, c, v, t;

short expel); /* exponentiation routine for GF*8) */

r = ((l>>8) & axe) i (i & Ox3); /* row value top 2 & bottom 2 */

c = (l>>2) & Oxff; /* column value-middle 8 bits */

t = (c + ((r * 17) Oxff)) & Oxff; /* base value for Sfn */

v = expBtt, sfnlr*exp, sfnl*r].gen); /* Sfn[r] = t ^ exp mod gen */

r et u r n (v);

*define MSB OxBOOOOOOOL /* MSB of 32-bit mord */

perm321out, in perm)

Long *out; /* Output 32-bit block to be permuted */


Long *ln; /* input 32blt block after permutation */

char permf'*j; /* Permutation array */

Long mask = MSB; /* mask used to set bit in output */

register int *, o, b; /* input bit no, output bit no, value */

register char *p = perm; /* ptr to permutation array */

*out = 0; /* clear output block */

for (o=0; 002; o++)! /* For each output bit position o */

i =(int)*p++; /* get input bit permuted to output o *

b * (*in ** i) & 01; /* value of input bit i */

if (b) /* if the input bit i is set */

*out j= mask; /* OR in mask to output i */

mask)*= }; /* Shift mask to next bit */


*define SjZE 256 /* 256 elements in GF*S) */

short multSfa, b, gen)

short a, b; /* operands for multipin */

short gen; /* irreducible polynomial generating Galois Field */

short product = 0; /* result of multiplication */

wh i i e (b! = 0) j / * wh i i e mu i t i p i i e r i s n on ze ro * /

if (b & 01)

product *= a; /* add multiplicand if LSB of b set

a <<= }; /* shift multiplicand one place */

if (a >= SjZE)

a *= gen; /* and modulo reduce if needed */

b)>= }; /* shift multiplier one place */

re t u r n (p r od u c t);

short expSfbase, exponent, gen)

short base; /* base of exponentiation */

short exponent; /* exponent */

short gen; /* irreducible polynomial generating Calais Field */

short accum = base; /* supenncreaslng sequence of base */

short result = }; /* result of exponentiation */

if (base " 0) /* if zero base specified then */

returnfO); /* the result is "0" if base = 0 */

№hlle (exponent j* 0)! /* repeat while exponent nonzero */

if ((exponent & OxOOOi) == OxCOOi) /* multiply if exp i *

result = multSfresult, accum, gen);

exponent >>= }; /* shift exponent to next digit */

accum = nlult8(accum, accum, gen); /* & square */

ret u rn (res u i t);

void loki_key(loki_ctx *c, unsigned char *key)(

s et i o k i key (c, key);

void loki_enc(loki_ctx *c, unsigned char *data, int blocks)!

unsigned char *cp;

int i;

cp = d a t a;

fo r (i =0; i < b i oc ks; i ++) (

en i o k i (c, cp);

c p+=8;

void lokl_dec(lokl_ctx *c, unsigned char *data, int blocks)!

unsigned char *cp;

int i;

c p = d a t a;

for (i *O; i <bl ocks; i++)!

de i 0 k i (c, c p);

c p+*8;

vo i d nla i n (v o i d)!

loki_ctx lc;

unsigned long data[10];

unsigned char *cp;

u n s i g n ed c h a r key [ ] =! 0, i, 2, 3, 4, 5, 6, 7!;

int i;

for(|=0;l<10;i++) data[i]=};

i 0 k i _key (& i c, key);

c p = (c h a r *) d a t a;

i o k i _en c (& i c, c p, 5);

for(i=0;i<10;i+=2) printFC'Block XOld = %081x %081x\n",

i /2, data [ i j, data). i +l ]);

i 0 k i _d ec (& i c, cp, i);

i oki-dec (&l c, cp+8, 4);

for(i**0;i<10;i+=2) printfCBlock XOld = *081x XO81x\n",

i /2, data [ i ], data [ i+l ] j;

mEA

typedef unsigned char boolean; /* values are TRUE or FALSE */

typedet unsigned char byte; /* values are 0255 */

typedef byte *byteptr; /* pointer to byte */


typedef char *stnng;/* pointer to ASCtf character string */

typedef unsigned short wordlg; /* values are 0-65535 */

typedef unsigned long mord32; /* values are 04294967295 */

#lfndef TRUE

#deflne FALSE 0

*define TRUE (iFALSE)

#endlf /* if TRUE not already defined */

#lfndef min /* if min macro not already defined */

*define n<ln(a,b) ((a)<(b)? (a): (b))

#deflne nlax(a,b) ((aWb)? (a): (b))

#endlf /* if min macro not already defined */

*define iDEAKEYSiZE 16

*define jDEABLOCKSiZE 8

*define iDEAROUNDS 8

*define iDEAKEYLEN (6*jDEAROUNDS+4)

typedef struct!

wordle ek[iDEAKEYLEN:!,dk[tDEAKEYLEN];

}ldea__ctx;

/* End includes for iDEA-C */

#lfdef iDEA32 /* Use >16blt temporaries */

*define lo№16(x) ((x) & OxFFFF)

typedef unsigned int uintl6;/* at LEAST 16 bits, maybe more */

#e i s e

*define lo№16(x) (x) /* this is only ever applied to ninth's */

typedef wordle uintl6;

#e n d i f

#ifdef SMALL_CACHE

static uintl6

muKregister (jintl6 a, register uintl6 b)

register kord32 p;

p = (word32)a * b;

if (p) f

b = i ow i 6 (p);

a = p> > i 6;

r et u r n (b a) + (b < a);

! else if (a)!

return l-b;

) e i s e (

return i a;

i /* mul */

#endif /* SMALL-CACHE */

static uintl6

nlu i 2 n v (u int i 6 x)

uintl6 to, tl;

uintl6 q, y;

if (x <= i)

return x; /* 0 and i are self inverse */

tl = OxlOOOiL / x; /* Since x >= 2, this fits into 16 bits */

y = OxlOOOiL? x;

if (y == i)

return lomi6Mtl);

to = };

do!

q = x / y;

x = x X y;

to +* q * tl;

if (x == i)

return to;

q = y / x!

y = y X x;

tl += q * to;

) while (y i= i);

return lowl6M-tl);

) /* muklnv */

static void

ldeaExpandKeyfbyte canst *userkey, mordl6 *Ek)

i nl. i, j;

for (j=0; jO; j++) {

EKi-jj = (userkey[0]<<8) + userkey[l];

userkey += 2;

for (i=0; j < iDEAKEYLEN; j++) {

l++;

EK[l+7] = EK[l & 7] << 9 * EK!_l+l & 7] >> 7;

EK += i & 8;

i &= 7;

) /* ldeaExpandkey */

static void

idealnvertKeytwordl6 canst *EK, mordle DK[iDEAKEYLEN_i)

int i;

uintle tl, t2, t3;

wordle temp[iDEAKEYLEN];

mordle *p = temp + iDEAKEYLEN;

t i = mul: nv (*EK++);

t2 * *EK++;

t3 = *EK++;

* p = mu i S nv (* EK++);

* p = t3;

* p = t 2;


*p=tl;

for(|=0;l<iDEAROUNDS};l++)!

t|=*EK++;

*p=*EK++;

*p=tl;

t|=mullnv*EK++);

t2=*EK++;

t3= *EK++;

*p=mjijnv(*EK++);

p=t2;

p=t3;

*p=tl;

t|=*EK++;

*p=*EK++;

*p=tl;

t|=mullnv*EK++);

t2= *EK++;

t3= *EK++;

*p=mj*nv(*EK++);

*p=t3;

p=t2;

*p=tl;

/* Copy and destroy temp copy */

rrtemcpytDK, temp, slzeoftternp));

for (i =0; i <? DEAKEYLEN; i ++) temp* i ]=0;

) /*ldea?nvertKey*/

#lfdef SMALL_CACHE

**define MUL(x,y) (x* mul(lowl6(x),y))

№?lse/*!SMALLCACHE*/

#lfdef AVO?D_jUMPS

№jeflneMUL(x,y) (x=lowl6(x i), tl6=lowl6((y) i), \

t32=(word32)x*tl6+x+tl6+l,x=lowl6(t32), \

tl6=t32>>16,x=(xtl6)+(x<tl6))

#*se/*!AVO:D_jUMPS (default) */

;*deflneMUL(x,y)\

((tl6=(y))?\

(x=lowl6*))? \

t32=(word32)x*tl6, \

x= lowl6(t32),\

tl6=t32*16, \

x=(xtl6)+(x<tl6) \

(x=l tl6) \

(x*lx))

**endlf

**endlf

static void

ideaClphertbyte *lnbuf, byte *outbl<f, wordl6 *key)

register uintl6 xl, x2.x3, x4.s2, s3;

№]rdl6*ln,*out;

#lfndef SMALL_CACHE

register uintl6 tl6; /* Temporaries needed by MUL macro */

register mord32 t32;

#**f

intr=iDEAROUNDS;

ln=(wordl6*)lnbuf;

j(l**ln++; x2=*ln++;

x3**ln++; x4=*m;

**lfndefH?GHF:RST

xl*(xl>>8)) (xl*S);

x2*tx2*8) i (x2<<8);

x3*(x3>>8) j (x3*8);

x4*(x4>>8) j (x4*8);

#m*f

do j

MUL(xl,*key++);

x2+=*key++;

x3+=*key++;

MUL(x4, *key++);

s3*x3;

x3**xl;

MUL(x3, *key++);

s2=x2;

x2*=x4;

x2+*x3;

MULfx2, *key++);

x3+*x2;

xl*=x2; x4*-x3;

x2=s3; x3*=s2;

i while (r);

MU*xl, *key++);

x3+=*key++;

x2+**key++;

MUL(x4,*key);

out=(wordl6*)outbuf;

4*lfdefH:GHF?RST

*out++*xl;

*out++=x3;

*out++*x2;

*out-x4;

№*lse/*!H?GHF?RST*/

*out++*(xl>>8) j (xl<<8);

*out++*(x3>>8) j (x3<<8);

*out++=(x2 >>8) * (x2<<8);

*out=(x4>>8)) (x4*8);


**endlf

) /* ideaClpher*/

void ideakey*deactx *c, unsigned char *key)f

ldeaExpandKey(key,c>ek);

i d ea i n v e r t Key (c - >e k, c >d k);

voldldeaenc(ldea_etx*c, unsigned char *data, int blocks)!

intl;

unsigned char *d * data;

for (l*O; i <bl ocks; l++) j

ldeaClpher(d,d,c)ek);

d+*8;

voldldeadec(ldea_ctx*c, unsigned char *data, int blocks)!

intl;

unsigned char *d * data;

forM*0;l<blocks;i++){

ldeaClpher(d,d,c>dk);

d+*8;

**include <stdio.h>

#lfndef BLOCKS

?*lfndef KBYTES

*Mefine KBYTES 1024

**endlT

**define BLOCKS (64*KBYTES)

#m*T

int

rmintvold)

i /*Test driver for jDEA cipher */

intl, j, k;

ldeactxc;

by* userkey[16];

mordle EK[?DEAKEYLEN_f, DK[?DEAKEYLEN];

byteXX[8], YY*l, ZZ[8];

word32 longblock[10]; /* 5 blocks */

iong};

char*lbp;

/* Make a sample user key for testing... */

for(l*0;l<16;l++)

userkey*jj*l+l;

ldeakey(&c,userkey);

/* Make a sample plaintext pattern for testing... */

for**O; US; k++j

XX[k]=k;

ldeaenc(&c,XX,l);/*encrypt*/

lbp = (unsigned char *) long*lock;

for(l*0;l<10;l++) long_block[l] = };

ldeaenc(&c,lbp,5);

for(|=0;l<10;l+=2) printf("Block XOld = MSjx?OSlx.\n",

i / 2, i ong_bl ock[ i ], i ong-bl oc k [ i +l ]);

ldeadec(&c,lbp,3);

ldea_dec (&c, i bp+24, 2);

for(l*0;l<10;l+*2)printfC'BlockM)ld=M)Slx%081x.\n",

i /2, i ong_bl ock[ i ], i ong_bl ocki: l+l ]);

return 0; /* normal exit */

)/*nlaln*/

cost

typedef unsigned long u4;

typedef unsigned char byte;

typedef struct {

u4k[8];

/* Constant s b0xes setuplngostlmt().*/

char k87[256],k65[256],k43[256],k21[256];

tgost*tx;

/*Note: encrypt ard decrypt expect full blocks padding blocks is

caller's responsibility. An bulk encryption is done in

eCBnlode by these calls. Other modes may be added easily

enough. */

voldgostenc(gost_ctx*, u4*, int);

voldgostdec(gost_ctx*, u4*, int);

voldgost_key(gostctx*, u4*);

voldgostlnlt(gostctx*);

void gost_destroy(gost_ctx *);

#lfdef -alpha /* Any other 64blt machines? */

typedef unsigned int word32;

#*se

typedef unsigned long mord32;

#endl f

kb0xlnlt(gostctx*c)

intl;

bytek8[16]*il4, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6,

12, 5, 9, 0, 7)!

bytek7[16]*tl5, i, 8, 14, 6, 11, 3, 4 9, 7, 2,


13, 12, 0, 5, 10);

bytek6[16] =flO, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12,

7, 11, 4, 2, 8);

bytek5[16]=f 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8,

5, 11, 12, 4, 15);

bytek4[16j=! 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3,

15, 13, 0, 14, 9);

bytek3[16]=!12, i, 10, 15, 9, 2, 6, 8, 0, 13, 3,

4, 14, 7, 5, 11 t!

by* k2[16]= f4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9,

7, 5, 10, 6, 1 t;

by* kl[16]= fl3, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3,

14, 5, 0, 12, 7 };

for(|=0; i (256; l++) {

c>k87[l?= №[1 >>4]<<4 j k7[l&15];

c>k65[l!= k6[l >>4]<<4 j k5[l&15];

c>k43[l]= k4[l >>4]<<4) k3[l &15];

c*k2*lj= k2[l *>4]<<4) kl[l &15];

static word32

f(gostctx*c,word32x)

x=c>k87[x*24&255]<<24jc>k65[x>*16&255]<<16j

(->k43[x>>8&255]<< 8jc>k21[x&255];

/* Rotate left 11 bits */

return x*ll) x>>(3211);

void gostcrypt(gost_ctx *c, word32 *d)!

register mord32 nl, n2; /* As named in the GOST */

n|=d[0];

n2=d[l];

/* instead of swapping halves, swap names each round */

n2 "= f**l+c >k[0]); nl*=f(c,n2+o>k[l]);

n2 "= f(c,nl+c>k[2]); nl*=f(c,n2+c>k[3]);

n2*=f(c,nl+o>k[4]); nl"=f(c,n2+c>k[5]);

n2*=f(c,nl+c>k[6j); nl"=f(c,n2+c>k[7]);

n2*=f(c,nl+Ok[0]); n|=l(c,n2+c>k[l]);

n2"=f(c,nl+c>k[2]);nl*=f(c,n2+c>k[3]);

n2"=f(c,nl+c>k[4])! nl*=f(c,n2+c>k[5]);

n2*=f(c,nl+c>k[6]); nl"=f(c,n2+c>k[7]);

n2*=f(o,nl+c>k[0]);nl"=f(c,n2+c>k[l]);

n2*=f(c,nl+c>k[2]);nl*=f(c,n2+c>k[3]);

n2*=f(c,nl+Ok[4]);nl"=f(c,n2+o>k[5]);

n2"=f(c,nl+c>k[6]);nl*=f(c,n2+Ok[7]);

n2*=f(c,nl+c)k[7]); nl*=f(c,n2+c>k[6]);

n2"*f(c,nl+c>k[5]); nl*=f(c,n2+c>k[4]);

"2"=f(C,"l+Ok[3]);nl*=f(c,n2+c>k[2]);

"2*=f(C,nl+c>k[l]);nl*=f(c,n2+c>k[0]);

d[0]=n2;d[l]=nl;

vol d

gostdecrypt(gost_ctx *c, u4 *d)(

register mord32 nl, n2; /* As named in the GOST */.

n|=d[0];n2=d[l];

n2*=f(c,nl+c>k[0]);nl*=f(c,n2+c>k[l]);

n2*=f(c,nl+c>k[2]);nl*=f(c,n2+c>k[3]);

n2*=f(c,nl+c>k[4]);nl"=f(c,n2+c>k[5]);

n2"=f(c,nl+c>k[6]);nl"=f(c,n2+c>k[7]);

n2"=f(c,nl+c>k[7]);nl"=f(c,n2+c>k[6]);

n2"=f(c,nl+c>k[5]);nl"=f(c,n2+c>k[4]);

n2*=f(c,nl+c>k[3]);nl*=f(c,n2+c>k[2]);

n2*=f(c,nl+c>k[l]);nl"=f(c,n2+c>k[0]);

n2*=f(c,nl+c>k[7]);nl*=f(c,n2+c>k[6]);

n2*=f(o,nl+c)k[5]);nl"=f(c,n2+c>k[4]);

n2*=f(c,nl+c>k[3]);nl*=f(c,n2+o>k[2]);

n2"=f(c,nl+c>k[l]);nl*=f(c,n2+c)k[0]);

n2*=f(c,nl+c>k[7]);nl*=f(c,n2+c>k[6]);

n2"=f(c,nl+c>k[5]);nl*=f(c,n2+c>k[4]);

n2*=f(c,nl+o>k[3]);nl"=f(c,n2+c>k[2]);

n2*=f(c,nl+c>k[l]);nl*=f(o,n2+o>k[0]);

d[0]=n2;d[l]=nl;

void gost_eno(gost_ctx *c, u4 *d, int blocks)!

intl;

for (i =0; i (bl ocks; l++) {

gostcryp**d);

d+=2;

void gost_deo(gost_ctx *c, u4 *d, int blocks)j

intl;

fort i =0; i <bl ocks; i ++) f

go s tdec rypt (c, d);

d+=2;

voldgostkey(gost_ctx*c, u4 *k)!

intl;

for(|=0;l<8;l++) c>k[l]=k[l];


void gostinit(gost_ctx *c){

kb0x i n i t (c);

void gostdestroy(gost_ctx *c){

int i;

for(i=0;i<8;i++) c>k[i]=0;

v 0 i d ma i n (v o i d) {

gostctx gc;

u4 k[8],data[10];

int i;

/* initialize GOST context. */

go s ti n i t (&g c);

/* Prepare key--a simple key should be OK, with this many rounds! */

for (|=0; i <8; i ++) k[ i ] = i;

go s tkey (&gc, k);

/* Try some test vectors. */

data[0] = 0; data[l] = 0;

g 0 s t c ry pt (&gc, d a t a);

printf("Enc of zero vector: %081x %081x\n",data[0],data[l]);

gos tc rypt (&g c, d a t a);

printf("Enc of above: %081x %081x\n",data[0],data[l]);

data[0] = Oxffffffff; data[l] = Oxffffffff;

g OS t c rypt (&g c, d a ta);

printf("Enc of ones vector: %081x %081x\n",data[0],data[l]);

go s tc rypt (&gc, d a t a);

printf("Enc of above: %081x %081x\n",data[0],data[l]);

/* Does gost_dec() propeny reverse gost_enc()? Do

we deal OK with single-block lengths passed in gost_dec()?

Do we deal OK with different lengths passed in? */

/* lnit data */

for(i=0;i<10;i++) data[i]=};

/* Encrypt data as 5 blocks. */

go s t_e nc (&gc, d a t a, 5);

/* Display encrypted data. */

for(i=0;i<10;i+=2) printf("Block %02d = %081x %081x\n",

i /2, data [ i ], data [ i +l ]);

/* Decrypt in different sized chunks. */

go s td ec (&g c, d a t a, i);

gostdec (&gc, da ta+2, 4);

printf(" \n ");

/* Display decrypted data. */

fOr(i=0;i<10;i+=2) printf("Block %02d = %081x %081x\n",

i /2, data [i ], data [ i +l ]);

gost_dest roy (&gc);

BLOWFiSH

**include <math.h>

*include <stdio.h>

*include <stdlib.h>

**include <time.h>

#ifdef little_endian /* Eg: intel */

#i n c i ud e < a i i a c. h >

#en d i f

#include <ctype.h>

#ifdef iittle_endian /* Eg: intel */

#include <dir.h>

#include <bios.h>

#en d i f

#ifdef bigendian

#include <Types.h>

#en d i f

typedef struct {

unsigned long S[4][256],P[18];

i blf_ctx;

#define MAXKEYBYTES 56 /* 448 bits */

// #define littleendian i /* Eg: intel */

#define bigendian i /* Eg: Motorola */

void Blowfish_encipher(blfctx *.unsigned long *xl, unsigned long *xr);

void Blowfishdecipher(blfctx *.unsigned long *xl, unsigned long *xr);

*define N 16

#define noErr 0

#define DATAERROR - {

#define KEYBYTES 8

FiLE* SubkeyFile;

unsigned long F(blfctx *bc, unsigned long x)

unsigned short a;





Дата публикования: 2015-11-01; Прочитано: 451 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.102 с)...