⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myenc.cpp

📁 自己编写的自创的加密/解密算法的小程序,原理是将明文变成二进制,再按规则置乱二进制位,再变回文本,得到密文.是命令行运行方式的.
💻 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 + -