📄 main.cpp
字号:
//////////////////////////////////////////
//
// FileName: main.cpp
// Creator: Du Feilong
// Date: 2007-10-11
// Comment: main文件实现加密和解密
//
//////////////////////////////////////////
#include<string.h>
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<string>
#include <vector>
#include <cstdlib>
#include<stdlib.h>
#include<time.h>
using namespace std;
int IV[64]={1,1};
int Key0[48],Key1[48],Key2[48],Key3[48],Key4[48];
int DesIPC[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};
int DesIP2[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};
int startdata[64];
int finaldata[64];
int l0[32],l1[32],l2[32],l3[32],l4[32],r0[32],r1[32],r2[32],r3[32],r4[32];
struct data
{
int a[64];
data()
{
for(int i=0;i<64;i++)
a[i]=0;
}
};
vector<data> datain;
void F(int *R1,int *L0,int *R0,int *Key1);
void createkey(int *Key1,int *Key2,int *Key3,int *Key4);
///////////////////////////////////////////////////////////////////////////////////////////////////////
void vectordisplayjiemi(vector<data> datain)
{
cout<<"the datain is: "<<endl;
for(int i=0;i<(int)datain.size();i++){
for(int j=0;j<64;j++){
if(j!=0&&j%8==0)
cout<<endl;
cout<<datain[i].a[j]<<" ";
}
cout<<"\n\n";
}
}
void getdatajiemi(ifstream &fin)
{
char n=0x00;
data tempdata;
int k=0;
fin.read((char *)&n, sizeof(n));
while(!fin.eof()){
while(!fin.eof()&&k<8){
for(int i=7;i>=0;i--){
tempdata.a[k*8+i]=n&1;
n=n>>1;
}
fin.read((char *)&n, sizeof(n));
k++;
}
if(k==8){
k=0;
datain.push_back(tempdata);
for(int i=0;i<64;i++)
tempdata.a[i]=0;
}
if(fin.eof()){
fin.close();
}
}
fin.close();
}
void Desconversion1jiemi()
{
int i;
int temp[64];
for(i=0;i<64;i++)
temp[i]=startdata[i];
for(i=0;i<64;i++)
startdata[i]=temp[DesIPC[i]];
}
void Desconversion2jiemi()
{
int i;
int temp[64];
for(i=0;i<64;i++)
temp[i]=finaldata[i];
for(i=0;i<64;i++)
finaldata[i]=temp[DesIP2[i]];
}
void desdividejiemi()
{
int i;
for(i=0;i<32;i++)
r0[i]=startdata[i];
for(i=0;i<32;i++)
l0[i]=startdata[i+32];
}
void Desjoinjiemi(int *a,int *b,int *c)
{
int i;
for(i=0;i<32;i++)
c[i]=a[i];
for(i=32;i<64;i++)
c[i]=b[i-32];
}
void displayfinaljiemi() //for test finaldata
{
cout<<"the final data is :"<<endl;
for(int i=0;i<64;i++){
if(i%16==0&&i!=0)
cout<<endl;
cout<<finaldata[i]<<" ";
}
cout<<endl;
}
void vec_startdatajiemi(int k)
{
if(k==0){
for(int i=0;i<64;i++)
startdata[i]=datain[k].a[i];
}
else{
for(int i=0;i<64;i++)
startdata[i]=datain[k].a[i];
}
}
void final_huanyuan(int flag,ofstream &jiemiout)
{
char n=0x00;
int i;
int e_or=0;
if(flag==0){
for(int i=0;i<64;i++)
finaldata[i]=finaldata[i]^IV[i];
}
else{
for(int i=0;i<64;i++)
finaldata[i]=finaldata[i]^datain[flag-1].a[i];
}
if(flag==datain.size()-1){
int lastnum=0;
for(i=56;i<64;i++){
lastnum=lastnum*2+finaldata[i];
}
for(i=0;i<64-8*lastnum;i++){
n=n|(0x01&finaldata[i]);
e_or++;
if(e_or==8){
jiemiout<<n;
n=0x00;
e_or=0;
}
n=n<<1;
}
}
else{
for(i=0;i<64;i++){
n=n|(0x01&finaldata[i]);
e_or++;
if(e_or==8){
jiemiout<<n;
n=0x00;
e_or=0;
}
n=n<<1;
}
}
}
void desjiemi(int flag,ofstream &jiemiout)
{
int i;
Desconversion1jiemi();
desdividejiemi();
for(i=0;i<32;i++)
r1[i]=l0[i];
F(l1,r0,l0,Key1);
for(i=0;i<32;i++)
r2[i]=l1[i];
F(l2,r1,l1,Key2);
for(i=0;i<32;i++)
r3[i]=l2[i];
F(l3,r2,l2,Key3);
for(i=0;i<32;i++)
r4[i]=l3[i];
F(l4,r3,l3,Key4);
Desjoinjiemi(l4,r4,finaldata);
Desconversion2jiemi();
// displayfinaljiemi();
final_huanyuan(flag,jiemiout);
}
void jiemi()
{
cout<<"输入要解密的文件"<<endl;
string jiemi_name;
cin>>jiemi_name;
cout<<"输入解密后的文件"<<endl;
string afterjiemi_name;
cin>>afterjiemi_name;
ofstream jiemiout(afterjiemi_name.c_str());
ifstream fin(jiemi_name.c_str(), ios::binary);
createkey(Key1,Key2,Key3,Key4);
for(int i=0;i<48;i++){
int temp=Key1[i];
Key1[i]=Key4[i];
Key4[i]=temp;
}
for(int i=0;i<48;i++){
int temp=Key2[i];
Key2[i]=Key3[i];
Key3[i]=temp;
}
getdatajiemi(fin);
for(int i=0;i<(int)datain.size();i++){
vec_startdatajiemi(i);
desjiemi(i,jiemiout);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
void vec_startdata(int k)
{
if(k==0){
for(int i=0;i<64;i++)
startdata[i]=datain[k].a[i]^IV[i];
}
else{
for(int i=0;i<64;i++)
startdata[i]=datain[k].a[i]^finaldata[i];
}
}
void Desconversion1()
{
int i;
int temp[64];
for(i=0;i<64;i++)
temp[i]=startdata[i];
for(i=0;i<64;i++)
startdata[i]=temp[DesIPC[i]];
}
void Desconversion2()
{
int i;
int temp[64];
for(i=0;i<64;i++)
temp[i]=finaldata[i];
for(i=0;i<64;i++)
finaldata[i]=temp[DesIP2[i]];
}
void Desjoin(int *a,int *b,int *c)
{
int i;
for(i=0;i<32;i++)
c[i]=a[i];
for(i=32;i<64;i++)
c[i]=b[i-32];
}
void vectordisplay(vector<data> datain)
{
cout<<"the vector number is: "<<datain.size()<<endl;
for(int i=0;i<(int)datain.size();i++){
for(int j=0;j<64;j++){
if(j!=0&&j%16==0)
cout<<endl;
cout<<datain[i].a[j];
}
cout<<"\n\n\n";
}
}
void getdatajiami(FILE *jiami)
{
srand((unsigned int)time(NULL));
data tempdata;
int k=0;
char n[8];
int numin;
while(1){
for(int i=0;i<8;i++)
n[i]=0x00;
numin=(int)fread(n,1,8,jiami);
if(numin<8){
for(int k=0;k<numin;k++){
for(int i=7;i>=0;i--){
tempdata.a[k*8+i]=n[k]&(0x01);
n[k]=n[k]>>1;
}
}
for(int k=numin;k<7;k++){
for(int i=7;i>=0;i--){
tempdata.a[k*8+i]=rand()%2;
}
}
char m=8-numin;
for(int i=7;i>=0;i--){
tempdata.a[7*8+i]=m&(0x01);
m=m>>1;
}
fclose(jiami);
datain.push_back(tempdata);
return;
}
else if(numin==8){
for(int k=0;k<8;k++){
for(int i=7;i>=0;i--){
tempdata.a[k*8+i]=n[k]&(0x01);
n[k]=n[k]>>1;
}
}
datain.push_back(tempdata);
}
}
}
void desdividejiami()
{
int i;
for(i=0;i<32;i++)
l0[i]=startdata[i];
for(i=0;i<32;i++)
r0[i]=startdata[i+32];
}
void displayfinal() //for test finaldata
{
cout<<"after jiami the data is :"<<endl;
for(int i=0;i<64;i++){
if(i%8==0&&i!=0)
cout<<endl;
cout<<finaldata[i]<<" ";
}
cout<<endl;
}
void final_miwen(int flag, FILE *afterjiami)
{
char n=0x00;
int i;
int e_or=0;
for(i=0;i<64;i++){
n=n|(0x01&finaldata[i]);
e_or++;
if(e_or==8){
fwrite(&n,1,1,afterjiami);
n=0x00;
e_or=0;
}
n=n<<1;
}
}
void desjiami(int flag, FILE *afterjiami)
{
int i;
Desconversion1();
desdividejiami();
for(i=0;i<32;i++)
l1[i]=r0[i];
F(r1,l0,r0,Key1);
for(i=0;i<32;i++)
l2[i]=r1[i];
F(r2,l1,r1,Key2);
for(i=0;i<32;i++)
l3[i]=r2[i];
F(r3,l2,r2,Key3);
for(i=0;i<32;i++)
l4[i]=r3[i];
F(r4,l3,r3,Key4);
Desjoin(r4,l4,finaldata);
Desconversion2();
final_miwen(flag, afterjiami);
}
void jiami()
{
FILE *jiami;
string jiami_name;
cout<<"输入要加密的文件"<<endl;
while(1){
cin>>jiami_name;
jiami=fopen(jiami_name.c_str(), "rb");
if(jiami==NULL){
cout<<"请输入正确的文件名"<<endl;
}
else{
break;
}
}
FILE *afterjiami;
string afterjiami_name;
cout<<"输入要加密后的文件"<<endl;
while(1){
cin>>afterjiami_name;
afterjiami=fopen(afterjiami_name.c_str(), "rb");
if(afterjiami==NULL){
cout<<"请输入正确的文件名"<<endl;
}
else{
break;
}
}
createkey(Key1,Key2,Key3,Key4);
getdatajiami(jiami);
afterjiami=fopen(afterjiami_name.c_str(),"wb");
for(int i=0;i<(int)datain.size();i++){
vec_startdata(i);
if(i==datain.size()-1)
desjiami(1,afterjiami);
else
desjiami(0,afterjiami);
}
fclose(afterjiami);
}
int main()
{
int n;
cout<<"加密请输入1,解密请输入2,退出请输入0"<<endl;
while(1){
cin>>n;
if(n==1){
jiami();
cout<<"\n加密成功!\n"<<endl;
cout<<"加密请输入1,解密请输入2,退出请输入0"<<endl;
}
if(n==2){
jiemi();
cout<<"\n解密成功\n"<<endl;
cout<<"加密请输入1,解密请输入2,退出请输入0"<<endl;
}
if(n==0)
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -