📄 zideacryptor.cpp
字号:
/* ZIdeaCryptor.cpp
实现Idea加密算法类 CZIdeaCryptor
张忠杰 2003-12-04
*/
#include "stdafx.h"
#include "ZIdeaCryptor.h"
//---------------------------------------------------------------------------
// 计算x模乘(0x10001)的倒数
// 有待仔细研究
static unsigned __int16 MulInv(unsigned __int16 x)
{
unsigned __int16 t0, t1;
unsigned __int16 q, y;
if (x<=1) return x; // 0与1的倒数是其自身
t1 = (unsigned __int16)(0x10001L/x ); /* Since x >= 2, this fits into 16 bits */
y = (unsigned __int16)(0x10001L%x );
if (y==1) return (unsigned __int16)(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 (unsigned __int16)(1-t1);
}
//计算 x * y mod 65537
#define ModMul(x,y) ( (unsigned short) ( ((unsigned __int32)x) * ((unsigned __int32)y) % 65537 ) )
//---------------------------------------------------------------------------
CZIdeaCryptor::CZIdeaCryptor(const void *Key)
{
SetKey(Key);
}
CZIdeaCryptor::~CZIdeaCryptor()
{
}
/* 设置密钥(密钥的长度128Bit)
Key 密钥 16字节(128比特)
*/
void CZIdeaCryptor::SetKey(const void *Key)
{
int i,j;
unsigned char MKey[32],t;
unsigned char Buf[128],*p;
if (Key!=NULL) {
memcpy(_Key,Key,16);
}else{
memset(_Key,0,16);
}
memcpy(MKey, _Key, 16);
p = Buf;
//加密子密钥
for (i=0;i<6;i++) {
//取子密钥
memcpy(p,MKey,16);
p += 16;
//左移25比特
memcpy(MKey+16,MKey,16);
for (j=0;j<17;j++) {
MKey[j]=MKey[j+3];
}
for (j=0;j<16;j++) {
MKey[j]<<=1;
t= MKey[j+1];
t >>= 7;
MKey[j] |= t;
}
}
memcpy(p,MKey,8);
p=Buf;
for (i=0;i<52;i++) {
EncSubKey[i] = *p++;
EncSubKey[i] = ( EncSubKey[i] << 8 ) + *p++;
}
//解密子密钥
DecSubKey[0]=EncSubKey[48];
DecSubKey[1]=EncSubKey[49];
DecSubKey[2]=EncSubKey[50];
DecSubKey[3]=EncSubKey[51];
for (i=0;i<7;i++) {
DecSubKey[4+i*6 ]=EncSubKey[(7-i)*6+4];
DecSubKey[4+i*6+1]=EncSubKey[(7-i)*6+5];
DecSubKey[4+i*6+2]=EncSubKey[(7-i)*6 ];
DecSubKey[4+i*6+3]=EncSubKey[(7-i)*6+2];
DecSubKey[4+i*6+4]=EncSubKey[(7-i)*6+1];
DecSubKey[4+i*6+5]=EncSubKey[(7-i)*6+3];
}
DecSubKey[46]=EncSubKey[4];
DecSubKey[47]=EncSubKey[5];
DecSubKey[48]=EncSubKey[0];
DecSubKey[49]=EncSubKey[1];
DecSubKey[50]=EncSubKey[2];
DecSubKey[51]=EncSubKey[3];
for (i=0;i<9;i++) {
DecSubKey[i*6 ] = MulInv(DecSubKey[i*6 ]);
DecSubKey[i*6+1] = 0 - DecSubKey[i*6+1] ;
DecSubKey[i*6+2] = 0 - DecSubKey[i*6+2] ;
DecSubKey[i*6+3] = MulInv(DecSubKey[i*6+3]);
}
}
//读取密钥(密钥的长度128Bit)
void CZIdeaCryptor::GetKey(void *Key)
{
memcpy(Key,_Key,16);
}
/* 使用Idea算法加密
Src 明文 8字节
Dst 密文 8字节
*/
void CZIdeaCryptor::Encrypt(void *Dst,const void *Src)
{
_IdeaCrypt(Dst,Src,1);
}
/* 使用Idea算法解密
Src 密文 8字节
Dst 明文 8字节
*/
void CZIdeaCryptor::Decrypt(void *Dst,const void *Src)
{
_IdeaCrypt(Dst,Src,0);
}
/* 使用IDEA算法加密(解密)
Src 明文(密文) 8字节
Dst 密文(明文) 8字节
Mark 加密/解密 1=加密 其他值=解密
*/
void CZIdeaCryptor::_IdeaCrypt(void *Dst,const void *Src,int Mark)
{
int i;
unsigned __int16 *SubKey;
unsigned __int16 x0,x1,x2,x3,x4;
unsigned __int16 r1,r2,r3,r4,r5,r6,r7,r8,r9,r10;
unsigned char *p;
if (Mark==1) {
SubKey = EncSubKey;
}else{
SubKey = DecSubKey;
}
p=(unsigned char *)Src;
x1= ( ( (unsigned __int16)p[0]<<8 ) + p[1] );
x2= ( ( (unsigned __int16)p[2]<<8 ) + p[3] );
x3= ( ( (unsigned __int16)p[4]<<8 ) + p[5] );
x4= ( ( (unsigned __int16)p[6]<<8 ) + p[7] );
for (i=0;i<48;i+=6) {
r1 = ModMul( x1, SubKey[i] );
r2 = x2 + SubKey[i+1] ;
r3 = x3 + SubKey[i+2] ;
r4 = ModMul( x4, SubKey[i+3] );
r5 = r1 ^ r3 ;
r6 = r2 ^ r4 ;
r7 = ModMul( r5, SubKey[i+4] );
r8 = r6 + r7 ;
r9 = ModMul( r8, SubKey[i+5] );
r10= r7 + r9 ;
x1 = r1 ^ r9 ;
x2 = r3 ^ r9 ;
x3 = r2 ^ r10 ;
x4 = r4 ^ r10 ;
}
x0=x2; x2=x3; x3=x0;
x1 = ModMul( x1, SubKey[i] );
x2 = x2 + SubKey[i+1] ;
x3 = x3 + SubKey[i+2] ;
x4 = ModMul( x4, SubKey[i+3] );
p=(unsigned char *)Dst;
p[0] = (unsigned char)(x1>>8);
p[1] = (unsigned char) x1;
p[2] = (unsigned char)(x2>>8);
p[3] = (unsigned char) x2;
p[4] = (unsigned char)(x3>>8);
p[5] = (unsigned char) x3;
p[6] = (unsigned char)(x4>>8);
p[7] = (unsigned char) x4;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -