【问题标题】:AES Limitations and MixColumnsAES 限制和 MixColumns
【发布时间】:2011-02-11 00:55:31
【问题描述】:

所以我们都同意密钥是 128 位或 192 位或 256 位的固定长度。如果我们的上下文是 50 个字符的大小(字节)% 16 = 2 个字节。所以我们对上下文进行了 3 次加密,但剩下的两个字节将如何存储在 State 块中。我应该填充它们,标准没有指定如何处理这些情况。

MixColumns 阶段是 AES 中最复杂的方面,但是我一直无法理解数学表示。我对矩阵乘法有所了解,但我对数学结果感到惊讶。将一个值乘以 2,左移小端 1 位置,右移大端。如果我们将最高有效位设置为 1 (0x80),那么我们应该将移位结果与 0x1B 进行异或。我认为乘以 3 意味着将值移动 2 个位置。

我查看了 Wikipedia 上的各种资源,甚至包括提供 C 实现的教程。但我更感兴趣的是完成我自己的实现!感谢您提供任何可能的意见。

【问题讨论】:

  • 您需要乘以或除以 4 才能移动两位。
  • AES 只是分组密码。如果要加密实际数据,则必须选择合适的 模式,例如 CBC(密码块链接)或 CTR(计数器模式)。 CBC是块模式,所以你需要想出一些合适的填充方式(由你决定); CTR 是一种流模式,因此您可以加密任意数量的字节。

标签: c++ cryptography aes


【解决方案1】:

在混合列阶段,指数被相乘。

take this example
AA*3
10101010*00000011
is
x^7+x^5+x^3+x^1*x^1+x^0
x^1+x^0 is 3 represented in polynomial form
x^7+x^5+x^3+x^1 is AA represented in polynomial form
first take x^1 and dot multiply it by the polynomial for AA.
that results in...
x^8+x^6+x^4+x^2 ... adding one to each exponent
then reduce this to 8 bits by XoRing by 11B
11B is x^8+x^4+x^3+x^1+x^0 in polynomial form.
so...
x^8+x6+x^4+    x^2
x^8+   x^4+x^3+    x^1+x^0
leaves
x^6+x^3+x^2+x^1+x^0 which is AA*2
now take AA and dot multiply by x^0 (basically AA*1)
that gives you
x^7+x^5+x^3+x^1 ... a duplicate of the original value.
then exclusive or AA*2 with AA*1
x^7+    x^5+x^3+    x^1
    x^6+    x^3+x^2+x^1+x^0
which leaves
x^7+x^6+x^5+x^2+x^0 or 11100101 or E5
I hope that helps.
here also is a document detailing the specifics of how mix columns works.

mix_columns.pdf

编辑:正规矩阵乘法不适用于这个..所以忘记正规矩阵。

【讨论】:

  • 谢谢,我解决了这个问题超过 2 周。创建了我自己的多项式乘数(函数)
【解决方案2】:

回答您的问题:

  1. 如果您想使用 AES 加密字节流,请不要将其分成单独的块并单独加密。这不是加密安全的,聪明的攻击者可以从原始明文中恢复大量信息。这称为electronic code book,如果您点击链接并查看使用它加密 Linux Penguin 的 Tux 时会发生什么,您可以直观地看到它的不安全感。相反,请考虑使用已知的安全技术,例如 cipher-block chaining (CBC)counter mode (CTR)。这些实现起来有点复杂,但值得付出努力,这样您就可以确保聪明的攻击者无法间接破坏您的加密。

  2. 至于MixColumns阶段是如何工作的,我自己真的不是很了解这个操作。它基于涉及多项式域的构造。如果我能找到一个很好的解释来说明它是如何工作的,我会告诉你的。

  3. 如果您想实现 AES 来加深理解,那很好,我鼓励您这样做(尽管您最好阅读数学直觉来了解算法的来源)。但是,您应该将您自己的实现用于任何实际的加密目的。如果不加倍小心,您的实现将容易受到可能危及其安全性的side-channel attack 的攻击。最著名的例子是 RSA 加密,在这种加密中,攻击者在没有仔细计划的情况下实际上可以观察计算机的功耗,因为它进行加密以恢复密钥的位。如果您想使用 AES 进行加密,请考虑使用该算法的已知、经过测试的开源实现。

希望这会有所帮助!

【讨论】:

  • 我非常感谢您对研究信息的一些投入(感谢您的提醒),但由于其他已经成熟的库,我自己的实现会很糟糕。我的重点完全取决于其他现有代码和功能(易用性)的实现程度,我正在编写一个 SSL 库,部分 SSL 需要块和流密码,这需要我实现 AES。我是一名计算机科学专业的毕业生,但由于英语不是我的第一语言,因此如果几乎没有涵盖该主题,有时很难理解数学符号。 (并非所有情况)
  • 我还有一个朋友是安全专家,他还会帮助我测试可能困扰我的库的任何漏洞。
【解决方案3】:

如果你想测试你自己实现的结果(计算过程中的任何内部状态),你可以查看这个页面:

http://www.keymolen.com/aes.jsp

它显示任何给定明文、key 和 iv 的所有内部状态,也适用于 mixcolumns 阶段。

【讨论】:

  • 感谢 Bruno,但我已经实现了 AES。我还实现了我自己的 DES 版本。我目前正在调试异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多