Основы криптографии

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



(b, sdisk_des_keys[slot].e,DES_ENCRYPT);

des_encrypt(b, sdisk_des_keys[slot].d,DES_DECRYPT);

des_encrypt(b, sdisk_des_keys[slot].e2,DES_ENCRYPT);

}

desdecipher(unsigned long *b, int slot)

{

des_encrypt(b, sdisk_des_keys[slot].e,DES_DECRYPT);

}

threedesdecipher(unsigned long *b, int slot)

{

des_encrypt(b, sdisk_des_keys[slot].e2,DES_DECRYPT);

des_encrypt(b, sdisk_des_keys[slot].d,DES_ENCRYPT);

des_encrypt(b, sdisk_des_keys[slot].e,DES_DECRYPT);

}

desinitialise(char *key,int slot)

{_key_sched(key,sdisk_des_keys[slot].e);

}

threedesinitialise(char *key,int slot)

{*key2=key+8;*key3=key2+8;_key_sched(key,sdisk_des_keys[slot].e);_key_sched(key2,sdisk_des_keys[slot].d);_key_sched(key3,sdisk_des_keys[slot].e2);

}

//;1F08260D1AC2465E 6B056E18759F5CCA EF1BF03E5DFA575A

main (void) //test code

{

//char keytable[16*8];char key[]=

{

0x1f,0x08,0x26,0x0d,0x1a,0xc2,0x46,0x5e

};

char key3[]=

{

0x1f,0x08,0x26,0x0d,0x1a,0xc2,0x46,0x5e,

0x44,0x28,0x1d,0x6b,0x61,0x11,0x52,0x47,

0x12,0x41,0x34,0x26,0x1d,0x3e,0xf4,0x45

};

char cipher[]=

{

0xef,0x1b,0xf0,0x3e,0x5d,0xfa,0x57,0x5a //cipher text...

};

//void Eblock(unsigned int mode,unsigned int *kp,unsigned int *bl)

//des_key_sched((unsigned char *) &key,keytable);

//des_encrypt((unsigned int *) cipher,keytable,0);

//des_encrypt((unsigned int *) cipher,keytable,1);

desinitialise(key,0);

desdecipher((unsigned long *) cipher,0);

desencipher((unsigned long *) cipher,0);

threedesinitialise(key3,0);

threedesdecipher((unsigned long *) cipher,0);

threedesencipher((unsigned long *) cipher,0);

cout<< Enter key;

}

GOST

/*

* The GOST 28147-89 cipher

*

* This is based on the 25 Movember 1993 draft translation

* by Aleksandr Malchik, with Whitfield Diffie, of the Government

* Standard of the U.S.S.R. GOST 28149-89, "Cryptographic Transformation

* Algorithm", effective 1 July 1990. (Whitfield.Diffie@eng.sun.com)

*

* That is a draft, and may contain errors, which will be faithfully

* reflected here, along with possible exciting new bugs.

*

* Some details have been cleared up by the paper "Soviet Encryption

* Algorithm" by Josef Pieprzyk and Leonid Tombak of the University

* of Wollongong, New South Wales. (josef/leo@cs.adfa.oz.au)

*

* The standard is written by A. Zabotin (project leader), G.P. Glazkov,

* and V.B. Isaeva. It was accepted and introduced into use by the

* action of the State Standards Committee of the USSR on 2 June 89 as

* No. 1409. It was to be reviewed in 1993, but whether anyone wishes

* to take on this obligation from the USSR is questionable.

*

* This code is placed in the public domain.

*/

/*

* If you read the standard, it belabors the point of copying corresponding

* bits from point A to point B quite a bit. It helps to understand that

* the standard is uniformly little-endian, although it numbers bits from

* 1 rather than 0, so bit n has value 2^(n-1). The least significant bit

* of the 32-bit words that are manipulated in the algorithm is the first,

* lowest-numbered, in the bit string.

*/

/* A 32-bit data type */

#ifdef __alpha /* Any other 64-bit machines? */unsigned int word32;

#elseunsigned long word32;

#endif

/*

* The standard does not specify the contents of the 8 4 bit->4 bit

* substitution boxes, saying they're a parameter of the network

* being set up. For illustration purposes here, I have used

* the first rows of the 8 S-boxes from the DES. (Note that the

* DES S-boxes are numbered starting from 1 at the msb. In keeping

* with the rest of the GOST, I have used little-endian numbering.

* Thus, k8 is S-box 1.

*

* Obviously, a careful look at the cryptographic properties of the cipher

* must be undertaken before "production" substitution boxes are defined.

*

* The standard also does not specify a standard bit-string representation

* for the contents of these blocks.

*/unsigned char const k8[16] = {

14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 }; unsigned char const k7[16] = {

15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 };unsigned char const k6[16] = {

10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 };unsigned char const k5[16] = {

7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 };unsigned char const k4[16] = {

2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 };unsigned char const k3[16] = {

12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 };unsigned char const k2[16] = {

4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 };unsigned char const k1[16] = {

13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 };

/* Byte-at-a-time substitution boxes */unsigned char k87[256];unsigned char k65[256];unsigned char k43[256];unsigned char k21[256];

/*

* Build byte-at-a-time subtitution tables.

* This must be called once for global setup.

*/(void)

{

int i;

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

k87[i] = k8[i >> 4] << 4 | k7[i & 15];

k65[i] = k6[i >> 4] << 4 | k5[i & 15];

k43[i] = k4[i >> 4] << 4 | k3[i & 15];

k21[i] = k2[i >> 4] << 4 | k1[i & 15];

}

}

/*

* Do the substitution and rotation that are the core of the operation,

* like the expansion, substitution and permutation of the DES.

* It would be possible to perform DES-like optimisations and store

* the table entries as 32-bit words, already rotated, but the

* efficiency gain is questionable.

*

* This should be inlined for maximum speed

*/

#if __GNUC__

__inline__

#endifword32(word32 x)

{

/* Do substitutions */

#if 0

/* This is annoyingly slow */

x = k8[x>>28 & 15] 24 & 15] << 24 |

k6[x>>20 & 15] 16 & 15] << 16 |

k4[x>>12 & 15] 8 & 15] << 8 |

k2[x>> 4 & 15] << 4 | k1[x & 15];

#else

/* This is faster */

x = k87[x>>24 & 255] 16 & 255] << 16 |

k43[x>> 8 & 255] << 8 | k21[x & 255];

#endif

/* Rotate left 11 bits */

return x(32-11);

}

/*

* The GOST standard defines the input in terms of bits 1..64, with

* bit 1 being the lsb of in[0] and bit 64 being the msb of in[1].

*

* The keys are defined similarly, with bit 256 being the msb of key[7].

*/(word32 const in[2], word32 out[2], word32 const key[8])

{

register word32 n1, n2; /* As named in the GOST */

n1 = in[0];

n2 = in[1];

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

n2 ^= f(n1+key[0]);

n1 ^= f(n2+key[1]);

n2 ^= f(n1+key[2]);

n1 ^= f(n2+key[3]);

n2 ^= f(n1+key[4]);

n1 ^= f(n2+key[5]);

n2 ^= f(n1+key[6]);

n1 ^= f(n2+key[7]);

n2 ^= f(n1+key[0]);

n1 ^= f(n2+key[1]);

n2 ^= f(n1+key[2]);

n1 ^= f(n2+key[3]);

n2 ^= f(n1+key[4]);

n1 ^= f(n2+key[5]);

n2 ^= f(n1+key[6]);

n1 ^= f(n2+key[7]);

n2 ^= f(n1+key[0]);

n1 ^= f(n2+key[1]);

n2 ^= f(n1+key[2]);

n1 ^= f(n2+key[3]);

n2 ^= f(n1+key[4]);

n1 ^= f(n2+key[5]);

n2 ^= f(n1+key[6]);

n1 ^= f(n2+key[7]);

n2 ^= f(n1+key[7]);

n1 ^= f(n2+key[6]);

n2 ^= f(n1+key[5]);

n1 ^= f(n2+key[4]);

n2 ^= f(n1+key[3]);

n1 ^= f(n2+key[2]);

n2 ^= f(n1+key[1]);

n1 ^= f(n2+key[0]);

/* There is no swap after the last round */

out[0] = n2;

out[1] = n1;

}

/*

* The key schedule is somewhat different for decryption.

* (The key table is used once forward and three times backward.)

* You could define an expanded key, or just write the code twice,

* as done here.

*/(word32 const in[2], word32 out[2], word32 const key[8])

{

register word32 n1, n2; /* As named in the GOST */

n1 = in[0];

n2 = in[1];

n2 ^= f(n1+key[0]);

n1 ^= f(n2+key[1]);

n2 ^= f(n1+key[2]);

n1 ^= f(n2+key[3]);

n2 ^= f(n1+key[4]);

n1 ^= f(n2+key[5]);

n2 ^= f(n1+key[6]);

n1 ^= f(n2+key[7]);

n2