凯撒密码转换器
凯撒密码是最著名的加密技术之一,其历史可以追溯到古代。凯撒密码以朱利叶斯·凯撒 (Julius Caesar) 的名字命名,据信他使用这种方法来保护军事通信,凯撒密码仍然是密码学研究的基石。它的简单性和历史意义使其成为任何有兴趣学习加密和解密技术的人的理想起点。
凯撒密码的工作原理
凯撒密码的核心是替代密码。纯文本中的每个字母都会在字母表中向上或向下移动固定数量的位置。偏移由数字密钥决定,该密钥必须在发送方和接收方之间共享,以确保解密成功。
例如,如果键为 3,则字母 “A” 变为 “D”,“B” 变为 “E”,依此类推。知道密钥的接收者可以反转此转变以解码消息,将密文转换回原始明文。在不知道密钥的情况下,消息仍然无法破译,从而提供基本级别的安全性。
凯撒密码的实际应用
假设我们使用的是 key 3:
- 明文:HELLO
- 密文:KHOOR
在此示例中,单词“HELLO”的每个字母在字母表中向前移动了三位,从而生成密文“KHOOR”。
凯撒密码的变体:ROT13 简介
凯撒密码的一个众所周知的变体是 ROT13,它代表“旋转 13 位”。这种密码因其简单性而特别受欢迎:它将字母表的每个字母移动 13 位。由于字母表有 26 个字母,因此应用 ROT13 两次将返回原始文本,这使其成为一种简单而有效的方法,无需永久加密即可隐藏文本。
ROT13 经常在网上用于隐藏剧透、笑话或谜题的答案。由于很容易反转,如果观众愿意,他们可以快速解码信息。
Caesar Cipher 简化加密和解密
通过提供手动和自动解密功能来增强经典方法。您可以:
- 加密:选择一个密钥,该工具将移动您的文本,将其打乱为密文。
- 解密:输入密文,该工具将反转移位,前提是您知道密钥。
- 猜出密钥:如果密钥未知,该工具可以进行有根据的猜测并尝试自动解密消息。
这使其成为学习、实验甚至实际加密任务的理想选择。此外,该工具的内置源代码是可访问的,允许开发人员为自定义项目调整和扩展其功能。
破解凯撒密码
尽管具有历史意义,但以现代标准来看,凯撒密码并不安全。只需尝试所有 25 个可能的键(不包括原始的未移位文本)即可破解它。这种暴力破解方法最终会显示正确的明文。
破解凯撒密码的更复杂的方法涉及频率分析。此技术利用了某些字母在给定语言中更频繁地出现这一事实。通过将密文中字母的频率与语言中已知的字母频率进行比较,可以更快、更准确地猜出密钥。
要破解凯撒密码,算法必须确定加密文本与每个可能的解密字符串之间的最小距离。我开发了一种解密工具,可以通过智能猜测正确的密钥来破解任何 Caesar Cipher。该工具的工作原理是分析加密文本中的频率模式,并将其与语言中字母的预期频率分布进行比较,从而能够准确确定密钥并解密消息:
function caesar ( str, n ) { let ret = “” ; for ( let i = 0 ; i < str. length ;i++) { let c = str。 charCodeAt (i) 的 if ( 97 <= c & c < 123 ) {
ret += String。 fromCharCode ((c + n + 7 ) % 26 + 97 );
} else if ( 65 <= c & c < 91 ) {
ret += String.fromCharCode ((c + n + 13 ) % 26 + 65 );
} else {
ret += str. charAt (i) ;
}
} return ret;
}
在我们的破解算法中,我们首先分析加密的字符串以生成一个数组,该数组捕获每个字母的频率。此数组表示密文的简单频率统计信息。接下来,我们将此频率表与目标语言中字母的标准频率表进行比较。最后一步涉及计算加密文本的频率模式与每个可能的解密版本之间的最小距离。这使我们能够识别最可能的密钥并成功解密消息。
function crack_caesar ( str ) { const weight = [ 6,51 , 1,89 , 3,06 , 5,08 , 17,4 , 1.66 、 3.01 、 4.76 、 7.55 、 0.27 、 1.21 、 3.44 、 2.53 、 9.78 、 2.51 、 0.29 、 0.02 、 7.00 、 7.27 、 6.15 、 4.35 、 0.67 、 1.89 、 0.03 、 0.04 、 1.13 ]; const c = 数组 ( 26 )。 填充 ( 0 ); const s = 数组 ( 26 )。 填充 ( 0 ); for ( let i = 0 ; i < str. 长度 ;++i) { let x = (str.charCodeAt charCodeAt(i) | 32 ) - 97 ; 如果 ( 0 <= x & x < 26 ) {
++c[x];
}
} let max = 0 ; for ( let off = 0 ;off < 26 ; ++off) { for ( let i = 0 ; i < 26 ; ++i) {
s[off] += 0.01 * c[i] * weight[(i + off) % 26 ]; if (max < s[off]) {
max= s[off];
}
}
} return( 26 - s. indexOf (max)) % 26 ;
} const str = caesar ( “这就是编码永无止境的故事。” , 16 ); //test
通过将 crack_caesar() 函数与变量 str 一起使用,可以确定使用的键是 16。您可以在此站点的开头试用此脚本,以查看解密过程的实际效果。