IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Playfair加密算法(C 实现) -> 正文阅读

[C++知识库]Playfair加密算法(C 实现)

一、主要函数解析

1、Creat_Key(char* s,int L, char Matrix[5][5])
生成密钥Matrix矩阵
2、Encrypt(char Matrix[5][5],int L, char* s, char *s0, bool reverse)
根据密钥矩阵加密或解密
加密:s为明文,s0为密文字符串存储位置,reverse=0
解密:s为密文,s0为明文字符串存储位置,reverse=1

二、注意事项

1、字符串只能含有字母
2、已禁用字母j/J
3、字符均以大写形式处理(已自动转换,输入时大小写均可)

三、演示图

4、代码

#include <stdio.h>
#include <stdlib.h>

//MAtrix生成
void Creat_Key(char* s,int L, char Matrix[5][5]) {
	//s是否为空
	if (s == NULL) {
		printf("字符串s为空!");
		return;
	}

	//辅助数组(1有0无-1禁用)
	int alphabet[26];
	for (int i = 0; i < 26; i++) {
		alphabet[i] = 1;

	}
	alphabet['J' - 65] = -1;

	//删去字母表中s相关字母
	for (int i = 0; i < L; i++) {
		alphabet[s[i] - 65] = 0;
	}

	//填充Matrix
	int flag = 0;//指向Matrix下一空位
	for (int i = 0; i < L; i++) {
		if (alphabet[s[i] - 65] == 0) {
			Matrix[flag / 5][flag % 5] = s[i];
			alphabet[s[i] - 65] = -1;
			flag++;
		}
	}
	for (int i = 0; i < 26; i++) {
		if (alphabet[i] == 1) {
			Matrix[flag / 5][flag % 5] = i + 65;
			flag++;
		}
	}
}

//大小写转换函数
void F(char* s,int L) {
    for(int i=0;i<L;i++){
        if(s[i]>='a') s[i]-='a'-'A';
    }
}

//搜索字母位置
void Find(char Matrix[5][5], char c,char c0,int *p) {
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			if (Matrix[i][j] == c) {
				p[0] = i;
				p[1] = j;
			}
			if (Matrix[i][j] == c0) {
				p[2] = i;
				p[3] = j;
			}
		}
	}
}

//reverse=0加密,reverse=1解密
//加密:同行向右 同列向下 否则顺时
//解密:与加密相反
void Encrypt(char Matrix[5][5],int L, char* s, char *s0, bool reverse) {
	//s是否为空
	if (s == NULL) {
		printf("字符串s为空!");
		return;
	}
	char* ret=s0;
	int Temp[2][2];
	for (int i = 0; i < L; i += 2) {
		int p0[4];
		Find(Matrix, s[i],s[i+1],p0);
		Temp[0][0] = p0[0];
		Temp[0][1] = p0[1];
		Temp[1][0] = p0[2];
		Temp[1][1] = p0[3];

		if (Temp[0][0] == Temp[1][0]) {//同行
			ret[i] = Matrix[Temp[0][0]][((Temp[0][1] + 1 - reverse * 2)+5) % 5];
			ret[i + 1] = Matrix[Temp[1][0]][((Temp[1][1] + 1 - reverse * 2)+5) % 5];
		}
		else {
			if (Temp[0][1] == Temp[1][1]) {//同列
				ret[i] = Matrix[((Temp[0][0] + 1 - reverse * 2)+5) % 5][Temp[0][1]];
				ret[i + 1] = Matrix[((Temp[1][0] + 1 - reverse * 2)+5) % 5][Temp[1][1]];
			}
			else {//否否
				if ((Temp[0][0] - Temp[1][0]) * (Temp[0][1] - Temp[1][1]) * (2 * (!reverse + 1) - 3) > 0) {
					ret[i] = Matrix[Temp[0][0]][Temp[1][1]];
						ret[i + 1] = Matrix[Temp[1][0]][Temp[0][1]];
				}
				else {
					ret[i] = Matrix[Temp[1][0]][Temp[0][1]];
						ret[i + 1] = Matrix[Temp[0][0]][Temp[1][1]];
				}

			}
		}
	}
}

void Printf(char* p,int Begin, int End){
    for(int i=Begin;i<=End;i++){
        printf("%c",p[i]);
    }
}

int main(){
    
    //密钥生成字符串
	int L;
	printf("请输入密钥生成字符串长度:");
	scanf("%d",&L);
	printf("\n");
	
	char *K_S = (char *)malloc(sizeof(char)*(L+1));
	printf("请输入密钥生成字符串:");
	scanf("%s",K_S);
	printf("\n");
	F(K_S,L);
	
	//密码表编制
	char Matrix[5][5];
	printf("密码表编制:\n");
	printf("密码表如下:\n");
	Creat_Key(K_S, L,  Matrix);
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			printf("%c ", Matrix[i][j]);

		}
		printf("\n");
	}

	printf("\n");

	//明文
	int L0;
	printf("请输入明文长度:");
	scanf("%d",&L0);
	printf("\n");
	
	char *C_S = (char *)malloc(sizeof(char)*(L0+1));
	printf("请输入明文:");
	scanf("%s",C_S);
	printf("\n");
	F(C_S, L0);

	//加密
	char *s2=(char *)malloc(L0);
	Encrypt(Matrix, L0, C_S,s2, 0);
	
	printf("\n加密:\n明文:");
	Printf(C_S,0,L0-1);
	printf(" -> 密文:");
	Printf(s2,0,L0-1);
	
	printf("\n");

	//解密
	char *s3=(char *)malloc(L0);
	Encrypt( Matrix, L0, s2,s3, 1);

	printf("\n解密:\n密文:");
	Printf(s2,0,L0-1);
	printf(" -> 明文:");
	Printf(s3,0,L0-1);

	printf("\n");

	system("pause");
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 21:57:07  更:2022-03-11 21:57:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:43:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码