历史著名密码(凯撒密码、简单替换密码、Enigma)

凯撒密码

公元前100多年凯撒发明的一种密码,简单来说是平移密码,也就是将字母位置向后移动一定位数。

如原文是ABCDEFG,密钥为3,加密后就是DEFGHIJ。

以密钥的数字向后平移了三位,如果密钥是5就是平移五位。

凯撒密码最简单的破译方式为穷举法(暴力破解法),一共只有26个字母,平移25次并将平移后的字符串进行比较,就能取得最后的原文。


简单替换密码

简单替换密码是凯撒密码的升级版,将平移替换为无序对应。

如原文是ABCDEFGHIJKLMNOPQRSTUVWXYZ,替换后为QWERTYUIOPASDFGHJKLZXCVBNM,中间将没有信息关联,需双方各执一份对照表,才能解码。

简单替换法很难用穷举法来破解,因为明文中的A可以对应所有26个字母,而B可以对应除A对应的字母意外的25个字母,那么我们计算一下26个字母需要的密钥数量为26 X 25 X 24 X......... X 2 = 403291461126605635584000000,密钥的数量太大,用暴力破解,即便每秒遍历10亿个密码,要遍历万需要将近120亿年。

所以简单替换法要用频率分析来破解密码: 

假设我们得到了一大串加密后的密文,我们统计所有密文中的所有字符出现的次数,最后得出一个其中一个字符(如“A”)的使用平率最高,那么我们将英文字母按照出现频率排序:ETAOINSHRDLUCMFWGYPBVKJQZ,根据这个线索,我们将密文中的“A”替换为E,我们将所有密文中的“A”替换为E,根据英文中最常见的单词是the,我们找出密文“A”前面两个字符都一样的出现最多的字符串,如“FEA”,将其替换为"THE",这么来看密文“F”对应的应该是T,密文“E”对应的应该是H,我们将密文中的所有的“F”和“E”替换为T和H。我们再动员所有的英语词汇,比如密文中有一段“FEPZZ”,我们可以将前面已知对应的密文进行解密,TH“PZZ”这时可以套用英文单词three进行测试,将“FEPZZ”替换为THREE,那么“P”对应的应该是R,而“Z”对应的应该是E,以此类推,我们将所有密码破译出来。

总结几条:

1、除了高频字母外,低频字母也能是线索。

2、搞清楚开头和结尾能个成为线索,高清单词之间的分割也能够成为线索。

3、密文越长越容易被破解。

4、同一个字符连续出现能够成为线索。

5、破解的速度会越来越快。


Enigma

Enigma是德国人谢尔比乌斯发明的能个进行加密和解密操作的机器,发送者和接收者都必须各自拥有一台Enigma,而且必须有一份相同的密码本,所以Enigma相当于一个加强版的简单替换密码。在二战时被现代计算机鼻祖图灵同志破解密钥。

凯撒密码是一种简单替换密码,通过将字母按照一个固定的偏移量进行替换来加密消息。要使用穷举法破解凯撒密码,可以尝试所有可能的偏移量并解密消息,然后根据解密后的文本判断是否有意义。 在MATLAB中实现凯撒密码的穷举法破解可以像这样: ```matlab function plaintext = caesarCrack(ciphertext) alphabet = 'abcdefghijklmnopqrstuvwxyz'; maxShift = 25; % 最大偏移量 for shift = 1:maxShift plaintext = caesarDecrypt(ciphertext, shift); % 判断解密后的文本是否有意义 if isMeaningful(plaintext) % 找到了有意义的解密结果 return; end end % 没有找到有意义的解密结果 plaintext = ''; end function plaintext = caesarDecrypt(ciphertext, shift) alphabet = 'abcdefghijklmnopqrstuvwxyz'; shiftedAlphabet = circshift(alphabet, -shift); plaintext = lower(translate(ciphertext, alphabet, shiftedAlphabet)); end function translatedText = translate(text, fromAlphabet, toAlphabet) [~, idx] = ismember(text, fromAlphabet); idx(idx == 0) = 1; % 处理空格等字符 translatedText = toAlphabet(idx);end function isMeaningful = isMeaningful(text) % 对解密后的文本进行有意义的判断,比如是否包含常见单词等 % 这里略过具体实现步骤 isMeaningful = true; % 假设所有解密结果都是有意义的 end ``` 使用上述代码,你可以将密文作为输入传递给`caesarCrack`函数,它会尝试从1到25的所有偏移量进行解密,并返回第一个有意义的解密结果。请注意,此代码只是一个基本示例,你可能需要根据实际需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值