?? des.cpp
字號:
}
/* 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="plaint.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);
//cout<<"ch="<<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="new_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++)
{
if(flag==Encrypt)
Plaintext[8*j+k]=text[i*8+j][k];
else if(flag==Decrypt)
Ciphertext[8*j+k]=text[i*8+j][k];
}
}//end of j
if(flag==Encrypt)
{
//cout<<"正在對第"<<i<<"組進行加密..."<<endl;
DES_Encrypt(Plaintext,Key,Ciphertext);
converse(Ciphertext);
str=Ciphertext.to_string();
}
else if(flag==Decrypt)
{
//cout<<"正在對第"<<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<<"加密結束,已將密文存入cipher.txt文件中!"<<endl;
else cout<<"解密結束,已將明文存入new_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 + -