单表代替密码
Posted saltedcorgi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单表代替密码相关的知识,希望对你有一定的参考价值。
凯撒密码
Caser密码是古典加密的一种,由Julius Caser发明,当时发明的那种就是将26个英文字母按字母表循环移位,按顺序依次a -> d , b -> e , c -> f......根据移位不同统称为移位密码。
按照密码体制五元组
P = { a,b,c......z }
C = { a,b,c......z }
K = { 0,1,2......25 }
若是Caser密码,得到加密算法
E p = ( p + 3 ) mod 26
若移位可以是任意整数,得到加密算法
E p = ( p + k ) mod 26
得到解密算法
D c = ( c - k ) mod 26
注:mod为模算数即取余
因为密钥空间只可能有26种,而至多测试25种即能获得k,用穷举攻击是很容易实现的。
单表代替密码
若移位密码的密钥空间允许任意代替,则能得到26!种可能密钥,成为单表代替密码,急剧增大了密钥空间,可以抵挡穷举攻击,但由于语言使用的一些统计学规律仍然可以进行破解攻击。
字母频率分析解密
以英文为例,首先要把所有英文字母使用相对频率统计出来,和给定的密文的字母频率进行比较,但这种方法需要保证已知密文足够长,且在一些近似频率字母之间需要人为分析结果。
已知英文字母表单字母替换出现频率较高的五位为e、t、a、o、i。
C语言实现
- 实现功能:
- 命令输入错误的检查
- 实现对所有文件的加解密
- 实现移位密码已知密钥的加解密,大小写敏感,明密文非字母保留
- 增加了移位密码未知密钥使用字母频度分析解密
- 实现环境:
- 操作系统:Windows10
- 编译环境:Code::Blocks
- 实现截图:
可以改进的地方:
主要是在未知密钥解密方面,如果用任意单表替换方法加密,那么解密使用字母频率分析是需要人为介入的,在写程序中为了方便就只对移位密码使用字母频率分析做了简单解密。在已知密文长度不够情况下,字母频率可能出现相近或相同,则可以对出现频率高的取前三位来显示进行人为选择,为了方便亦没有实现这一功能。- 实现代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void Encrypt(int key, char infilename[], char outfilename[]);//加密函数
void Decrypt(int key, char infilename[], char outfilename[]);//解密函数
void frequency(char infilename[], char outfilename[]);//频率分析解密函数
int Character(char);//字符判断函数
int main(int argc, char *argv[]){
if (argc != 5 || argv[1][0] != '-' || argv[1][2] != '