🧙Конкурс сказок!
[Archivе]
(OFF) 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");
}

Комментарии (1)

Тема перенесена Dephkaleon из [с++] в [Archivе] (28 сен 2015)
Показать комментарий
Скрыть комментарий
Для добавления комментариев необходимо авторизоваться
[Archivе]
Флибустьеры
Грабь корабли! Побеждай монстров! Создавай уникаль...
Тема: Светлая | Тёмная
Версия: Mobile | Lite | Touch | Доступно в Google Play