排列码n4源程序文件实现语言C++Word下载.docx
- 文档编号:21387450
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:22
- 大小:18.68KB
排列码n4源程序文件实现语言C++Word下载.docx
《排列码n4源程序文件实现语言C++Word下载.docx》由会员分享,可在线阅读,更多相关《排列码n4源程序文件实现语言C++Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
//在visualstudio2008中实现
#include"
stdafx.h"
#include<
iostream>
fstream>
usingnamespacestd;
//函数声明
charrhl(char);
//循环右移函数
intreverse(int);
//按位取反函数
voidencode();
//加密函数
voiddecode();
//解密函数
inta[8],c[8],d[16],e[8],f[4],t[32],p[32],w[32],remainder,q;
charbite0,bite1,bite4,bite5;
unsignedcharkey0[4],key1[4],key[4],r;
//主函数
intmain()
{
charfile_name1[200],file_name2[200],file_name3[200],file_name4[200];
inti,j,k,choose,zijie2=0,zijie3=0,a1=0,a2=0,a3=0,a4=0;
while(true){
//输出提示信息
cout<
<
"
--------请选择您要的操作:
---------"
endl;
加密文件请按键;
解密文件请按键;
打算退出请按键。
----------------------------------"
;
\n"
//cin>
>
choose;
choose=1;
//加密过程
if(choose==1)
{
输入要加密的文件名称及其路径:
"
cin>
file_name1;
加密后要保存的文件名称及其路径:
file_name2;
ifstreamfs0(file_name1,ios:
:
binary);
if(!
fs0)
文件打开失败!
return1;
}
ofstreamfs1(file_name2,ios:
fs1)
输入您的位密钥"
endl<
key0;
r=key0[0];
key0[0]=key0[3];
key0[3]=r;
r=key0[1];
key0[1]=key0[2];
key0[2]=r;
while(fs0.get(bite0))
unsignedchargg;
for(i=0;
i<
8;
i++)
c[i]=bite0&
1;
//c[i]存明文
bite0=bite0>
for(k=0;
k<
4;
k++)
key[k]=key0[k];
//用于保存密钥
//模取余
remainder=key[2]%24;
//key0[2]用于选行
//看哪一路径需要取反,前八条路径
gg=key[0];
for(j=0;
j<
j++)
d[j]=gg&
gg=gg>
//后八条路径
gg=key[1];
for(j=8;
16;
encode();
//低四位加密
//以下是密钥的变化
j++){
w[j]=key[0]&
key[0]=key[0]>
w[j+8]=key[1]&
key[1]=key[1]>
w[j+16]=key[2]&
key[2]=key[2]>
w[j+24]=key[3]&
key[3]=key[3]>
w[j]=w[j]^1;
w[j+8]=w[j+8]^1;
w[j+16]=w[j+16]^1;
w[j+24]=w[j+24]^1;
}//密钥n位求非n位不求非
28;
w[31-j]=w[27-j];
w[j]=c[j];
p[j]=key0[0]&
key0[0]=rhl(key0[0]);
p[j+8]=key0[1]&
key0[1]=rhl(key0[1]);
p[j+16]=key0[2]&
key0[2]=rhl(key0[2]);
p[j+24]=key0[3]&
key0[3]=rhl(key0[3]);
q=1;
32;
if(p[j]==1&
&
w[j]==1&
q==1){w[j]=1;
q=1;
}
elseif(p[j]==1&
q==0){w[j]=0;
elseif(p[j]==0&
w[j]==0){w[j]=q;
q=0;
elseif(w[j]!
=p[j]&
q==1){w[j]=0;
else{w[j]=1;
t[7-j]=w[31-j];
24;
w[31-j]=w[23-j];
w[7-j]=t[7-j];
a1=a2=a3=a4=0;
for(j=7;
j>
=0;
j--){
a1=a1<
a1=a1|w[j];
a2=a2<
a2=a2|w[j+8];
a3=a3<
a3=a3|w[j+16];
a4=a4<
a4=a4|w[j+24];
key0[0]=a1;
key0[1]=a2;
key0[2]=a3;
key0[3]=a4;
e[j]=a[j];
//a[i]存中间加密结果,e[i]存密文
c[j]=e[j];
j--)
zijie2=zijie2<
zijie2=zijie2|c[j];
bite4=char(zijie2);
fs1.put(bite4);
fs0.close();
fs1.close();
//cout<
======================================"
//解密过程
if(choose==2)
输入要解密的文件名称及其路径:
file_name3;
解密后要保存的文件名称及其路径:
file_name4;
ifstreamfs2(file_name3,ios:
fs2)
ofstreamfs3(file_name4,ios:
fs3)
输入您的位解密密钥(与加密密钥相同):
while(fs2.get(bite1))
chargg;
a[i]=bite1&
bite1=bite1>
key[k]=key0[k];
}
decode();
w[j]=f[j];
e[j]=f[j];
a[j]=e[j];
zijie3=zijie3<
zijie3=zijie3|a[j];
bite5=char(zijie3);
fs3.put(bite5);
fs2.close();
fs3.close();
if(choose==3)
结束!
-----------------------------------"
//return0;
//取反函数
intreverse(intx)
x=~x;
x=x&
returnx;
charrhl(charcc)
unsignedchara,b;
a=cc<
7;
b=cc>
cc=a|b;
returncc;
//加密函数中使用的排列码表
voidencode()
switch(remainder)
case0:
//3201
a[0]=c[2];
if(d[8]==1)a[0]=reverse(a[0]);
a[1]=c[3];
if(d[13]==1)a[1]=reverse(a[1]);
a[2]=c[1];
if(d[6]==1)a[2]=reverse(a[2]);
a[3]=c[0];
if(d[3]==1)a[3]=reverse(a[3]);
break;
case1:
//3210
a[0]=c[3];
if(d[12]==1)a[0]=reverse(a[0]);
a[1]=c[2];
if(d[9]==1)a[1]=reverse(a[1]);
case2:
//3120
a[1]=c[1];
if(d[5]==1)a[1]=reverse(a[1]);
a[2]=c[2];
if(d[10]==1)a[2]=reverse(a[2]);
case3:
//3102
a[2]=c[3];
if(d[14]==1)a[2]=reverse(a[2]);
case5:
//3021
a[0]=c[1];
if(d[4]==1)a[0]=reverse(a[0]);
case4:
//3012
case6:
//2310
a[2]=c[0];
if(d[2]==1)a[2]=reverse(a[2]);
a[3]=c[1];
if(d[7]==1)a[3]=reverse(a[3]);
case7:
//2301
case8:
//2130
a[3]=c[2];
if(d[11]==1)a[3]=reverse(a[3]);
case9:
//2103
a[3]=c[3];
if(d[15]==1)a[3]=reverse(a[3]);
case10:
//2031
case11:
//2013
case12:
//1320
a[1]=c[0];
if(d[1]==1)a[1]=reverse(a[1]);
case13:
//1302
case14:
//1230
case15:
//1203
case16:
//1032
case17:
//1023
a[1]=c[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排列 n4 源程序 文件 实现 语言 C+