什么是密码学
密码学(Cryptography)是一门提供信息安全和信息保护的科学,包括对信息的加密、验证、签名等等。在当前的互联网世界中,它无处不在。当你浏览网页,使用微信或qq等通信软件,发送电子邮件,连接Wifi等等时,都会自觉或不自觉地使用到密码学。
密码学本质上是一门应用数学,但现代密码学需要运用计算机技术来实现各种算法以及密码系统。因此作为程序员,如果从事网络通信或区块链等相关领域的研发工作,那么必要的密码学知识就是必须了解或掌握的。比如散列,对称与非对称加密,数字签名这些技术以及其背后的算法。
密码学的基本概念
加密和密钥
密码学最直接可见的用途就是加密:
密码学保障以安全的方式进行数据的存储和传输,使得只有那些预期的用户才能读取和处理数据。
这里所谓的安全的方式就是加密,包括对称加密与非对称加密。
对称加密是Symmetric encryption,对称加密算法如AES、SM4等;非对称加密是Asymmetric encryption,非对称加密算法如RSA、SM2等。
在加密过程中需要使用一个或多个密钥,未加密的数据称为明文,使用密钥对明文进行加密得到加密后的数据,称为密文。无论对称加密还是非对称加密,都是可逆的,即可以使用密钥对密文进行解密得到明文。
密钥的英文是key,加密是encrypt,解密是decrypt,明文是plaintext,密文是ciphertext。
对称加密使用相同的一个密钥来加密和解密,而非对称加密使用公钥密码系统提供的密钥对:公私钥。
公私钥不可互相交换,对于非对称加密来说,公钥用于加密,私钥用于解密。
公钥密码系统是public-key cryptosystem,比如RSA或ECC,它们首先是一套公钥密码系统,能够用来生成公私钥。公钥是public key,私钥是private key。
在密码学中,密钥的生成是一个极重要的问题。密钥的本质是一个特别大的随机数。对称加密的密钥往往采用随机数发生器和密钥派生算法,从一个便于人类记忆的数字、口令或短语中派生。而非对称加密则使用公钥密码系统创建一对公私钥。但它们本质上都是特别大的随机数。
通常在登陆各种系统时使用的密码实际上是password,是口令,它对人类友好,比较好记忆,但在密码学角度看来,非常不安全,并非密码学所需要的密钥。
散列与认证
密码学另一个主要的用途是对数据的散列以及认证计算。
密码学散列函数
散列是一种不可逆的,将目标数据转换成固定长度的摘要的一种算法。
而密码学提供了密码学散列函数,在散列函数的基础上,具备密码学安全性要求: 摘要能够惟一地标识明文(不同明文不能计算出相同摘要),且具备一定的密码学随机性。
散列就是hash,又叫哈希。摘要叫digest,也叫散列值或哈希值,是一个看起来很随机的数字,或者是这个数字对应的字节数组,往往被编码(如Hex或Base64)为一个固定长度的字符串。
密码学散列函数是cryptographic hash functions,又叫密码学哈希函数,是一种符合密码学安全性要求的散列/哈希算法,比如SHA256、SM3等等。
并不是所有的散列/哈希算法都是密码学散列函数,比如java对象的默认hash方法就不是密码学散列函数。
密码学散列函数可以用在很多业务场景中,比如可以用来生成区块链中的区块哈希,可以用作git等版本管理系统中的文件ID或版本ID,等等。
密码学散列函数同样也在很多其他密码学算法或协议中得到大量使用,比如签名算法、密钥派生算法、伪随机数发生器、tls通信协议等等。
MAC与HMAC
在某些安全通信场景中,使用对称加密对消息进行加密的同时,还需要能够认证消息的真实性与完整性,这时仅仅使用散列算法还不足够安全,就需要消息认证码与基于哈希的消息认证码算法。
消息认证码是Message Authentication Code(MAC),它类似于散列,将明文转换为一个MAC值。但是散列的输入只有明文,而它多出一个密钥。明文或密钥的微小变化将导致MAC值完全不同。不同的密钥+明文几乎无法得到相同的MAC值。MAC值和散列值一样不可逆,无法从MAC值中逆推明文或密钥。MAC算法也被称为keyed hash functions,因为它们的行为类似于带有密钥的哈希函数。
基于哈希的消息认证码是hash-based message authentication code(HMAC),就是使用了某个密码学散列函数的MAC算法。比如HMAC-SHA256就是一个基于SHA256散列算法实现的,增加了密钥输入以及其他一些算法逻辑的的HMAC算法。
MAC或HMAC同样具有散列的特点:计算结果长度固定,不可逆,几乎唯一标识明文等等。
密钥派生算法
在某些安全通信场景中,通信双方生成对称加密的密钥的过程中,使用到了密钥派生算法,它是一种将一个密码或密钥转换为一个或多个密钥的函数。
密钥派生算法是Key derivation function(KDF)。
最简单的KDF可以直接使用某种密码学散列算法比如SHA256,将一个密码转换为一个散列值作为密钥。但它是不安全的,容易受到字典攻击。
对于从密钥派生密钥的场景,一般使用基于HMAC的密钥派生算法: 使用另一个随机数(称为盐)作为输入密钥,利用HMAC算法如HMAC-SHA256来对既有的一个密钥派生新的密钥,并将该随机数(盐)与派生密钥一起存储,用于以后再次从这个既有密钥中派生出相同的派生密钥。
基于HMAC的密钥派生算法是HMAC-based key derivation(HKDF)。
对于从密码派生密钥的场景,HKDF不够安全,建议使用更安全的密钥派生函数,例如PBKDF2、Bcrypt、Scrypt或Argon2等等。
密钥派生算法同样具有散列的特点:计算结果长度固定,不可逆,几乎唯一标识明文等等。
数字签名
随着互联网的普及,密码学的另一大用途数字签名也变得非常普及了,比如访问一个https网站,就使用到了数字签名。
密码学提供了对信息进行数字签名的方法,可以保证信息的真实性,完整性和不可否认性。大多数签名算法,如RSA、ECDSA、EdDSA、SM2等,都使用对应的公钥密码系统生成的一对公私钥进行签名和验签: 信息由私钥签名,由公钥验签。
数字签名是digital signing,签名算法是signature algorithms,签名动作是sign,签名结果是signature,验签动作是verify。
注意签名算法不是非对称加密算法,算法本身是不一样的。RSA、SM2既提供了非对称加密算法,也提供了签名算法;而ECDSA、EdDSA则只是签名算法。ECDSA、EdDSA、SM2对应的公钥密码系统都属于ECC,即Elliptic Curve Cryptography,椭圆曲线密码学。
另外签名算法对公私钥的使用与非对称加密正好相反: 非对称加密是公钥加密,私钥解密;而签名则是私钥签名,公钥验签。这是很好理解的:
公钥是公开的,所有人都可以拿到,而私钥是只有自己才能持有的,不可泄露。
非对称加密场景,某人发消息给B,某人要确保这个消息只有B能解密,因此必须用B的公钥加密,这样就只有B的私钥持有者(即B自己)才能解密看到消息。
签名场景,A发消息给别人,别人收到消息时需要确保这个消息是A发来的,因此A需要使用自己的私钥对消息进行签名,这样别人收到消息时可以用A的公钥来验签,确保这个消息确实是A发送的。
在https通信、区块链、电子签名等相关业务场景中,都使用到了数字签名算法。
密钥交换
在某些安全通信场景中,最重要的事情就是通信双方协商会话密钥,这个阶段使用到的密码学算法就是密钥交换算法,也叫密钥协商算法。
密码学提供了一些密钥交换算法,如目前主流的笛福赫尔曼算法和ECDH算法,在希望能够加密通信的双方之间,安全地协商好双方通信用的密钥。
密钥交换是key-exchange,也被称为密钥协商。笛福赫尔曼算法是Diffie-Hellman,一种密钥交换算法,而ECDH是Elliptic Curve Diffie-Hellman的缩写,是基于椭圆曲线的,笛福赫尔曼算法的一个变种。
这种算法通常在双方之间建立新的安全连接时执行,例如打开一个https网站时,或者连接到一个WiFi网络的时候。
随机数发生器
无论是对称加密、非对称加密、签名等密码学算法,还是某些业务系统中,经常需要使用随机数。随机数的本质是不可预测性,而随机数的不可预测性有多强,往往会极大影响使用它的密码学算法或系统的安全强度。而密码学里用来生成随机数的主要手段就是使用随机数发生器(Random Number Generator, RNG)。
目前的随机数发生器可以分为两种,一种是真随机数发生器TRNG,一种是伪随机数发生器PRNG。真随机数原则上是完全不可预测的,完全没有规律,目前认为只有物理现象才能产生真随机数。而伪随机数只是在一定范围内不可预测,还是存在一个不明显的规律。
TRNG依赖于硬件,比如CPU中提供的TRNG,通过收集电路噪声产生真随机数,但是效率不高。
PRNG实际上生成的是一个顺序固定的随机数序列,它在使用时,需要一个初始的随机数,称作随机数种子(seed)。种子一旦确定,整个随机数序列也就确定了。
PRNG的种子可以基于时间戳来生成,但更安全的做法是使用系统熵值。
操作系统比如linux中,通过收集系统的各种事件(相当于环境噪声)来生成随机数,称之为系统熵值
。应用程序可以通过/dev/random
或/dev/urandom
获取系统熵值。而这个系统熵值被认为是密码学安全的随机数,甚至可以当作真随机数来使用。
为什么叫熵值,因为熵值在数学和物理上就代表不可预测性,是对一个系统的不确定程度或者说混乱程度的一种描述。
目前软件中直接使用的随机数发生器,基本都是PRNG算法,比如线性同余算法,线性反馈移位寄存器算法,DotMix算法,LXM算法等等。除了PRNG,还有PRF伪随机函数,用来生成固定长度的伪随机值,通常基于散列与HMAC实现。
混淆与扩散原则
大部分密码学算法都需要遵循香农提出的混淆-扩散原则。
所谓混淆,是指输出结果(比如密文或散列值)中的每一个比特位,都应该依赖于输入(比如明文和密钥)的大部分内容,即输入输出之间没有直接的映射关系。其目的,是隐藏输出与输入之间的映射关系,使之变得尽可能复杂而难以分析。
所谓扩散,是指如果改变输入中的一个比特,就会改变输出中的大约一半或更多的内容。其目的,是隐藏输出与输入之间的统计学关系,使输入的统计结构特征扩散到输出的全局中去,从而无法根据输出的统计结构特征分析输入的统计结构特征。
评判密码学算法的混淆与扩散效果的一个标准就是,能否发生雪崩效应:输入的微小改变导致输出的大幅改变。
混淆-扩散原则的目的,就是增强密码学算法的安全强度,使其不易被破解。这个原则在大多数散列函数、MAC算法、随机数发生器、对称和非对称加密算法中都得到了体现。
密码学在互联网中的应用
密码学用途广泛,目前最常见的用途,就是如何在互联网这个不安全的网络环境中实现安全通信。比如数字证书与PKI,以及TLS通信协议。
数字证书、PKI、以及TLS通信协议,是对密码学的综合应用,几乎使用到了密码学的所有类型的算法。包括:
- 随机数发生器
- 散列
- HMAC
- 密钥派生
- 数字签名
- 密钥交换
- 对称加密
数字证书与PKI
数字证书是一种互联网上的身份证明,一种基于数字签名的技术,常见于浏览器访问https网站时,网站提供的ssl证书。
PKI简单来说,就是管理数字证书的一套体系,包括数字证书的申请、创建、颁发与撤销。
数字证书与PKI是当前互联网环境下安全通信的基石,解决了不安全的网络环境下通信双方的身份与公钥的信任问题。
TLS通信协议
TLS通信协议是一种基于TCP连接的安全通信协议。它利用数字证书实现身份认证,并在此基础上通过密钥协商算法协商出一组对称加密用的会话密钥,然后使用对称加密对通信的消息进行加解密与MAC认证,从而保证通信安全。
TLS通信协议是当前互联网环境下安全通信的完整方案,解决了在不安全的网络环境下如何安全地进行通信的问题。
为什么要加密
保证数据安全
加密三要素
- 明文/密文
- 秘钥
定长的字符串
需要根据加密算法确定其长度 - 算法
加密算法
解密算法
加密算法和解密算法有可能是互逆的, 也有可能相同
常用的两种加密方式
- 对称加密
秘钥: 加密解密使用的是同一个秘钥, 秘钥有一个
特点:- 双方向保证机密性
- 加密效率高, 适合加密大数据, 大文件
- 加密强度不高, 相对于非对称加密
- 非对称加密
秘钥: 加密解密使用的不同的秘钥, 秘钥有两个, 需要使用秘钥生成算法, 得到密钥对
公钥 - 可以公开的秘钥
公钥加密数据, 解密需要使用私钥
私钥加密, 公钥解密
特点:- 数据的机密性只能单方向保证
- 加密效率低, 适合加密少量数据
- 加密强度高, 相对于对称加密
凯撒密码(不安全)
恺撤密码是通过将明文中所使用的字母表按照一定的字数“平移”来进行加密的。
密码信息威胁
对称加密
-
以分组为单位进行处理的密码算法称为分组密码(blockcipher)
-
计算机的操作对象并不是文字,而是由0和1排列而成的比特序列。
-
将现实世界中的东西映射为比特序列的操作称为编码(encoding)。
-
加密 -> 编码
-
解密 -> 解码
-
DES(Data Encryption Standard-数据加密标准)
- 安全性:不安全, 已经被破解
- 分组加密:先对数据进行分组, 然后在加密或解密
- 分组长度:8byte == 64bit
- DES的秘钥长度:56bit秘钥长度+8bit错误检测标志位 = 64bit == 8byte
3DES
- 安全性:进行了3次DES加密,安全,但效率低
- 分组加密:是
- 分组长度:8字节
- 3DES秘钥长度:24字节, 在算法内部会被平均分成3份
AES(Advanced Encryption Standard-高级加密标准)
- 安全性:安全,且效率高
- 分组加密:是
- 分组长度:AES分组长度
- AES秘钥长度:
- 128bit = 16字节
- 192bit = 24字节
- 256bit = 32字节
- go中的秘钥长度只能是16字节
分组密码的模式
按位异或
ECB - Electronic Code Book, 电子密码本模式
- 特点: 简单, 效率高, 密文有规律, 容易被破解
- 最后一个明文分组必须要填充
- des/3des -> 最后一个分组填充满8字节
- aes -> 最后一个分组填充满16字节
- 不需要初始化向量
CBC - Cipher Block Chaining, 密码块链模式
- 特点: 密文没有规律, 经常使用的加密方式
- 最后一个明文分组需要填充
- des/3des -> 最后一个分组填充满8字节
- aes -> 最后一个分组填充满16字节
- 需要一个初始化向量 - 一个数组
- 数组的长度: 与明文分组相等
- 数据来源: 负责加密的人的提供的
- 加解密使用的初始化向量值必须相同
CFB - Cipher FeedBack, 密文反馈模式
- 特点: 密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文
- 需要一个初始化向量 - 一个数组
- 数组的长度: 与明文分组相等
- 数据来源: 负责加密的人的提供的
- 加解密使用的初始化向量值必须相同
- 不需要填充
OFB - Output-Feedback, 输出反馈模式
- 特点: 密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文
- 需要一个初始化向量 - 一个数组
- 数组的长度: 与明文分组相等
- 数据来源: 负责加密的人的提供的
- 加解密使用的初始化向量值必须相同
- 不需要填充
CTR - CounTeR, 计数器模式
- 特点: 密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文
- 不需要初始化向量
- go接口中的iv可以理解为随机数种子, iv的长度 == 明文分组的长度
- 不需要填充
最后一个明文分组的填充
- 使用cbc, ecb需要填充
- 要求:
- 明文分组中进行了填充, 然后加密
- 解密密文得到明文, 需要把填充的字节删除
- 使用 ofb, cfb, ctr不需要填充
初始化向量 - IV
- ecb, ctr模式不需要初始化向量
- cbc, ofc, cfb需要初始化向量
- 初始化向量的长度
- des/3des -> 8字节
- aes -> 16字节
- 加解密使用的初始化向量相同
- 初始化向量的长度
历史中的密码
角色
发送者、接收者和窃听者
-
当某个人向另一个人发送信息时,发出信息的人称为发送者,而收到信息的人称为接收者,被发送的信息有时也统称为消息( message )。
-
窃听者 Eve 并不一定是人类,有可能是安装在通信设备上的某种窃听器,也可能是安装在邮件软件和邮件服务器上的某些程序。
对称密码与公钥密码
-
对称密码( symmetric cryptography )是指在加密和解密时使用同一密钥的方式
。 -
公钥密码( public-key cryptography )则是指在加密和解密时使用不同密钥的方式。因此,公钥密码又称为
非对称密码
( asymmetric cryptography )。
其他密码技术
单向散列函数
- 单向散列函数:单向散列函数所保证的并不是机密性,而是完整性( integrity )。完整性指的是 “数据是正牌的而不是伪造的” 这一性质。使用单向散列函数,就可以检测出数据是否被篡改过。
- 散 列 值( hash ) 又称哈希值、密码校验和(cryptographic checksum )、指纹( fingerprint )、消息摘要( message)
消息认证码
- 通过使用消息认证码,不但能够确认消息是否被篡改,而且能够确认消息是否来自所期待的通信对象。也就是说,消息认证码不仅能够保证完整性,还能够提供认证(authentication )机制。
数字签名
- 数字签名就是一种将现实世界中的签名和盖章移植到数字世界中的技术,它也是一种重要的密码技术
伪随机数生成器
-
伪随机数生成器( Pseudo Random Number Generator, PRNG )是一种能够模拟产生随机数列的算法。
-
在 Web 中进行 SSL/TLS 通信时,会生成一个仅用于当前通信的临时密钥( 会话密钥 ),这个密钥就是基于伪随机数生成器生成的。如果生成随机数的算法不好,
窃听者就能够推测出密钥,从而带来通信机密性下降的风险。
密码学家的工具箱
• 对称密码
• 公钥密码
• 单向散列函数
• 消息认证码
• 数字签名
• 伪随机数生成器
隐写术与数宇水印
-
还有另外一种技术,它不是让消息内容变得无法解读,而是能够隐藏消息
本身,这种技术称为隐写术( steganography )。 -
密码隐藏的是内容,隐写术隐藏的是消息本身。通过将密码与隐写术相结合,就可以同时产生两者所各自具备的效果。
-
举例:
我很喜欢你
我们先准备一段话,
很容易看懂的就可以,
喜闻乐见的当然更好。
欢迎你尝试将另一句话嵌在这段话中,
你会发现这其实就是一种隐写术。
安全常识
-
• 不要使用保密的密码算法:一旦密码算法的详细信息被暴露,依靠对密码算法本身进行保密来确保机密性的密码系统也就土崩瓦解了。反之,那些公开的算法从一开始就没有设想过要保密,因此算法的暴露丝毫不会削弱它们的强度
-
• 使用低强度的密码比不进行任何加密更危险:现在世界上公开的被认为强度较高的密码算法,几乎都是经过密码破译者长期尝试破解未果而存活下来的。因此,如果认为 “公司自己开发的密码系统比那些公开的密码系统更强”,那只能说是过于高估自己公司的能力了。
-
• 任何密码总有一天都会被破解
-
• 密码只是信息安全的一部分
恺撒密码
- 恺撒密码是通过将明文中所使用的字母表按照一定的字数 “平移” 来进行加密的。在日语( 例如平假名 )或者汉语( 例如汉语拼音)中也可以用同样的思路来实现惜撒密码。
加密
在这个场景中,密钥 3 必须由发送者和接收者事先约定好。
package main
const key = 3
func Crypto(src string)string{
src_ := []rune(src)
for index,val:=range src_{
src_[index]=val+3
}
return string(src_)
}
func main() {
println(Crypto("你好世界"))
// 佣妀丙畏
}
解密
func DeCrypto(src string)string{
src_ := []rune(src)
for index,val:=range src_{
src_[index]=val-key
}
return string(src_)
}
用暴力破解来破译密码
func DeCrypto(src string,key rune)string{
src_ := []rune(src)
for index,val:=range src_{
src_[index]=val-key
}
return string(src_)
}
func Fuck(src string)string{
for tmpKey:=0;tmpKey<=26;tmpKey++{
fmt.Println(DeCrypto(src,int32(tmpKey)))
}
return ""
}
佣妀丙畏
佢奿丘畎
佡奾丗畍
你好世界
佟奼丕畋
佞奻且畊
佝奺专畉
作她丒畈
佛奸丑畇
佚奷丐畆
余奶丏畅
佘奵与畄
佗奴不畃
佖女丌畂
何奲下畁
佔奱上畀
体奰三甿
佒奯丈甾
佑奮万甽
佐奭丆甼
住奬丅画
低奫丄町
位奪七甹
佌奩丂甸
佋奨丁男
佊奧一甶
佉奦䷿电
凯撒密码太脆弱,无法保护重要信息。
简单替换密码
- 将明文中所使用的字母表替换为另一套宇母表的密码称为简单替换密码( simple substitution cipher )0 恺撒密码也可以说是简单替换密码的一种。
- 简单替换密码很难通过暴力破解来破译
用频率分析来破译密码
MEYLGVIWAMEYOPINYZGWYEGMZRUUYPZAIXILGVSIZZMPGKKDWOMEPGROEIWGPCEIPAMDKKEYCIUYMGIF
RWCEGLOPINYZHRZMPDNYWDWOGWITDWYSEDCEEIAFYYWMPIDWYAGTYPIKGLMXFPIWCEHRZMMEYMEDWOMG
QRYWCEUXMEDPZMQRGMEEYAPISDWOFICJILYSNICYZEYMGGJIPRWIWAIHRUNIWAHRZMUDZZYAMEYFRWCE
MRPWDWOPGRWAIOIDWSDMEIGWYMSGMEPYYEYHRUNYARNFRMSDMEWGOPYIMYPZRCCYZZIOIDWIWAIOIDWE
YMPDYAILMYPMEYMYUNMDWOUGPZYKFRMIMKIZMEIAMGODTYDMRNIWASIKJYAISIXSDMEEDZWGZYDWMEYI
DPZIXDWODIU2RPYMEYXIPYZGRPDMDZYIZXMGAYZNDZYSEIMXGRCIWWGMOYM
-
首先,统计一下这段密文中每个字母出现的频率
-
线索:一般的英语文章中出现频率最高的字母是 e, 这一点基本上是不会错的,将Y替换为e
MEeLGVIWAMEeOPINeZGWeEGMZRUUePZAIXILGVSIZZMPGKKDWOMEPGROEIWGPCEIPAMDKKEeCIUeMGIF RWCEGLOPINeZHRZMPDNeWDWOGWITDWeSEDCEEIAFeeWMPIDWeAGTePIKGLMXFPIWCEHRZMMEeMEDWOMG QReWCEUXMEDPZMQRGMEEeAPISDWOFICJILeSNICeZEeMGGJIPRWIWAIHHUNIWAHRZMUDZZeAMEeFRWCE MRPWDWOPGRWAIOIDWSDMEIGWeMSGMEPeeEeHRUNeARNFRMSDMEWGOPelMePZRCCeZZIOIDWIWAIOIDWE eMPDeAILMePMEeMeUNMDWOUGPZeKFRMIMKIZMEIAMGODTeDMRNIWASIKJeAISIXSDMEEDZWGZeDWMEel DPZIXDWODIUZRPeMEeXIPeZGRPDMDZelZXMGAeZNDZeSEIMXGRCIWWGMOeM
-
线索:英语中出现最多的单同是 the,假设 M== t,E == h
-
动员自己所有的英语词汇,在上面的文字中继续寻找可能的组合。发现中间有
一个词 thPee 比较可疑,假设P== r ?
…
• 除了高频字母以外,低频字母也能够成为线索
• 搞清开头和结尾能够成为线索,搞清单词之间的分隔也能够成为线索
• 密文越长越容易破译
• 同一个字母连续出现能够成为线索( 这是因为在简单替换密码中,某个字母在替换表中
所对应的另一个字母是固定的)
Enigma
- 发送者和接收者各自拥有一台 Enigma。发送者用 Enigma 将明文加密,将生成的密文通过无线电发送给接收者。接收者将接收到的密文用自己的 Enigma 解密,从而得到明文。
- 由于发送者和接收者必须使用相同的密钥才能够完成加密通信,因此发送者和接收者会事先收到一份叫作国防军密码本的册子。
3. 每当按下 Enigma 上的一个键,就会点亮一个灯泡。操作 Enigma 的人可以在按键的同时读出灯泡所对应的字母,然后将这个字母写在纸上。这个操作在发送者一侧是加密,在接收者一侧则是解密。只要将键和灯泡的读法互换一下,在 Enigma 上就可以用完全相同的方法来完成加密和解密两种操作了。
为什么要将密码算法和密钥分开
- 恺撒密码
密码算法:将明文中的各个字母按照指定的字母数平移
密钥:平移的字母数量 - 简单替换密码
密码算法:按照替换表对字母表进行替换
密钥:替换表
…
密码算法是需要重复使用的,但在重复使用同一种算法的过程中,该算法被破译的可
能性也在逐渐增大。因此,就在密码算法中准备了一些可变部分,并在每次通信时都对这部分内容进行改变,而这一可变部分就是密钥。