📄 myenc.cpp
字号:
#include "iostream.h"
#include "string.h"
#include "stdio.h"
char key[5];
bool keyBin[45]; //预留5位
/*字符转换为二进制的函数
输入参数:
charArray: 要转换的字符数组
charCount: 要转换的字符个数
输出参数:
binArray: 转换结果的二进制数组
*/
void Char2Bin(char charArray[],bool binArray[],int charCount)
{
char ch;
for(int i=0;i<charCount;i++)
{
ch=charArray[i];
for(int k=7;k>=0;k--)
{
binArray[i*8+k]=(ch & 0x1)?1:0;
ch>>=1;
}
}
return ;
}
/*取得初始密钥二进制的函数*/
void GetKeyBin()
{
Char2Bin(key,keyBin,5); //密钥转换为二进制
for(int i=0;i<5;i++)
keyBin[40+i]=keyBin[i];
}
/*密钥二进制左移位的函数*/
void ShiftKeyBin()
{
bool temp;
temp=keyBin[0];
for(int i=0;i<44;i++)
keyBin[i]=keyBin[i+1];
keyBin[44]=temp;
}
/*二进制转换为字符的函数
输入参数:
binArray: 要转换的二进制数组
binCount: 二进制位数
输出参数:
charArray: 转换结果的字符数组
*/
void Bin2Char(bool binArray[],char charArray[],int binCount)
{
int i,j,m=7,k=0;
char temp=NULL;
for(i=0;i<binCount;i+=8)
{
for(j=i;j<i+8;j++)
temp=temp|(binArray[j]<<m--);
charArray[k++]=temp;
m=7;temp=NULL;
}
}
/*将二进制数组按矩阵形式输出(仅做测试用)
输入参数:
binArray: 要输出的二进制数组
length: 二进制位数
msg: 输出时显示的提示信息
columns: 输出的列数
输出参数: 无
*/
void OutBits(bool binArray[],int length,char *msg,int columns)
{
cout<<msg<<endl;
for(int i=0;i<length;i++)
{
cout<<binArray[i]<<" ";
if(i%columns==(columns-1)) cout<<endl;
}
}
/*对每组明文加密的函数
输入参数:
plainGroup: 一组明文(5个字符)
key: 密钥(5个字符)
输出参数:
cipherGroup: 一组密文结果(8个字符)
*/
void EncGroup(char plainGroup[5],char cipherGroup[8])
{
bool pGrpBin[40];
Char2Bin(plainGroup,pGrpBin,5); //一组明文转换为二进制
ShiftKeyBin();
int n,i,j;
bool temp;
for(i=0;i<40;i++)
{
n=keyBin[i]*32+ //取6位
keyBin[i+1]*16+
keyBin[i+2]*8+
keyBin[i+3]*4+
keyBin[i+4]*2+
keyBin[i+5];
if(n>39) n%=39;
temp=pGrpBin[i];
pGrpBin[i]=pGrpBin[n];
pGrpBin[n]=temp;
}
char ch;
for(i=0,j=0;i<40;i+=5,j++)
{
ch=pGrpBin[i]*16+ //取5位
pGrpBin[i+1]*8+
pGrpBin[i+2]*4+
pGrpBin[i+3]*2+
pGrpBin[i+4];
if(ch<=9)
ch+=48;
else
ch+=55;
cipherGroup[j]=ch;
}
}
/*加密一段文本的函数
输入参数:
plainSegment: 一段明文文本
key: 密钥(5个字符)
输出参数:
cipherSegment:一段密文结果
*/
void EncSegment(char *plainSegment,char *cipherSegment)
{
int len,groupCount;
len=strlen(plainSegment);
groupCount=len/5;
for(int i=0;i<groupCount;i++)
EncGroup(plainSegment+i*5,cipherSegment+i*8);
char lastGroup[5];
int lastCount=len%5;
if(lastCount!=0)
{
strcpy(lastGroup,plainSegment+i*5);
for(int j=lastCount;j<5;j++)
lastGroup[j]='0';
EncGroup(lastGroup,cipherSegment+i*8);
cipherSegment[i*8+8]='\0';
}else
cipherSegment[i*8]='\0';
}
/*对每组密文解密的函数
输入参数:
cipherGroup: 一组密文(8个字符)
key: 密钥(5个字符)
输出参数:
plainGroup: 一组明文结果(5个字符)
*/
void DecGroup(char cipherGroup[8],char plainGroup[5])
{
bool cGrpBin[64],cGrpBin2[40];
int n=0,i,j;
for(i=0;i<8;i++)
{
if(cipherGroup[i]<=57)
cipherGroup[i]=cipherGroup[i]-48;
else
cipherGroup[i]=cipherGroup[i]-55;
}
Char2Bin(cipherGroup,cGrpBin,8);
for(i=3;i<=59;i+=8)
for(j=i;j<=i+4;j++)
cGrpBin2[n++]=cGrpBin[j];
ShiftKeyBin();
bool temp;
for(i=39;i>=0;i--)
{
n=keyBin[i]*32+
keyBin[i+1]*16+
keyBin[i+2]*8+
keyBin[i+3]*4+
keyBin[i+4]*2+
keyBin[i+5];
if(n>39) n%=39;
temp=cGrpBin2[i];
cGrpBin2[i]=cGrpBin2[n];
cGrpBin2[n]=temp;
}
Bin2Char(cGrpBin2,plainGroup,40);
}
/*解密一段密文的函数
输入参数:
cipherSegment: 一段密文文本
key: 密钥(5个字符)
输出参数:
plainSegment: 一段明文结果
*/
void DecSegment(char *cipherSegment,char *plainSegment)
{
int len,groupCount;
len=strlen(cipherSegment);
groupCount=len/8;
for(int i=0;i<groupCount;i++)
DecGroup(cipherSegment+i*8,plainSegment+i*5);
plainSegment[i*5]='\0';
}
void main()
{
char plainSegment[1000];
char key[6]="00000";
cout<<"输入明文(少于1000字符):"<<endl;
gets(plainSegment);
cout<<"输入密钥(5个字符,多余的忽略):"<<endl;
gets(key);
//加密操作
GetKeyBin();
int len=strlen(plainSegment);
//char *cipherSegment=new char[len*(8/5)+8];
char cipherSegment[2000];
EncSegment(plainSegment,cipherSegment);
cout<<"密文:"<<endl<<cipherSegment<<endl;
//解密操作
GetKeyBin();
len=strlen(cipherSegment);
//char *decSegment=new char[len*(5/8)+15];
char decSegment[1000];
DecSegment(cipherSegment,decSegment);
cout<<"解密结果:"<<endl<<decSegment<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -