📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <windows.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
String fileopen="",filesave="";
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void IpPer(BOOL *p,BOOL *l,BOOL *r); //64位明文分成两部分
void pc1(BOOL *key,BOOL *c,BOOL *d);
void move(BOOL *c,BOOL *d,int len); //循环左移产生子密钥
void pc2(BOOL *key_sub,BOOL *c,BOOL *d);
void expand(BOOL *r_expand,BOOL *r,BOOL *key_sub);
void s_box(BOOL *r,BOOL *r_expand);
void p_box(BOOL *r);
void ip_f(BOOL *crypt,BOOL *l,BOOL *r);
void en_decrypt(BOOL *text,BOOL *key,char ch);
void getsubkey(BOOL *key,BOOL key_sub[][48]);
void btbit(BOOL *out,BYTE * in,int len);
void btbyte(BYTE *out,BOOL *in,int ien);
void xor(BOOL *out,BOOL *in,int len);
void iv_keychange(BOOL *key,BOOL *iv,BYTE *key_in,BYTE *iv_in); //初始iv和用户密码转换为64位二进制
//---------------------------------------------------------------------------
void IpPer(BOOL *p,BOOL *l,BOOL *r)
{
int ip[64]={58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7};
int i;
for(i=0;i<32;i++)
{
l[i]=p[ip[i]-1];
r[i]=p[ip[i+32]-1];
}
}
//---------------------------------------------------------------------------
void pc1(BOOL *key,BOOL *c,BOOL *d)
{
int pc1[56]={57,49,41,33,25,17,9,
1,58,50,42,34,26,18,
10,2,59,51,43,35,27,
19,11,3,60,52,44,36,
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4};
int i;
for(int i=0;i<28;i++)
{
c[i]=key[pc1[i]-1];
d[i]=key[pc1[i+28]-1];
}
}
//---------------------------------------------------------------------------
void move(BOOL *c,BOOL *d,int len)
{
int i;
BOOL tmp1,tmp2,tmp3,tmp4;
if(len==1)
{
tmp1=c[0];
tmp2=d[0];
for(i=0;i<27;i++)
{
c[i]=c[i+1];
d[i]=d[i+1];
}
c[i]=tmp1;
d[i]=tmp2;
}
else if(len==2)
{
tmp1=c[0];
tmp2=c[1];
tmp3=d[0];
tmp4=d[1];
for(i=0;i<26;i++)
{
c[i]=c[i+2];
d[i]=d[i+2];
}
c[i]=tmp1;
d[i++]=tmp3;
c[i]=tmp2;
d[i]=tmp4;
}
}
//---------------------------------------------------------------------------
void pc2(BOOL *key_sub,BOOL *c,BOOL *d)
{
int pc2[48]={14,17,11,24,1,5,
3,28,15,6,21,10,
23,19,12,4,26,8,
16,7,27,20,13,2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32};
for(int i=0;i<48;i++)
{
if(pc2[i]>28)
key_sub[i]=d[pc2[i]-28-1];
else if(pc2[i]<=28)
key_sub[i]=c[pc2[i]-1];
}
}
//---------------------------------------------------------------------------
void expand(BOOL *r_expand,BOOL *r,BOOL *key_sub)
{
int expand[48]={32,1,2,3,4,5,
4,5,6,7,8,9,
8,9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1};
int i;
for(i=0;i<48;i++)
{
r_expand[i]=r[expand[i]-1];
}
xor(r_expand,key_sub,48);
}
//---------------------------------------------------------------------------
void s_box(BOOL *r,BOOL *r_expand)
{
BOOL s[8][4][16]={{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13},
{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9},
{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12},
{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14},
{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3},
{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13},
{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12},
{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}};
int i,j,k,count,tmp;
for(i=0;i<8;i++)
{
tmp=s[i][r_expand[6*i+5]+r_expand[6*i]*2][r_expand[6*i+1]*8+r_expand[6*i+2]*4+r_expand[6*i+3]*2+r_expand[6*i+4]];
for(count=3;count>=0;count--)
{
r[4*i+count]=tmp%2;
tmp=tmp/2;
}
}
}
//---------------------------------------------------------------------------
void p_box(BOOL *r)
{
BOOL p[32]={16,7,20,21,
29,12,28,17,
1,15,23,26,
5,18,31,10,
2,8,24,14,
32,27,3,9,
19,13,30,6,
22,11,4,25};
int i;
BOOL tmp[32];
for(i=0;i<32;i++)
{
tmp[i]=r[i];
}
for(i=0;i<32;i++)
{
r[i]=tmp[p[i]-1];
}
}
//---------------------------------------------------------------------------
void ip_f(BOOL *crypt,BOOL *l,BOOL *r)
{
BOOL ip_f[64]={40,8,48,16,56,24,64,32,
39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26,
33,1,41,9,49,17,57,25};
int i;
for(i=0;i<64;i++)
{
if(ip_f[i]>32)
crypt[i]=l[ip_f[i]-33];
else if(ip_f[i]<=32)
crypt[i]=r[ip_f[i]-1];
}
}
//---------------------------------------------------------------------------
void en_decrypt(BOOL *text,BOOL *key,char ch)
{
BOOL l[32],r[32],key_sub[16][48],r_expand[48],tmp,l_tmp[32];
int i,j,k;
IpPer(text,l,r);
getsubkey(key,key_sub);
for(i=0;i<16;i++)
{
for(j=0;j<32;j++)
{
l_tmp[j]=l[j]; //(ch=='e'||'E')?i:15-i
l[j]=r[j];
}
expand(r_expand,r,key_sub[(ch=='e'||ch=='E')?i:15-i]);
s_box(r,r_expand);
p_box(r);
xor(r,l_tmp,32);
}
ip_f(text,l,r);
}
//---------------------------------------------------------------------------
void getsubkey(BOOL *key,BOOL key_sub[][48])
{
BOOL c[28],d[28];
int len[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
pc1(key,c,d);
int i;
for(i=0;i<16;i++)
{
move(c,d,len[i]);
pc2(key_sub[i],c,d);
}
}
//---------------------------------------------------------------------------
void btbit(BOOL *out,BYTE * in,int len)
{
int i;
for(i=0;i<len;i++)
out[i]=(in[i/8]>>(7-i%8))&1;
}
//---------------------------------------------------------------------------
void btbyte(BYTE *out,BOOL *in,int len)
{
int i,j,tmp;
for(i=0;i<len/8;i++)
{
tmp=1;
out[i]=0;
for(j=7;j>=0;j--)
{
out[i]+=in[8*i+j]*tmp;
tmp*=2;
}
}
}
//---------------------------------------------------------------------------
void xor(BOOL *out,BOOL *in,int len)
{
for(int i=0;i<len;i++)
{
out[i]=out[i]^in[i];
}
}
//---------------------------------------------------------------------------
void iv_keychange(BOOL *key,BOOL *iv,BYTE *key_in,BYTE *iv_in)
{
DWORD i;
BYTE tmp_key[8],tmp_iv[8];
BYTE ed1[17],ed2[17];
strcpy(ed1,key_in);
strcpy(ed2,iv_in);
for(i=0;i<16;i++)
{
if(ed1[i]>='0'&&ed1[i]<='9')
ed1[i]=ed1[i]-48;
else if(ed1[i]>='a'&&ed1[i]<='z')
ed1[i]=ed1[i]-87;
else if(ed1[i]>='A'&&ed1[i]<='Z')
ed1[i]=ed1[i]-55;
if(ed2[i]>='0'&&ed2[i]<='9')
ed2[i]=ed2[i]-48;
else if(ed2[i]>='a'&&ed2[i]<='z')
ed2[i]=ed2[i]-87;
else if(ed2[i]>='A'&&ed2[i]<='Z')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -