[Archivе] [Archivе]
CyberGods_Alice 16 сен 2015
месса
алгоритм шифрования месса на си
#include <stdlib.h>
#include <string.h>
typedef unsigned long u32;
typedef unsigned char u8;
typedef signed long s32;
#include "sbox.h"
u32 state[64];
#define ROL(x,r) _lrotl(x,r)
#define ROR(x,r) _lrotr(x,r)
#define MAGIC 0xDEADBEEF
#define XORCONST 0xFEDABABA
#define ONEWAY(x) ((x)+ (((x)<< 6 ) ^ ((x) >> 9)))
#define BYTE(x, i) (((x) >> (i * 8)) & 0xff)
#define NOTNULL(x) (((x) % 0xFFFFFFFE) + 1)
#define MIXSTAGES 10
u32
subst (u32 x, u32 r)
{
x =
ROL (k87[x >> 24 & 255] << 24 | k65[x >> 16 & 255] << 16 |
k43[x >> 8 & 255] << 8 | k21[x & 255], r);
return x;
}
#define SUBST(x) subst((x), 11)
#define SUBSTA(x,r) subst((x), (r))
#define REVERSY(x) (((x) << 16) | ((x) >> 16))
#define ONEWAYREV(x) (REVERSY(x)+ (((x)<< 6 ) ^ ((x) >> 9)))
#define PROTO(x) (ONEWAYREV(SUBST(x)))
#define SPROTO(x) (SUBST(ONEWAYREV(x)))
#define SWAP(a,b) c = a, a = b, b = c
#define MUTATE(k) for (x = 0; x!=16; x++) k[x] = SUBST(k[x])
#define HARDMUTATE(k) for (x = 0; x!=16; x++) k[x] = SPROTO(k[x])
u32 build(u32 ki, u32 *data)
{
u32 i, n, y, c;
for (y = 0; y!=64; y++)
{
c = 0;
for (i = 0; i!=16; i++)
{
for (n = 0; n!=4; n++)
{
state[c] = SUBST(ONEWAY(state[c]) + PROTO(keymat[ki % 8][BYTE(data[i], n)] + data[y % 16]) );
ki += ONEWAY(ki) + SUBST( XORCONST ^ (( ( PROTO(ki * (i + 1) ) + ((n + 1) * MAGIC))) + state [c] ) % NOTNULL(state [63 - c ]));
c++;
}
}
}
return PROTO(ki + ONEWAY(MAGIC + ONEWAYREV(data [SUBST(ki) % 16])) );
}
void mix (u32 *data)
{
u32 i;
for (i = 1; i!=64 * 16 + 1; i++)
{
state[i % 64] = SUBSTA (state[i % 64] + ROL( PROTO(state [(i - 1) % 64 ]) ^ PROTO(state [(i + 1) % 64 ]) ^ (data [i % 16]), 11),8);
}
}
void __stdcall __export setup (u32 *key)
{
u32 i, n, ki, x;
u32 data[16];
for (i = 0; i != 16; i++)
{
data[i] = key[i];
}
for (i = 0; i!=64; i++)
{
state [i] = i;
}
for (n = 0; n!=8; n++)
{
for (i = 0; i!=64; i++)
{
state [i] = SUBST (keymat [n][exmat[state[i] % 256]]);
}
}
ki = MAGIC;
for (i = 0; i!=MIXSTAGES; i++)
{
if (i != 0) MUTATE(data);
ki = build(ki, &data[0]);
if (i != MIXSTAGES - 1)
{
if (i != 0) MUTATE(data);
mix (&data[0]);
}
}
for (i = 0; i!=MIXSTAGES; i++)
{
HARDMUTATE(data);
mix (&data[0]);
HARDMUTATE(data);
ki = build(ki, &data[0]);
}
}
void __stdcall __export crypt (u32 *data)
{
u32 a, b, c;
s32 n, ki;
a = data[0];
b = data[1];
ki = 32;
for (n = 0; n!=31; n++)
{
b = ROL ( b ^ (ONEWAY(a) + state[n]), a % 32);
a ^= SUBST(ONEWAY(b) + state[n + 1]);
switch (n % 2)
{
case 1:
a = ROL (a + (ONEWAY(b) + state[b % 32]), b % 32);
b += SUBST(ONEWAY(a) + state[a % 32]);
break;
case 0:
a = ROL (a + (ONEWAY(b) + state[ki]), b % 32);
b += SUBST(ONEWAY(a) + state[ki + 1]);
ki += 2;
break;
}
SWAP (a, b);
}
data[0] = a;
data[1] = b;
}
void __stdcall __export decrypt (u32 *data)
{
u32 a, b, c;
s32 n, ki;
a = data[0];
b = data[1];
ki = 64;
for (n = 30; n!=-1 ; n--)
{
SWAP (a, b);
switch (n % 2)
{
case 1:
b -= SUBST(ONEWAY(a) + state[a % 32]);
a = ROR (a, b % 32) - (ONEWAY(b) + state[b % 32]);
break;
case 0:
ki -= 2;
b -= SUBST(ONEWAY(a) + state[ki + 1]);
a = ROR (a, b % 32) - (ONEWAY(b) + state[ki]);
break;
}
a ^= SUBST(ONEWAY(b) + state[n + 1]);
b = ROR(b, a %32) ^ (ONEWAY(a) + state[n]);
}
data[0] = a;
data[1] = b;
}
u32 __stdcall __export getblocksize ()
{
return 64;
}
u32 __stdcall __export getkeysize ()
{
return 512;
}
void __stdcall __export getciphername (unsigned char *p)
{
strcpy(p, "MESSA");
}
#include <stdlib.h>
#include <string.h>
typedef unsigned long u32;
typedef unsigned char u8;
typedef signed long s32;
#include "sbox.h"
u32 state[64];
#define ROL(x,r) _lrotl(x,r)
#define ROR(x,r) _lrotr(x,r)
#define MAGIC 0xDEADBEEF
#define XORCONST 0xFEDABABA
#define ONEWAY(x) ((x)+ (((x)<< 6 ) ^ ((x) >> 9)))
#define BYTE(x, i) (((x) >> (i * 8)) & 0xff)
#define NOTNULL(x) (((x) % 0xFFFFFFFE) + 1)
#define MIXSTAGES 10
u32
subst (u32 x, u32 r)
{
x =
ROL (k87[x >> 24 & 255] << 24 | k65[x >> 16 & 255] << 16 |
k43[x >> 8 & 255] << 8 | k21[x & 255], r);
return x;
}
#define SUBST(x) subst((x), 11)
#define SUBSTA(x,r) subst((x), (r))
#define REVERSY(x) (((x) << 16) | ((x) >> 16))
#define ONEWAYREV(x) (REVERSY(x)+ (((x)<< 6 ) ^ ((x) >> 9)))
#define PROTO(x) (ONEWAYREV(SUBST(x)))
#define SPROTO(x) (SUBST(ONEWAYREV(x)))
#define SWAP(a,b) c = a, a = b, b = c
#define MUTATE(k) for (x = 0; x!=16; x++) k[x] = SUBST(k[x])
#define HARDMUTATE(k) for (x = 0; x!=16; x++) k[x] = SPROTO(k[x])
u32 build(u32 ki, u32 *data)
{
u32 i, n, y, c;
for (y = 0; y!=64; y++)
{
c = 0;
for (i = 0; i!=16; i++)
{
for (n = 0; n!=4; n++)
{
state[c] = SUBST(ONEWAY(state[c]) + PROTO(keymat[ki % 8][BYTE(data[i], n)] + data[y % 16]) );
ki += ONEWAY(ki) + SUBST( XORCONST ^ (( ( PROTO(ki * (i + 1) ) + ((n + 1) * MAGIC))) + state [c] ) % NOTNULL(state [63 - c ]));
c++;
}
}
}
return PROTO(ki + ONEWAY(MAGIC + ONEWAYREV(data [SUBST(ki) % 16])) );
}
void mix (u32 *data)
{
u32 i;
for (i = 1; i!=64 * 16 + 1; i++)
{
state[i % 64] = SUBSTA (state[i % 64] + ROL( PROTO(state [(i - 1) % 64 ]) ^ PROTO(state [(i + 1) % 64 ]) ^ (data [i % 16]), 11),8);
}
}
void __stdcall __export setup (u32 *key)
{
u32 i, n, ki, x;
u32 data[16];
for (i = 0; i != 16; i++)
{
data[i] = key[i];
}
for (i = 0; i!=64; i++)
{
state [i] = i;
}
for (n = 0; n!=8; n++)
{
for (i = 0; i!=64; i++)
{
state [i] = SUBST (keymat [n][exmat[state[i] % 256]]);
}
}
ki = MAGIC;
for (i = 0; i!=MIXSTAGES; i++)
{
if (i != 0) MUTATE(data);
ki = build(ki, &data[0]);
if (i != MIXSTAGES - 1)
{
if (i != 0) MUTATE(data);
mix (&data[0]);
}
}
for (i = 0; i!=MIXSTAGES; i++)
{
HARDMUTATE(data);
mix (&data[0]);
HARDMUTATE(data);
ki = build(ki, &data[0]);
}
}
void __stdcall __export crypt (u32 *data)
{
u32 a, b, c;
s32 n, ki;
a = data[0];
b = data[1];
ki = 32;
for (n = 0; n!=31; n++)
{
b = ROL ( b ^ (ONEWAY(a) + state[n]), a % 32);
a ^= SUBST(ONEWAY(b) + state[n + 1]);
switch (n % 2)
{
case 1:
a = ROL (a + (ONEWAY(b) + state[b % 32]), b % 32);
b += SUBST(ONEWAY(a) + state[a % 32]);
break;
case 0:
a = ROL (a + (ONEWAY(b) + state[ki]), b % 32);
b += SUBST(ONEWAY(a) + state[ki + 1]);
ki += 2;
break;
}
SWAP (a, b);
}
data[0] = a;
data[1] = b;
}
void __stdcall __export decrypt (u32 *data)
{
u32 a, b, c;
s32 n, ki;
a = data[0];
b = data[1];
ki = 64;
for (n = 30; n!=-1 ; n--)
{
SWAP (a, b);
switch (n % 2)
{
case 1:
b -= SUBST(ONEWAY(a) + state[a % 32]);
a = ROR (a, b % 32) - (ONEWAY(b) + state[b % 32]);
break;
case 0:
ki -= 2;
b -= SUBST(ONEWAY(a) + state[ki + 1]);
a = ROR (a, b % 32) - (ONEWAY(b) + state[ki]);
break;
}
a ^= SUBST(ONEWAY(b) + state[n + 1]);
b = ROR(b, a %32) ^ (ONEWAY(a) + state[n]);
}
data[0] = a;
data[1] = b;
}
u32 __stdcall __export getblocksize ()
{
return 64;
}
u32 __stdcall __export getkeysize ()
{
return 512;
}
void __stdcall __export getciphername (unsigned char *p)
{
strcpy(p, "MESSA");
}
0 0 0
Для добавления комментариев необходимо авторизоваться
Интерны
Увлекательная игра в больничку