{
charc=char(C[i]);
if(Findlocation(c)-Findlocation(inbuf)!
=0)
{
M+=(Findlocation(c)-Findlocation(inbuf))%26+64;
}
else
{
M+=(Findlocation(c)-Findlocation(inbuf))%26+26+64;
}
}
cout<<"明文:
\n";
cout<}
return0;
}
intFindlocation(charc)
{
for(inti=0;i<26;i++)
{
if(table[i]==c)
returni+1;
}
return0;
}
#include
voidmain()
{
intf[2][6]={1,2,3,4,5,6,5,6,4,1,2,3};
inti,j,k;
chara[255][6],b[255][6],d[255][6],e[255][6];
printf("密钥是:
\n");
for(i=0;i<2;i++)
{
for(j=0;j<6;j++)
{
printf("%d,",f[i][j]);
}
printf("\n");
}
printf("请输入文本信息并以#号结束\n");
for(i=0;i<255;i++)
{
for(j=0;j<6;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='#')
break;
}
if(a[i][j]=='#')
break;
}
printf("对文本信息进行加密:
\n");
printf("*********************\n");
printf("你输入的明文数组是:
\n");
for(i=0;i<255;i++)
{
for(j=0;j<6;j++)
{
if(a[i][j]!
='#')
printf("%c",a[i][j]);
else
break;
}
printf("\n");
if(a[i][j]=='#')
break;
}
intc,h;
c=i;
h=i;
for(i=0;i<=c;i++)
{
for(j=0;j<6;j++)
{
k=f[1][j]-1;
b[i][j]=a[i][k];
}
}
printf("加密后的密文数组是:
\n");
for(i=0;i<=c;i++)
{
for(j=0;j<6;j++)
{
printf("%c",b[i][j]);
}
printf("\n");
}
printf("密文是:
\n");
for(j=0;j<6;j++)
{
for(i=0;i<=c;i++)
{
printf("%c",b[i][j]);
}
}
printf("\n");
printf("对文本信息进行解密:
\n");
printf("*********************\n");
printf("你输入密文的数组是:
\n");
charp[255];
intnum=0;
for(i=0;i<=c;i++)
{
for(j=0;j<6;j++)
{
p[num]=a[i][j];
num++;
if(p[num]=='#')
break;
}
if(p[num]=='#')
break;
}
num=0;
for(j=0;j<6;j++)
{
for(i=0;i<=h;i++)
{
d[i][j]=p[num];
num++;
}
}
for(i=0;i<=h;i++)
{
for(j=0;j<6;j++)
{
printf("%c",d[i][j]);
}
printf("\n");
}
printf("解密后的明文数组为:
\n");
for(i=0;i<=h;i++)
{
for(j=0;j<6;j++)
{
k=f[1][j]-1;
e[i][j]=d[i][k];
}
}
for(i=0;i<=h;i++)
{
for(j=0;j<6;j++)
{
printf("%c",e[i][j]);
}
printf("\n");
}
printf("明文是:
\n");
for(i=0;i<=h;i++)
{
for(j=0;j<6;j++)
printf("%c",e[i][j]);
}
printf("\n");
}
//DES加密
#include
#include
#include
#include
#include
#include"windows.h"
usingnamespacestd;
staticunsignedchar
PC1[56]={56,48,40,32,24,16,8,
0,57,49,41,33,25,17,
9,1,58,50,42,34,26,
18,10,2,59,51,43,35,
62,54,46,38,30,22,14,
6,61,53,45,37,29,21,
13,5,60,52,44,36,28,
20,12,4,27,19,11,3},//PC-1将64位秘钥转为56位(去掉校验位)
shift[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1},//移位次数
PC2[48]={13,16,10,23,0,4,
2,27,14,5,20,9,
22,18,11,3,25,7,
15,6,26,19,12,1,
40,51,30,36,46,54,
29,39,50,44,32,47,
43,48,38,55,33,52,
45,41,49,35,28,31},//PC-256位秘钥压缩到48位
IP[64]={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,
56,48,40,32,24,16,8,0,
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6},//初始置换IP
E[48]={31,0,1,2,3,4,
3,4,5,6,7,8,
7,8,9,10,11,12,
11,12,13,14,15,16,
15,16,17,18,19,20,
19,20,21,22,23,24,
23,24,25,26,27,28,
27,28,29,30,31,0},//EBit-SelectionTable
//S盒
S1[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},
S2[4][16]={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},
S3[4][16]={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},
S4[4][16]={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},
S5[4][16]={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},
S6[4][16]={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},
S7[4][16]={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},
S8[4][16]={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},
P[32]={15,6,19,20,
28,11,27,16,
0,14,22,25,
4,17,30,9,
1,7,23,13,
31,26,2,8,
18,12,29,5,
21,10,3,24},//置换P
IP_inverse[64]={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,
32,0,40,8,48,16,56,24};//IP的逆置换
voidlrotate(char*array,intlength,intcount)
//将array数组(length个元素)循环左移count次
{
vectortemp;
temp.resize(length);
for(inti=0;itemp[i]=array[i+count];
for(i=0;itemp[length-count+i]=array[i];
}
for(i=0;i//coutarray[i]=temp[i];
}
}
//------------------------------------------------------------------------------
classDES
{
private:
intsubKeys[17][48];//16个子密钥
intreadBMP(FILE*bmp,char*strBuf);//从BMP文件中一次读出8个字节信息到buf中
intwriteBMP(FILE*bmp,char*strOld,intnobj);//将nobj字节信息写到BMP文件中
public:
DES(char*skey);//构造函数,用于生成密钥
voidprintKey();//输出密钥仅供测试使用
voidcryptography(FILE*fin,FILE*fout,intmode);//加\解密函数,0为加密1为解密
};
DES:
:
DES(char*skey)
{
charkey[64],key_without_check[56],//原始密钥、去掉校验位的密钥
C[17][28],D[17][28],CD[17][56];//密钥的左右两部分
inti=0;
//============================密钥处理部分==============================
//8字节密钥转为64位的字符数组
while(*skey!
=NULL){
charcharacter=*skey;
for(intj=128,s=7;j>=1;j=j/2,s--)
key[i++]=(character&j)>>s;
skey++;
}
//利用PC1去掉奇偶校验位密钥变为56位
for(i=0;i<56;i++)
key_without_check[i]=key[PC1[i]];
//=============
//for(i=0;i<56;i++)
//cout//=============
//分成左右两部分得到C0,D0
for(i=0;i<28;i++){
C[0][i]=key_without_check[i];
D[0][i]=key_without_check[i+28];
}
//循环左移,得到C1-C16,D1-D16
for(i=1;i<=16;i++){
for(intj=0;j<28;j++){
C[i][j]=C[i-1][j];
D[i][j]=D[i-1][j];
}
//左移
lrotate(C[i],28,shift[i-1]);
lrotate(D[i],28,shift[i-1]);
}
//使用PC2压缩密钥56位密钥变为48位至此,得到最终16个子密钥subKeys
for(i=1;i<=16;i++)
for(intj=0;j<28;j++){
CD[i][j]=C[i][j];
CD[i][j+28]=D[i][j];
}
for(i=1;i<=16;i++)
for(intj=0;j<48;j++)
subKeys[i][j]=CD[i][PC2[j]];
cout<<"ok!
"<//OK====================================================================
}
voidDES:
:
printKey()
{
for(inti=1;i<=16;i++){
for(intj=0;j<48;j++)
cout<cout<<"\n";
}
}
intDES:
:
readBMP(FILE*bmp,char*strBuf)
//从BMP文件中一次读出8个字节信息到buf中不足8个字节部分补零返回实际读入的字节数
{
intnobj;
//如果文件已经结束
if(feof(bmp)!
=0){
return-1;
}
//如果文件未结束
else{
nobj=fread(strBuf,sizeof(char),8,bmp);
//不足64字节部分补零
if(nobj<8){
for(inti=nobj;i<8;i++)
strBuf[i]=0;
}
returnnobj;
}
}
intDES:
:
writeBMP(FILE*bmp,char*strOld,intnobj)
//nobj字节信息写到BMP文件中,
{
//写入
fwrite(strOld,sizeof(char),nobj,bmp);
returnnobj;
}
voidDES:
:
cryptography(FILE*fin,FILE*fout,intmode)
//DES加解密函数,bmp为位图图像文件名
{
charstrBuf[8],strOld[8],preCipher[8]={0};//初始输入的8字节明文每次加密后产生的密文
charplain[64],//变换成64位之后的数组
M_IP[64],//经过初始置换的明文
L[17][32],R[17][32],
E_R[17][32],//扩展后的Rn
XOR_kR[17][32],//与密钥异或后的Rn
B[8][6],S_B[8][4],//8个S盒的输入输出
S[32],//S盒的完整输出
f[32],//f函数经过P置换的结果
RL[32],//交换左右部分的结果
cipher[64];//最后的密文输出
intcount=0;
//加密文件
intnobj=readBMP(fin,strBuf);
while(nobj>0){
//8字节明文s
展开阅读全文
相关搜索
资源标签