⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 idea.cpp

📁 我写的利用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 + -