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

📄 zideacryptor.cpp

📁 这是一个加解密程序
💻 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 + -