📄 des1.cpp
字号:
cout<<"S_Box is:";
print32(S_result);
}
/* P盒替换 */
for(j=0;j<32;j++)
P_result[j]=S_result[P_Box[j]-1];
if(isdetialprint)
{
cout<<"f(R"<<i-1<<",K"<<i<<")=";
print32(P_result);
}
/* 将32位明文的经过P盒替换后的右半部分与起初分组的明文的左半部分进行异或 */
for(j=0;j<32;j++)
text32_right[i][j]=P_result[j]^text32_left[i-1][j];
if(isdetialprint)
{
cout<<"R"<<i<<"=";
print32(text32_right[i]);
}
/* L[i]=R[i-1] */
for(j=0;j<32;j++)
text32_left[i][j]=text32_right[i-1][j];
if(isdetialprint)
{
cout<<"L"<<i<<"=R"<<i-1<<"=";
print32(text32_left[i]);
cout<<endl;
}
}//end of f function
/* 将L16与R16合并 */
for(i=0;i<32;i++)
{
text64[i]=text32_right[16][i];
text64[i+32]=text32_left[16][i];
}
/* 末置换 */
for(i=0;i<64;i++)
text2[i]=text64[Final_Permutation[i]-1];
if(isdetialprint)
{
cout<<"IP-1:";
print64(text2);
cout<<endl;
}
}
void converse(bitset<64> &bitvec)
{
for(int i=0;i<32;i++)
if(bitvec[i]!=bitvec[63-i])
{
bitvec.flip(i);
bitvec.flip(63-i);
}
}
/* 加密子程序 */
void DES_Encrypt(bitset<64> Plaintext,bitset<64> & key,bitset<64> &Ciphertext)
{
DES_Function(Plaintext,Ciphertext,key,Encrypt);
};
/* 解密子程序 */
void DES_Decrypt(bitset<64> &Plaintext,bitset<64> key,bitset<64> Ciphertext)
{
DES_Function(Ciphertext,Plaintext,key,Decrypt);
};
void testProgram()
{
unsigned char ch;
bool isInput=false;
int i,j,CheckParity;
string str1("0000000100100011010001010110011110001001101010111100110111101111");
string str2("0001001100110100010101110111100110011011101111001101111111110001");
string str3("1010101010101010101010101010101010101010101010101010101010101010");
bitset<64> Plaintext(str1),Key(str2),Ciphertext(str3);
converse(Plaintext);
converse(Key);
/* 让计算机自动执行还是亲自输入 */
cout<<"请选择是让计算机自动执行还是亲自输入,让计算机自动执行吗?(Y/N)";
cin>>ch;
if((ch=='n')||(ch=='N')) isInput=true;
/* 读入原文和密钥*/
if(isInput)
{
/* 读入原文 */
cout<<"请输入要加密的原文或者原文的Hash值(任意8个字符):"<<endl;
for(i=0;i<8;i++)
{
cin>>ch;
for(j=0;j<8;j++)
{
Plaintext[i*8+7-j]=ch&1;
ch>>=1;
}
}
/* 读入密钥并加入奇偶校验位 */
cout<<"请输入密钥(8个字符):"<<endl;
for(i=0;i<8;i++)
{
cin>>ch;
for(j=0;j<8;j++)
{
if(ch&1)
Key.set((8-i)*8-(8-j));
else Key.reset((8-i)*8-(8-j));
ch>>=1;
}
CheckParity=((Key.count()%2==0)?0:1);//奇偶校验,如果有奇数个1,则奇偶校验位为1,否则为零
if(CheckParity)
Key.set((8-i)*8-1);
else Key.reset((8-i)*8-1);
}
}
else
{
cout<<"要加密的原文或者原文的Hash值为:"<<endl;
print64(Plaintext);
cout<<"密钥为:"<<endl;
print64(Key);
}
/* 用DES对原文进行加密操作 */
cout<<endl<<"正在对原文进行加密..."<<endl<<endl;
DES_Encrypt(Plaintext,Key,Ciphertext);
/* 加密后输出 */
cout<<"得到的密文是:"<<endl;
print64(Ciphertext);
if(isInput)
{
cout<<"相应的字符串为:";
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
ch=Ciphertext[i*8+j];
ch<<=1;
}
}
converse(Ciphertext);
string str(Ciphertext.to_string());
for(i=0;i<8;i++)
{
bitset<8> text(str,i*8,8);
ch=text.to_ulong();
cout<<ch;
}
cout<<endl;
converse(Ciphertext);
cout<<endl;
}
/* 用DES对密文进行解密操作 */
cout<<"开始解密?(Y/N)..."<<endl;
cin>>ch;
if(ch=='n')
{
cout<<"Good Bye!"<<endl;
exit(0);
}
DES_Decrypt(Plaintext,Key,Ciphertext);
/* 解密后输出 */
cout<<"得到的原文是:"<<endl;
if(isInput)
{
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
ch=Plaintext[i*8+j];
ch<<=1;
}
}
converse(Plaintext);
string str(Plaintext.to_string());
for(i=0;i<8;i++)
{
bitset<8> text(str,i*8,8);
ch=text.to_ulong();
cout<<ch;
}
cout<<endl;
}
else print64(Plaintext);
};
void useProgram(int flag)
{
if((flag!=Encrypt)&&(flag!=Decrypt))
{
cerr<<"error:unknow parameter!\n";
exit(0);
}
ifstream infile,keyfile;
ofstream outfile;
typedef bitset<8> bits8type;
vector<bits8type> text;
bitset<8> bits8;
bitset<64> Plaintext,Key,Ciphertext;
char * filename;
char ch;
string str;
int i,j,CheckParity;
if(flag==Encrypt) filename="plain.txt";
else if(flag==Decrypt) filename="cipher.txt";
infile.open(filename,ios_base::in);
/* 确认文件是否正确打开 */
if(!infile)
{
cerr<<"error:unable to open input file!\n";
exit(0);
}
/* 从文件读入明文(或密文)的每个字符并存放到text中 */
while(!infile.eof())
{
infile.get(ch);
for(j=0;j<8;j++)
{
bits8[7-j]=ch&1;
ch>>=1;
}
text.push_back(bits8);
}
infile.close();
text.pop_back();
/*如果字符总数不是8的整数倍,用空字符填充使之成为8的整数倍*/
int size=text.size()%8;
if(size!=0)
for(i=0;i<(8-size%8);i++)
{
ch=' ';
for(j=0;j<8;j++)
{
bits8[7-j]=ch&1;
ch>>=1;
}
text.push_back(bits8);
}
/* 读入密钥并加入奇偶校验位 */
keyfile.open("key.txt",ios_base::in);
if(!keyfile)
{
cerr<<"error:unable to open input file!\n";
exit(0);
}
for(i=0;i<8;i++)
{
keyfile.get(ch);
for(j=0;j<8;j++)
{
if(ch&1)
Key.set((8-i)*8-(8-j));
else Key.reset((8-i)*8-(8-j));
ch>>=1;
}
CheckParity=((Key.count()%2==0)?0:1);//奇偶校验,如果有奇数个1,则奇偶校验位为1,否则为零
if(CheckParity)
Key.set((8-i)*8-1);
else Key.reset((8-i)*8-1);
}
/* 打开文件准备输出 */
if(flag==Encrypt) filename="cipher.txt";
else if(flag==Decrypt) filename="plaint.txt";
else
{
cerr<<"error:unknow parameter!\n";
}
outfile.open(filename,ios_base::out);
if(!outfile)
{
cerr<<"error:unable to open output file!\n";
exit(0);
}
/* 分组并加密(解密) */
int groups=text.size()/8;
for(i=0;i<groups;i++)
{
/* 将第i组加密 */
for(j=0;j<8;j++)
{
for(int k=0;k<8;k++)
{
Plaintext[8*j+k]=text[i*8+j][k];
}
}//end of j
if(flag==Encrypt)
{
cout<<endl<<"正在对第"<<i<<"组进行加密..."<<endl;
DES_Encrypt(Plaintext,Key,Ciphertext);
converse(Ciphertext);
str=Ciphertext.to_string();
}
else if(flag==Decrypt)
{
cout<<endl<<"正在对第"<<i<<"组进行解密..."<<endl;
DES_Decrypt(Plaintext,Key,Ciphertext);
converse(Plaintext);
str=Plaintext.to_string();
}
/* 将密文(明文)写入文件*/
for(j=0;j<8;j++)
{
bitset<8> temp(str,j*8,8);
ch=temp.to_ulong();
outfile.put(ch);
}//end of j
}//end of i
if(flag==Encrypt)
cout<<"加密结束,已将密文存入copher.txt文件中!"<<endl;
else cout<<"解密结束,已将明文存入plaint.txt文件中!"<<endl;
outfile.close();
};
void main()
{
char choice;
string welcome=
"////////////////////////////////////////////////////////////////////////////\n"
"// //\n"
"//=========================欢迎使用DES密码系统============================//\n"
"// //\n"
"//说明:从屏幕输入明文(只能是8个字符)和密钥请按1; //\n"
"// 从文件读入明文(长度无限制)和密钥进行加密请按2; //\n"
"// 从文件读入密文(长度无限制)和密钥进行解密请按3; //\n" //\n"
"// 退出程序请按0; //\n"
"//注: 如果从文件读入,则需要将明文存入in_file.txt文件中,将密钥存入 //\n"
"// key_file.txt文件中,如果解密还需将密文存入文件中. //\n"
"// //\n"
"// 作者:李德 ld80118@sohu.com 版本:1.1 开发日期:2003.4 //\n"
"////////////////////////////////////////////////////////////////////////////\n" ;
cout<<welcome;
do
{
cout<<"您的选择是:";
cin>>choice;
switch(choice)
{
case'0':exit(0);
case'1':isdetialprint=true;//将各个步骤进行详细打印
testProgram();
break;
case'2':useProgram(Encrypt);break;
case'3':useProgram(Decrypt);break;
default:cout<<"错您的输入有误,请重试!"<<endl;
}
}while((choice!='0')&&(choice!='1')&&(choice!='2')&&(choice!='3'));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -