📄 tea+
字号:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <iostream.h>
#define NM 8//迭代次数
#define LENGTH_OF_TEXT 200
void DwordToChar(DWORD word,char dd[5])
{
dd[0] = (char)((word >> 24)&0xFF);
dd[1] = (char)((word >> 16)&0xFF);
dd[2] = (char)((word >> 8)&0xFF);
dd[3] = (char)((word & 0xFF));
dd[4] = '\0';
}
DWORD CharToDword(char dd[5])
{
DWORD word = 0;
for(int i = 0;i < 4;i ++)
{
DWORD temp = 0x0;
temp = temp ^ ((dd[i]+256)%256);
temp = temp<<(3-i)*8;
word +=temp;
}
return word;
}
void Encrypt(DWORD v[2],DWORD k[4])
{
int len = 0;
DWORD y = v[0],z=v[1];
DWORD Delta = 0x9E3779B9,sum = 0;
DWORD a = k[0],b=k[1],c=k[2],d=k[3];
int n = NM;
while(n-- > 0)
{
cout<<endl<<"第"<<NM-n<<"次加密迭代后:";
BYTE bytes[4]={0};
sum = sum+Delta;
y += (z << 4) + (a^z) + (sum^(z >> 5)) + b;
z += (y << 4) + (c^y) + (sum^(y >> 5)) + d;
char temp[5]={'\0'};
DwordToChar(y,temp);
cout<<temp;
DwordToChar(z,temp);
cout<<temp<<endl;
}
v[0] = y;
v[1] = z;
}
void Decrypt(DWORD v[2],DWORD k[4])
{
DWORD y = v[0],z=v[1];
DWORD a = k[0],b=k[1],c=k[2],d=k[3];
DWORD sum = 0x0;
DWORD Delta = 0x9E3779B9;
int n = NM;
int i = 0;
for(i = 0;i < n;i ++)
sum +=Delta;
while(n-- > 0)
{
cout<<endl<<"第"<<NM-n<<"次解密迭代后:";
BYTE bytes[4]={0};
z -=((y<<4) + (c^y) + (sum^(y>>5)) + d);
y -=((z<<4) + (a^z) + (sum^(z>>5)) + b);
sum = sum-Delta;
char temp[5]={'\0'};
DwordToChar(y,temp);
cout<<temp;
DwordToChar(z,temp);
cout<<temp<<endl;
}
v[0] = y;
v[1] = z;
}
void copyChar(char *dest,const char *src,int start,int end)
{
if(dest == NULL)
return;
if(src == NULL)
return;
int i = 0;
for(i = start;i < end;i ++)
{
if(*(src+i) == '\0')
break;
*(dest+i-start) = *(src+i);
}
}
void converge(char *dest,const char *src,int size)
{
int i = 0;
int len = strlen(dest);
for(i = 0;i < size;i ++)
{
dest[len+i]=src[i];
}
}
void main()
{
char plaintext[LENGTH_OF_TEXT] ="我come from中国";
int i = 0;
int j = 0;
cout<<"请输入明文:"<<endl;
cin>>plaintext;
printf("plaintext = 0x%x\n",plaintext);
cout<<plaintext<<endl;
int len = 0;
DWORD v[2] ={0x12fed8,0x12fed8};
DWORD k[4]={0x61,0x62,0x63,0x64};
char code[17]={'\0'};
len = strlen(plaintext);
if(len % 8 != 0)
{
for(i = len%8;i < 8;i ++)
plaintext[len+i-len%8]=' ';
}
len = strlen(plaintext);
char afterEncrypt[100] = {'\0'};
char afterDecrypt[100] = {'\0'};
cout<<"请输入加密密码(8个汉字)"<<endl;
cin>>code;
for(i = 0;i < 4;i ++)
{
char tt[5]={'\0'};
copyChar(tt,code,i*4,i*4+4);
k[i] = CharToDword(tt);
}
cout<<"加密前的字符串:"<<endl;
cout<<plaintext<<endl;
for(i = 0;i < len;i+=8)
{
char temp[5] ={'\0'};
copyChar(temp,plaintext,i,i+4);
v[0] = CharToDword(temp);
copyChar(temp,plaintext,i+4,i+8);
v[1] = CharToDword(temp);
Encrypt(v,k);
DwordToChar(v[0],temp);
converge(afterEncrypt,temp,5);
DwordToChar(v[1],temp);
converge(afterEncrypt,temp,5);
}
cout<<"加密后的字符串:"<<endl;
cout<<afterEncrypt<<endl;
len = strlen(afterEncrypt);
memset(code,'\0',sizeof(char));
cout<<"请输入解密密码(8个汉字)"<<endl;
cin>>code;
for(i = 0;i < 4;i ++)
{
char tt[5]={'\0'};
copyChar(tt,code,i*4,i*4+4);
k[i] = CharToDword(tt);
}
for(i = 0;i < len;i+=8)
{
char ttemp[5] ={'\0'};
copyChar(ttemp,afterEncrypt,i,i+4);
v[0] = CharToDword(ttemp);
copyChar(ttemp,afterEncrypt,i+4,i+8);
v[1] = CharToDword(ttemp);
Decrypt(v,k);
DwordToChar(v[0],ttemp);
converge(afterDecrypt,ttemp,5);
DwordToChar(v[1],ttemp);
converge(afterDecrypt,ttemp,5);
}
cout<<"解密后的字符串:"<<endl;
cout<<afterDecrypt<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -