0

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

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

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

4

3 回答 3

1

针对您的问题:

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

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

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

希望这可以帮助!

于 2011-02-11T02:19:22.983 回答
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

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

于 2011-03-03T19:25:12.200 回答
0

如果您想测试自己实现的结果(计算期间的任何内部状态),您可以查看此页面:

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

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

于 2011-03-06T15:37:27.630 回答