📄 unit1.cpp
字号:
ed2[i]=ed2[i]-55;
}
for(i=0;i<8;i++)
{
tmp_key[i]=ed1[2*i]*16+ed1[2*i+1];
tmp_iv[i]=ed2[2*i]*16+ed2[2*i+1];
}
btbit(key,tmp_key,64);
btbit(iv,tmp_iv,64);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Encrypt1Click(TObject *Sender)
{
if(Memo1->Text.Length()==0)
{
MessageBox(Handle,"请输入十六进制明文!","提示:",MB_OK|MB_ICONEXCLAMATION);
return;
}
int len,len2,i,j,k,pi;
String str1,str2;
BYTE crypt[8];
bool flag=0;
BYTE *plaintext;
DWORD start,end;
DWORD all_len=0; //计算效率
double effic;
start=GetTickCount();
BOOL key[64];
BOOL iv[64];
iv_keychange(key,iv,Edit1->Text.c_str(),Edit2->Text.c_str());
str1=Memo1->Lines->Text;
len=str1.Length();
BYTE *s=(BYTE *)malloc(len+1);
strcpy(s,str1.c_str());
s[len]='\0';
if(len%2==1)
len2=(len+1)/2; //计算明文长度
else
len2=len/2;
if(RadioButton1->Checked==true)
{ //CBC模式
if(len2%8!=0)
{
flag=1; //0填充
pi=8-len2%8;
len2=len2+pi;
}
for(i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')
s[i]=s[i]-48;
else if(s[i]>='a'&&s[i]<='z')
s[i]=s[i]-87;
else if(s[i]>='A'&&s[i]<='Z')
s[i]=s[i]-55;
}
plaintext=(BYTE *)malloc(len2);
all_len=len2;
memset(plaintext,0,len2);
for(i=0;i<len/2;i++) //转化成字节存储
{
plaintext[i]=s[2*i]*16+s[2*i+1];
}
if(len%2==1)
plaintext[i]=s[2*i]*16;
if(flag==1)
plaintext[len2-1]=pi;
BOOL text[64];
BOOL iv_tmp[64];
str2="";
for(i=0;i<len2/8;i++)
{
btbit(text,&plaintext[8*i],64);
xor(iv,text,64);
en_decrypt(iv,key,'e');
btbyte(crypt,iv,64);
for(j=0;j<8;j++)
str2.cat_printf("%2.2x",crypt[j]);
}
free(plaintext);
}
else if(RadioButton2->Checked==true)
{
BOOL c_tmp[64];
BYTE byte_ptext;
BOOL bool_ptext; //CFB-1模式
BOOL bool_crytext[8];
BYTE byte_crytext;
str2="";
for(i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')
s[i]=s[i]-48;
else if(s[i]>='a'&&s[i]<='z')
s[i]=s[i]-87;
else if(s[i]>='A'&&s[i]<='Z')
s[i]=s[i]-55;
}
plaintext=(BYTE *)malloc(len2);
all_len=len2;
memset(plaintext,0,len2);
for(i=0;i<len/2;i++)
{
plaintext[i]=s[2*i]*16+s[2*i+1];
}
if(len%2==1)
plaintext[i]=s[2*i]*16;
for(i=0;i<8*len2;i++)
{
for(k=0;k<64;k++)
c_tmp[k]=iv[k];
en_decrypt(c_tmp,key,'e');
byte_ptext=plaintext[i/8];
bool_ptext=(byte_ptext>>(7-i%8))&1;
bool_ptext=bool_ptext^c_tmp[0];
bool_crytext[i%8]=bool_ptext;
if(i%8==7)
{
btbyte(&byte_crytext,bool_crytext,8);
str2.cat_printf("%2.2x",byte_crytext);
}
for(k=0;k<63;k++)
iv[k]=iv[k+1];
iv[63]=bool_ptext;
}
free(plaintext);
}
else if(RadioButton3->Checked==true)
{
BOOL c_bool[8];
BYTE c_print; //CFB_8模式
BOOL c_tmp[64];
str2="";
for(i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')
s[i]=s[i]-48;
else if(s[i]>='a'&&s[i]<='z')
s[i]=s[i]-87;
else if(s[i]>='A'&&s[i]<='Z')
s[i]=s[i]-55;
}
plaintext=(BYTE *)malloc(len2);
memset(plaintext,0,len2);
all_len=len2;
for(i=0;i<len/2;i++)
{
plaintext[i]=s[2*i]*16+s[2*i+1];
}
if(len%2==1)
plaintext[i]=s[2*i]*16;
for(i=0;i<len2;i++)
{
for(k=0;k<64;k++)
c_tmp[k]=iv[k];
en_decrypt(c_tmp,key,'e');
btbit(c_bool,&plaintext[i],8);
xor(c_tmp,c_bool,8);
btbyte(&c_print,c_tmp,8);
for(k=0;k<64-8;k++)
iv[k]=iv[k+8];
for(k=0;k<8;k++)
iv[64-8+k]=c_tmp[k];
str2.cat_printf("%2.2x",c_print);
}
free(plaintext);
}
else if(RadioButton4->Checked==true)
{
BOOL c_bool[64];
BYTE c_print[8];
BOOL c_tmp[64];
str2="";
for(i=0;i<len;i++) //CFB-64模式
{
if(s[i]>='0'&&s[i]<='9')
s[i]=s[i]-48;
else if(s[i]>='a'&&s[i]<='z')
s[i]=s[i]-87;
else if(s[i]>='A'&&s[i]<='Z')
s[i]=s[i]-55;
}
plaintext=(BYTE *)malloc(len2);
memset(plaintext,0,len2);
all_len=len2;
for(i=0;i<len/2;i++)
{
plaintext[i]=s[2*i]*16+s[2*i+1];
}
if(len%2==1)
plaintext[i]=s[2*i]*16;
for(i=0;i<(len2-1)/8+1;i++)
{
for(k=0;k<64;k++)
c_tmp[k]=iv[k];
en_decrypt(c_tmp,key,'e');
btbit(c_bool,&plaintext[8*i],8*((len2-8*i)<8?(len2-8*i):8));
xor(c_tmp,c_bool,64);
btbyte(c_print,c_tmp,64);
for(k=0;k<64;k++)
c_bool[k]=c_tmp[k];
for(k=0;k<64;k++)
iv[k]=c_bool[k];
if(len2-8*i<8)
{
for(k=0;k<len2-8*i;k++)
str2.cat_printf("%2.2x",c_print[k]);
}
else
{
for(k=0;k<8;k++)
str2.cat_printf("%2.2x",c_print[k]);
}
}
free(plaintext);
}
Memo2->Lines->Text=str2;
free(s);
end=GetTickCount();
effic=(end-start)*1.0/1000/all_len;
String tmp="运行速度:";
tmp+=FloatToStrF(effic,ffFixed,0,7);
tmp+="sec/byte!";
MessageBox(Handle,tmp.c_str(),"提示:",MB_OK|MB_ICONEXCLAMATION);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Decrypt1Click(TObject *Sender)
{
if(Memo2->Text.Length()==0)
{
MessageBox(Handle,"请输入十六进制密文!","提示:",MB_OK|MB_ICONEXCLAMATION);
return;
}
int len,len2,i,j,k,pi;
String str1,str2;
BYTE crypt[8];
bool flag=0;
BYTE *plaintext;
DWORD start,end;
DWORD all_len=0;
double effic;
start=GetTickCount();
BOOL key[64];
BOOL iv[64];
iv_keychange(key,iv,Edit1->Text.c_str(),Edit2->Text.c_str());
str2=Memo2->Lines->Text;
len=str2.Length();
BYTE *s=(BYTE *)malloc(len+1);
strcpy(s,str2.c_str());
s[len]='\0';
if(len%2==1)
len2=(len+1)/2;
else
len2=len/2;
if(RadioButton1->Checked==true)
{
if(len2%8!=0)
{
flag=1;
pi=8-len2%8;
len2=len2+pi;
}
for(i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')
s[i]=s[i]-48;
else if(s[i]>='a'&&s[i]<='z')
s[i]=s[i]-87;
else if(s[i]>='A'&&s[i]<='Z')
s[i]=s[i]-55;
}
plaintext=(BYTE *)malloc(len2);
memset(plaintext,0,len2);
all_len=len2;
for(i=0;i<len/2;i++)
{
plaintext[i]=s[2*i]*16+s[2*i+1];
}
if(len%2==1)
plaintext[i]=s[2*i]*16;
if(flag==1)
plaintext[len2-1]=pi;
BOOL text[64];
BOOL iv_tmp[64];
str1="";
for(i=0;i<len2/8;i++)
{
btbit(text,&plaintext[8*i],64);
for(j=0;j<64;j++)
{
iv_tmp[j]=text[j];
}
en_decrypt(text,key,'d');
xor(text,iv,64);
for(j=0;j<64;j++)
{
iv[j]=iv_tmp[j];
}
btbyte(crypt,text,64);
if(crypt[7]>=1&&crypt[7]<=7)
k=8-crypt[7];
else
k=8;
for(j=0;j<k;j++)
str1.cat_printf("%2.2x",crypt[j]);
}
free(plaintext);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -