维吉尼亚密码简介和C/C++语言实现
2022/11/7 1:24:02
本文主要是介绍维吉尼亚密码简介和C/C++语言实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
特点
引进了密钥,是一种二维加密
加密流程
将A-Z的26个字母(不区分大小写)进行0~26编号,从第一位开始,每一位:密文=【密钥+明文】mod26。(密钥可循环)
解密流程
跟加密流程逆着来,每一位:明文=【密文-密钥】mod26。(最后取正)
代码
#include"iostream" using namespace std; #define MINCHAR 97 #define CHARSUM 26 char table[CHARSUM][CHARSUM]; bool Init(); bool Encode(char* key, char* source, char* dest); bool Dncode(char* key, char* source, char* dest); int main() { if(!Init()) { cout << "初始化错误!" << endl; return 1; } char key[256]; char str1[256]; char str2[256]; int operation; while(1) { do { cout << "请选择一个操作:1. 加密;2. 解密;-1. 退出 "; cin >> operation; }while(operation != -1 && operation != 1 && operation != 2); if(operation == -1) return 0; else if(operation == 1)//加密 { cout << "请输入密钥:"; cin >> key; cout << "请输入待加密字符串:"; cin >> str1; Encode(key, str1, str2); cout << "加密后的字符串:" << str2 << endl; } else if(operation == 2)//解密 { cout << "请输入密钥:"; cin >> key; cout << "请输入待解密字符串:"; cin >> str1; Dncode(key, str1, str2); cout << "解密后的字符串:" << str2 << endl; } cout << endl; } return 0; } // 初始化维吉尼亚方阵 bool Init() { int i, j; for(i = 0; i < CHARSUM; i++) { for(j = 0; j < CHARSUM; j++) { table[i][j] = 65 + (i + j) % CHARSUM; } } return true; } // 加密 // key:密钥 // source:待加密的字符串 // dest:经过加密后的字符串 bool Encode(char* key, char* source, char* dest) { char* tempSource = source; char* tempKey = key; char* tempDest = dest; do { *tempDest = table[(*tempKey) - MINCHAR][(*tempSource) - MINCHAR]; tempDest++; if(!(*(++tempKey))) tempKey = key; }while(*tempSource++); dest[strlen(source)] = 0; return true; } // 解密 // key:密钥 // source:待解密的字符串 // dest:经过解密后的字符串 bool Dncode(char* key, char* source, char* dest) { char* tempSource = source; char* tempKey = key; char* tempDest = dest; char offset; do { offset = (*tempSource) - (*tempKey); offset = offset >= 0 ? offset : offset + CHARSUM; *tempDest = MINCHAR + offset; tempDest++; if(!(*(++tempKey))) tempKey = key; }while(*++tempSource); dest[strlen(source)] = 0; return true; }
效果如图:
确定密钥长度m
Kasiski测试法
简介:
Kasiski测试法是由Friedrich Kasiski于1863年给出了其描述,然而早在约1854年这一方法就由Charles Babbage首先发现。它主要基于这样一个事实:两个相同的明文段将加密成相同的密文段,它们的位置间距假设为δ,则δ≡0(mod m)。反过来,如果在密文中观察到两个相同的长度至少为3的密文段,那么将给破译者带来很大方便,因为它们实际上对应了相同的明文串。 使用流程:
搜索长度至少为3的相同的密文段,记下其离起始点的那个密文段的距离。假如得到如下几个距离δ₁,δ₂,…,那么,可以猜测m为这些δi的最大公因子的因子。 例如:
密钥:FORESTFORESTFORESTFORESTFOR 明文:better to do well than to say well 密文: GSKXWKYCUSOXQZKLSGYCJEQPJZC 第一个YC出现后到第二个YC的结尾一共有12个字母,那么密钥的长度应是12的约数1,2,3,4,6,12之中的一个。 当密文很长的时候,可以找出几组重复的密文段,找出它们间距的相同约数,就是密钥长度。
这篇关于维吉尼亚密码简介和C/C++语言实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享
- 2024-11-22ansible 的archive 参数是什么意思?-icode9专业技术文章分享
- 2024-11-22ansible 中怎么只用archive 排除某个目录?-icode9专业技术文章分享
- 2024-11-22exclude_path参数是什么作用?-icode9专业技术文章分享
- 2024-11-22微信开放平台第三方平台什么时候调用数据预拉取和数据周期性更新接口?-icode9专业技术文章分享
- 2024-11-22uniapp 实现聊天消息会话的列表功能怎么实现?-icode9专业技术文章分享
- 2024-11-22在Mac系统上将图片中的文字提取出来有哪些方法?-icode9专业技术文章分享
- 2024-11-22excel 表格中怎么固定一行显示不滚动?-icode9专业技术文章分享
- 2024-11-22怎么将 -rwxr-xr-x 修改为 drwxr-xr-x?-icode9专业技术文章分享
- 2024-11-22在Excel中怎么将小数向上取整到最接近的整数?-icode9专业技术文章分享