跳转到内容

密码学/一次性密码本

来自维基教科书,开放的书籍,开放的世界

一次性密码本 (OTP) 是唯一可能无法破解的加密方法。使用 OTP 加密的明文不能在没有加密密钥的情况下被检索。但是,一次性密码本密码的用户必须满足几个关键条件,否则密码可能会被破解。

  • 密钥必须是随机的,并且由非确定性、不可重复的过程生成。任何由算法生成的密钥都将不起作用。OTP 的安全性依赖于密钥的随机性。不幸的是,密钥的随机性无法得到证明。
  • 密钥绝不能重复使用。使用相同的密钥加密不同的消息,无论多么微不足道,都会破坏密码。
  • 密钥不能落入敌人的手中。这可能看起来很明显,但这指出了系统的一个弱点,即您必须能够向密码本的阅读者传输大量数据。通常,一次性密码本密码密钥是通过外交邮袋发送的。

典型的一次性密码本系统的工作原理如下:生成一个新的长随机密钥。将明文与密钥进行异或运算以创建密文。要解密密文,将其与原始密钥进行异或运算。因此,所呈现的系统是对称互逆密码。其他函数(例如,模 n 加法)可用于组合密钥和明文以产生密文,尽管所得系统可能不是互逆密码。

如果密钥是随机的并且从未重复使用,则 OTP 可以被证明是无法破解的。任何密文都可以通过使用适当的密钥解密为任何相同长度的消息。因此,实际的原始消息无法仅从密文中确定,因为所有可能的明文都是等可能的。这是唯一已知证明此类证明的密码系统。

OTP 的实现极其简单。[1]

但是,存在一些局限性。重复使用密钥,系统就会变得非常脆弱;它可以用纸笔破解。尝试使用某种算法来生成密钥来构建“一次性密码本”,那么您就没有一次性密码本,而是一个流密码。有一些非常安全的流密码,但那些不了解一次性密码本的人可能无法设计出一个。不幸的是,将弱流密码宣传为无法破解的一次性密码本的情况相当普遍。

此外,即使您拥有一个实现良好的 OTP 系统,并且您的密钥得到了安全保管,也要考虑一个了解部分消息明文的攻击者。然后他可以恢复该部分密钥并用它来加密自己的消息。如果他可以传递自己的消息而不是您的消息,那么您将陷入困境。

首先,为明文选择一个 OTP

Preshared Random Bits = 1010010010101010111010010000101011110101001110100011
           Plain text = 110101010101010010100
   Length(Plain Text) = 21
              Key(21) = 101001001010101011101

该示例表明,明文并不总是与密钥材料具有相同的长度。这可以通过以下方法解决

  • 在加密前将终止符附加到明文,并用随机位终止密文。
  • 在明文前添加长度和序言终止符,并用随机位终止。

此类信号系统(以及可能的明文编码方法)的设计必须确保这些终止符不会被误认为明文。因此,对于此示例,假定明文已经包含端点/长度信号。

对于越来越长的明文/密钥对长度,互相关 越来越接近零。

Key(21)    = 101001001010101011101
Plaintext  = 110101010101010010100
bitwise    |||||||||||||||||||||
cyphertext = 011100011111111001001

对于越来越长的明文/密文对长度,互相关 也越来越接近零。

Preshared Random Bits = 1010010010101010111010010000101011110101001110100011
           cyphertext = 011100011111111001001
           bitwise    |||||||||||||||||||||
           Plain text = 110101010101010010100


精明的读者可能会注意到,解密器在实际操作中需要知道明文的长度。这是通过将密文作为比特流解密(即在读取时对每个比特进行异或运算)并在满足附加到明文的信号的明文结束规则集之前观察流来完成的。

手工制作一次性密码本

[编辑 | 编辑源代码]
一套完整的英语 Scrabble 磁贴。有关其他语言,请参见Scrabble 字母分布

一次性密码本最初是在没有计算机的情况下制作的,今天仍然可以做到这一点。这个过程可能很繁琐,但如果做得正确并且密码本只使用一次,结果就是无法破解的。

制作一次性密码本需要两个要素:一种随机生成字母的方法和一种记录结果两个副本的方法。传统上,后者的做法是使用w:打字机w:复写纸。然后销毁复写纸和w:打字机色带,因为通常可以从它们中恢复密码本数据。随着打字机变得越来越少,在两张在办公用品店可以买到的 w:无碳复写纸 上工整地手写字母,每组 5 个字母也是可以接受的。每张纸可以被赋予一个序列号或其他唯一的标记。

历史上,用于手动一次性密码本的密钥材料以许多小页纸的形式进行分发。每页通常有一系列 5 位数组,每个数字都是从 0 到 9 中随机选择的。[2][3][4][5][6][7][8][9]

一套一次性密码本包含两个相同的密码本。一些作者将这两个密码本称为“两个相同的原件”,以强调密钥材料永远不应被复制。[10]

传统上,双向通信需要两套密码本(共 4 本):一个人得到一套的“IN”密码本,以及另一套的“OUT”密码本。[11]

每页通常包含 50 组 5 个随机十进制数字 0...9,足以容纳一条普通消息,以及一个唯一的 5 位数“页码”。[11][12]

使用转换表将明文消息的字母转换为数字,以及将解码消息的数字转换回字母。[5] 可能最简单的转换表是 A=01,B=02,... Z=26,但历史上通常使用某种跨越棋盘,例如 CT-37c,[13] CT-37w,CT-46,[14] 等等。[15]

一次性密码本的关键材料有时被写成 50 组 5 个随机字母 A...Z。[12][16] 键以字母形式编写的密码本有时被称为字母一次性密码本 (LOP)[17][18] 或一次性字母密码本 (OTLP)。[11]

密码机(包括一次性密码本系统)的关键材料通常用二进制代码打孔在长而窄的纸带上——一种“一次性纸带”OTT。[10][12][19]

字母瓷砖

[edit | edit source]

在罗马字母表中生成随机字母的最简单方法是获得 26 个相同的物体,每个物体上标记不同的字母。游戏 w:Scrabble 的瓷砖就可以使用,只要选择每个字母只有一个即可。制作姓名吊坠手链的套件是另一个选择。您也可以用记号笔在 26 个相同的硬币上写下字母。将这些物体放在一个盒子或杯子里,用力摇晃,然后取出一件物体并记录下它的字母。将物体放回盒子里,重复这个过程。

10 面骰子

[edit | edit source]

制作一次性密码本的另一种方法是使用 w:十面骰子。您可以通过同时掷几个十面骰子并记录每掷一次的十进制数字组来生成随机数字组——每次掷骰子一个十进制数字。[11] 这种方法比使用 Scrabble 瓷砖生成随机代码组快得多。明文消息被转换为数值,A = 01,B = 02,以此类推。使用 非进位加法,将结果数值通过添加一次性密码本中的数字进行加密。然后,您可以直接传输这些数字组,或者使用跨越棋盘将这些数字转换回字母并传输结果。

6 面骰子

[edit | edit source]

制作一次性密码本的另一种方法是使用 6 面骰子。[20]

可以使用 6 面骰子生成随机十进制数字(以创建传统的十进制一次性密码本)。[11]

如果将消息转换为两位数的 六进制数字,那么普通的 六面骰子 可以用来在一次性密码本中生成随机数字。密码本中的数字将对明文消息中的数字进行模 6 加法运算(同样没有进位),并从密文中进行模 6 减法运算以解密。例如

将消息转换为六进制的表格
PT 0 1 2 3 4 5 6 7 8 9
CT 00 01 02 03 04 05 10 11 12 13
PT A B C D E F G H I J K L M
CT 14 15 20 21 22 23 24 25 30 31 32 33 34
PT N O P Q R S T U V W X Y Z
CT 35 40 41 42 43 44 45 50 51 52 53 54 55
将消息转换为六进制的表格
左位
x0 x1 x2 x3 x4 x5
0x 0 1 2 3 4 5
1x 6 7 8 9 A B
2x C D E F G H
3x I J K L M N
4x O P Q R S T
5x U V W X Y Z

使用此表,“Wikipedia” 将转换为 52 30 32 30 41 22 21 30 14。如果密码本数字为 42 26 21 35 32 34 22 62 43,则密文将为 34 50 53 05 13 50 43 32 51。(请注意,6 模 6 等于 0)。

密钥交换

[edit | edit source]

为了使用此算法,每一方都必须拥有相同的随机密钥。这通常需要双方亲自见面或使用可信的信使。有时会提出其他方法,例如让双方都拥有能够生成相同半随机数字的相同设备,但是这些方法本质上是 w:流密码,并不受一次性密码本安全证明的保护。

进一步阅读

[edit | edit source]


  • "视觉密码学" 通常使用一次性密码本。可以使用特殊的偏振滤光片排列来实现 XOR 操作。
  • "什么是视觉密码学" 使用二进制一次性密码本。可以使用特殊的点模式来实现 XOR 操作。
华夏公益教科书