【问题标题】:Trouble Implementing Rijndael MixColums in Python在 Python 中实现 Rijndael MixColums 的麻烦
【发布时间】:2020-07-10 10:59:01
【问题描述】:

我正在尝试在 python 中为 AES 实现 MixColumns 算法,但我遇到了一些麻烦。这是我的代码:

def multiply(b,a):

    if b == 1:
        return a
    if b == 2:
         return ((a<<1)&0xff)^0x1b

    if b == 3:
        return (((a<<1)&0xff)^0x1b)^a
s_mat1 = [np.copy(s) for s in s_mat]
        for i in range(len(s_mat)):
            for j in range(len(s_mat[i])):

                s_mat[i][j] = multiply(mx_col[i][0],s_mat1[0][j])^multiply(mx_col[i][1],s_mat1[1][j])^multiply(mx_col[i][2],s_mat1[2][j])^multiply(mx_col[i][3],s_mat1[3][j])

这里s_mat 是状态矩阵,mx_col 是混合列矩阵。我为此示例尝试了此代码: 但是,我的代码给出了与给定不同的答案。这是我的代码给出的答案:

[['ba', '84', 'e8', '1b'], ['6e', 'a4', '8d', '5b'], ['f4', '96', '6', '7d'], ['61', '29', 'e', '46']]

第一行是正确的。但是为什么其他行会出错?我做错了什么?

【问题讨论】:

    标签: python encryption cryptography aes rijndael


    【解决方案1】:

    对于 代码中没有考虑区分大小写:XOR0x1b 仅针对 a &gt; 127here 执行。这改变了b == 2b == 3 的情况:

    def multiply(b,a):
        if b == 1:
            return a
        tmp = (a<<1) & 0xff
        if b == 2:
            return tmp if a < 128 else tmp^0x1b
        if b == 3:
            return tmp^a if a < 128 else (tmp^0x1b)^a
    

    通过此更改获得预期的结果。

    【讨论】:

    • 谢谢,成功了。另外,为什么没有任何 Rijndael 的实现,就像我对 ifs 所做的那样。我发现不同的实现都不是那样的。我发现的大多数都更复杂。甚至在 Wikipedia 上用 C 和 C# 给出的那个也有 forloops。是否有理由以给定的方式实施它,或者我对您建议的更改没问题?
    • this 回答中,MixColumns 步骤中的乘法得到了很好的描述。据我所见,这与您的更改实现相对应。测试用例也是正确的。也许其他解决方案包括算法的几个步骤(MixColumns 只是一个步骤)或更通用的解决方案(MixColumns 是 GF(2^8) 乘法的一个特例,仅使用值 1、2 和 3)。
    • @ShantanuShinde - 还有一件事:在您的问题/评论中,您有时将算法称为 AES,有时称为 Rijndael。请注意,AES 和 Rijndael 是不同的算法(AES 是 Rijndael 的一个特例)here,具有相应不同的实现。这也可能是您评论中提到的差异的原因。
    • 我说 AES 是因为我在 AES 的 mixcolumn 步骤中使用了 Rijndael 混合列算法。这就是我所指的实现:en.wikipedia.org/wiki/…
    • @ShantanuShinde - 两个链接代码计算一列,您的代码为四(因此更特定于 AES,请参阅 here)。除此之外,我看不到功能上的差异。 C# 代码有点复杂,因为它(正如已经假设的那样)更普遍地实现了 GF(2^8) 乘法(但这对结果没有影响)。
    【解决方案2】:

    对于解密,我们可以使用这段代码,它使用了topaco的代码,并使用永续乘法来计算9、11、13和14, 我们可以将 14 重写为 ((2+1)*2+1)*2 所以它的等效代码是 (multiply(2,multiply(2,multiply(2,a)^a)^a)):

    def multiply(b,a):
    if b == 1:
        return a
    tmp = (a<<1) & 0xff
    if b == 2:
        return tmp if a <= 127 else tmp^0x1b
    if b == 3:
        return tmp^a if a <= 127 else (tmp^0x1b)^a
    if b== 9:
        return multiply(2,multiply(2,multiply(2,a)))^a
    if b== 11:
        return multiply(2,multiply(2,multiply(2,a))^a)^a
    if b==13:
        return multiply(2,multiply(2,(multiply(2,a)^a)))^a
    if b==14:
        return multiply(2,multiply(2,multiply(2,a)^a)^a)
    

    【讨论】:

    • 是的,我的答案中的a &gt;= 127 是一个错字,另请参阅this 更详细的答案。固定的。但是,评论会很好。还是谢谢。
    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多