为什么加密的消息有时以“==”结尾

信息安全 加密 解密
2021-09-04 10:28:10

作为编程练习,我需要解密消息。我唯一的线索似乎是:

  • 编码消息仅包含 Base64 字符
  • 一个字母序列(n 在 1,4,7,10 中)乘以它返回带有“==”的加密消息。
  • 一个字母序列(n 在 2、5、8、11 中)乘以它返回带有“=”的加密消息。
  • 字母序列(3、6、9、12 中的 n)返回不带特定字符的加密消息。

我不想要一个解决方案,我只是想知道等号的这一系列出现是否提供了线索。

3个回答

= 符号与在Base64中编码的字符串的长度有关。本质上,在可能是最常见的 Base64 形式中,= 用作填充字符以确保可以正确解码最后一个块。

Base64 不是加密——其中没有隐藏——但通常用于允许以纯文本形式发送二进制数据。Base64 中使用的所有字符都将正确粘贴,并且可以使用键盘输入,除了 shift 之外没有修饰键。

如上所述,Base64 不是加密,而是编码。正如您在指定标准的RFC中看到的那样,base64 的工作方式如下。

  • 你有一个长度为n的字符流s 。
  • 您从流中读取了 3 个 8 位值(现在您总共有 24 位 = 3 个字节)
  • 您将这 24 位分成 4 组,每组 6 位
  • 使用 Base 64 字母表,您将每个 6 位组编码为 Base64 等效项

现在,您有可能到达流的末尾并且没有 24 位组(s mod 6 != 0)。如果发生这种情况,则在输入的末尾添加零,直到获得整数个 6 位组。

鉴于您的输入流是 ASCII 编码的,因此它由 8 位字符组成,因此只有两种情况最终会出现上述情况。

  1. 最后一组有 8 位

  2. 最后一组有 16 位

在第一种情况下,添加 4 个零(给您 12 位),输出将是基于字母编码的两个字符(2 * 6 位 = 12 位)和两个“=”填充字符

在第二种情况下,将添加 2 个零(总共 18 位),输出将是三个字符(3 * 6 位 = 18 位)和一个“=”填充字符。

这就是有时在编码文本的末尾会出现一个、两个或没有“=”的方式。有关更多信息,您应该真正阅读定义该标准的RFC以及与之相关的维基百科条目。

还有其他几种使用该=符号的编码系统包括:

ESAB46(BASE64 向后)

ATOM128

梅根35

FERON74

如前所述,=填充/缓冲区告诉非编码器长度。这尤其是为什么密码学家正在寻找一种更好的缓冲方法,因为这=是一个死的赠品。