📄 idea.cpp
字号:
#include "idea.h"
#include <vcl.h>
word16 inv(word16 x)
{
word16 t0,t1;
word16 q,y;
if (x<=1)
return x;
t1=(word16)(0x10001l/x);
y=(word16)(0x10001l%x);
if (y==1)
return low16(1-t1);
t0=1;
do
{
q=x/y;
x=x%y;
t0+=q*t1;
if (x==1)
return t0;
q=y/x;
y=y%x;
t1+=q*t0;
} while (y!=1);
return low16(1-t1);
}
void en_key_idea(word16 *userkey, word16 *Z)
{
int i,j;
for (j=0;j<8;j++)
Z[j]=*userkey++;
for (i=0;j<KEYLEN;j++)
{
i++;
Z[i+7]=((Z[i&7] << 9) | (Z[i+1 & 7] >> 7));
Z+=i&8;
i&=7;
}
}
void de_key_idea(IDEAkey Z,IDEAkey DK)
{
int j;
word16 t1,t2,t3;
IDEAkey T;
word16 *p=T+KEYLEN;
t1=inv(*Z++);
t2=-*Z++;
t3=-*Z++;
*--p=inv(*Z++);
*--p=t3;
*--p=t2;
*--p=t1;
for (j=1;j<ROUNDS;j++)
{
t1=*Z++;
*--p=*Z++;
*--p=t1;
t1=inv(*Z++);
t2=-*Z++;
t3=-*Z++;
*--p=inv(*Z++);
*--p=t2;
*--p=t3;
*--p=t1;
}
t1=*Z++;
*--p=*Z++;
*--p=t1;
t1=inv(*Z++);
t2=-*Z++;
t3=-*Z++;
*--p=inv(*Z++);
*--p=t3;
*--p=t2;
*--p=t1;
for(j=0,p=T;j<KEYLEN;j++)
{
*DK++=*p;
*p++=0;
}
}
word16 mul(word16 a, word16 b)
{
word32 p;
if (a)
{
if (b)
{
p=(word32)a*b;
b=(word16)(low16(p));
a=(word16)(p>>16);
return b-a+(b<a);
}
else
{
return 1-a;
}
}
else
return 1-b;
}
#define MUL(x,y) (x=mul(low16(x),y))
//#define CONST
void cipher_idea(word16 in[4],word16 out[4],IDEAkey Z)
{
register word16 x1,x2,x3,x4,t1,t2;
int r=ROUNDS;
x1=*in++; x2=*in++;
x3=*in++; x4=*in;
do
{
MUL(x1,*Z++);
x2+=*Z++;
x3+=*Z++;
MUL(x4,*Z++);
t2=x1^x3;
MUL(t2,*Z++);
t1=t2+(x2^x4);
MUL(t1,*Z++);
t2=t1+t2;
x1^=t1;
x4^=t2;
t2^=x2;
x2=x3^t1;
x3=t2;
} while (--r);
MUL(x1,*Z++);
*out++=x1;
*out++=(x3+*Z++);
*out++=(x2+*Z++);
MUL(x4,*Z);
*out=x4;
}
//------------------------------------------------------------------------------
void key_gen(char pass[], word16 userkey[])
{
for (int i=0; i<21; i++)
{
if (pass[i]>='0' && pass[i]<='9') //编码0-9
pass[i] -= 48;
if (pass[i]>='A' && pass[i] <= 'Z')
pass[i] -= 55; //编码10-35
if (pass[i]>='a' && pass[i]<='z')
pass[i] -= 61; //编码36-61
if (pass[i] == '@') //编码62
pass[i] = 62;
if (pass[i] == '$') //编码63
pass[i] = 63;
}
for (int i=0; i<126; i++)
set_bits(&userkey[i/16], i%16, get_bits(pass[i/8], i%8));
set_bits(&userkey[15], 14, 0);
set_bits(&userkey[15], 15, 0);
}
bool get_bits(char c, int n)
{
return (bool)(c & (1<<n));
}
void set_bits(word16 *p, int n, bool isone)
{
if (isone)
*p = *p |(1<<n);
else
*p = *p & ~(1<<n);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -