文档库 最新最全的文档下载
当前位置:文档库 › n=4的排列码源程序

n=4的排列码源程序

#include
#include
#include
/*初始化密码表,其余255张由这一张生成*/
//int table[24]={0,1,2,3,0,1,3,2,0,2,1,3,0,2,3,1,0,3,1,2,0,3,2,1};
/*更换分组时对密钥进行变换*/
void change(char t,char *k)
{
char x;
x=t;
x=x>>4;
t=t&0xf0;
t=t|x;
for(int i=0;i<3;i++)
k[i]+=t;
return;
}
/*由输入密码随机生成256张表中的一张*/
void make_table(char key)
{
char temp_key,temp;
int i;
for(i=0;i<12;i++)
{
temp_key=(key<if(temp_key==0x80)
{
temp=table[2*i];
table[2*i]=table[2*i+1];
table[2*i+1]=temp;
}
}
}
/*选择某一张密码表,确定bit的交换位置*/
char chose_table(unsigned int k)
{
char tab;
int mod=k%24;
tab=table[mod];
return tab;
}
/*对一个分组加密*/
char byte_en(char t,char *k,char key_t)
{
int i,j;
int a[4],b[4];
char m[4],mi[4];
char p=key_t,q=k[1],r=k[2];
char t1=t;
for(i=0;i<4;i++)
a[i]=(p>>(2*(3-i)))&0x03;
b[0]=(q>>(7-a[0]))&0x01;
b[1]=(q>>(3-a[1]))&0x01;
b[2]=(r>>(7-a[2]))&0x01;
b[3]=(r>>(3-a[3]))&0x01;
for(i=0;i<4;i++)
m[i]=(t1>>(7-i))&0x01;
for(i=0;i<4;i++)
{
if(b[i]==1)
m[i]=(~m[i])&(0x01);
}
for(i=0;i<4;i++)
{
j=a[i];
mi[j]=m[i];
}
t=(mi[0]<<7)|(mi[1]<<6)|(mi[2]<<5)|(mi[3]<<4)&0xf0;
return t;
}
/*对一个分组解密*/
char byte_de(char t,char *k,char key_t)
{
int i,j;
int a[4],b[4];
char m[4],mi[4];
char p=key_t,q=k[1],r=k[2];
char t1=t;
for(i=0;i<4;i++)
a[i]=(p>>(2*(3-i)))&0x03;
b[0]=(q>>(7-a[0]))&0x01;
b[1]=(q>>(3-a[1]))&0x01;
b[2]=(r>>(7-a[2]))&0x01;
b[3]=(r>>(3-a[3]))&0x01;
for(i=0;i<4;i++)
mi[i]=(t1>>(7-i))&0x01;
for(i=0;i<4;i++)
{
j=a[i];
m[i]=mi[j];
}
for(i=0;i<4;i++)
{
if(b[i]==1)
m[i]=(~m[i])&(0x01);
}
t=(m[0]<<7)|(m[1]<<6)|(m[2]<<5)|(m[3]<<4)&0xf0;
return t;
}
/*加密*/
void jiami()
{
char key[4],src1[100],src2[100];
char temp,res=0;
char kkey;
ifstream in;
ofstream out;
cout<<"请输入要加密的目标文件路径:"<cin>>src1;
in.open(src1,ios::in,0);
if(!in)
{
cout<<"文件不能正常打开"<return;
}
cout<<"请输入生成加密文件的路径:"<cin>>src2;
out.open(src2,ios::out,0);
if(!out)
{
cout<<"文件不能正常打开"<return;
}
cout<<"请输入密码:"<cin>>key;
if(sizeof(key)!=4)
{
cout<<"输入的密码字符个数不正确"<return;
}
make_table(key[0]);
char lbz;
while(in.get(temp))
{
kkey=chose_table(key[0]);
res=byte_en(temp,key,kkey);
change(temp,key);
temp=temp<<4;
kkey=chose_table(key[0]);
lbz=(byte_en(temp,key,kkey)>>4)&0x0f;
res=res|lbz;
change(temp,key);
out.put(res);
}
in.close();
out.close();
}
/*解密*/
void jiemi()
{
char key[4],src1[100],src2[100];
char temp,res=0;
char kke

y;
ifstream in;
ofstream out;
cout<<"请输入要解密的目标文件路径:"<cin>>src1;
in.open(src1,ios::in,0);
if(!in)
{
cout<<"文件不能正常打开"<return;
}
cout<<"请输入生成解密文件的路径:"<cin>>src2;
out.open(src2,ios::out,0);
if(!out)
{
cout<<"文件不能正常打开"<return;
}
cout<<"请输入加密时的密码"<cin>>key;
make_table(key[0]);
char lbz;
while(in.get(temp))
{
kkey=chose_table(key[0]);
res=byte_de(temp,key,kkey);
change(res,key);
temp=temp<<4;
kkey=chose_table(key[0]);
lbz=(byte_de(temp,key,kkey)>>4)&0x0f;
res=res|lbz;
change(res,key);
out.put(res);
}
in.close();
out.close();
}
void main()
{
char token;
do
{
cout<<"N=4的排列码加密解密程序:"<cout<<"\t1.加密文件"<cout<<"\t2.解密文件"<cout<<"\t3.退出"<cout<<"请输入你的选择:"<cin>>token;
if(token=='1') jiami();
else
if(token=='2') jiemi();
else return;
}while(1);
return;
}

相关文档
相关文档 最新文档