所以我们都同意密钥是固定长度的128位或192位或256位。如果我们的上下文大小为50个字符(字节)%16 = 2个字节。所以我们加密上下文3次,但剩下的两个字节将如何存储在State块中。我应该填写它们,标准没有说明如何处理这些条件。
MixColumns阶段是AES中最复杂的方面,但是我无法理解数学表示。我对矩阵乘法有所了解,但我对数学结果感到惊讶。将值乘以2,向左移动到小端1位置,向右移位用于大端。如果我们将最高有效位设置为1(0x80),那么我们应该将移位结果与0x1B进行异或。我认为乘以3意味着将价值转移2个位置。
我已经检查了维基百科上的各种来源,甚至是提供C实现的教程。但我更感兴趣的是完成我自己的实现!感谢您提供任何可能的意见。
答案 0 :(得分:1)
回答你的问题:
如果要使用AES加密字节流,请不将其分解为单个块并单独加密。这不是加密安全的,聪明的攻击者可以从原始明文中恢复大量信息。这被称为electronic code book,如果您按照链接查看当您使用它来加密Linux企鹅的Tux时会发生什么,您可以直观地看到它的不安全感。相反,请考虑使用cipher-block chaining (CBC)或counter mode (CTR)等已知安全技术。这些实现起来有点复杂,但值得付出努力,以确保聪明的攻击者无法间接破坏您的加密。
至于MixColumns阶段的工作方式,我自己并不了解很多操作。它基于涉及多项式场的构造。如果我能找到一个很好的解释,我会告诉你。
如果您想实施AES以进一步理解,那就完全没问题了,我鼓励您这样做(尽管您最好还是阅读关于算法来源的数学直觉)。但是,您应该不将您自己的实现用于任何实际的加密目的。如果不小心,您将使您的实现容易受到可能危及其安全性的side-channel attack的攻击。最着名的例子涉及RSA加密,其中没有仔细规划,攻击者实际上可以观察计算机的功耗,因为它进行加密以恢复密钥的位。如果您想使用AES进行加密,请考虑使用该算法的已知,经过测试的开源实现。
希望这有帮助!
答案 1 :(得分: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.
编辑:正常矩阵乘法不适用于此。所以忘记正常矩阵。
答案 2 :(得分:0)
如果您想测试自己实现的结果(计算期间的任何内部状态),您可以查看此页面:
http://www.keymolen.com/aes.jsp
它显示任何给定明文,键和iv的所有内部状态,也适用于mixcolumns阶段。