使用AES-128和AES-256有什么区别?如何更改StateMatrix或Round运算?

时间:2016-06-02 16:53:46

标签: encryption cryptography aes wolfram-mathematica

我做了AES-128的简单实现,只使用了一轮。我想知道如果我能实现AES-256,将如何改变我的StateMatrix或圆形操作?我知道我必须使用256位密钥,但我的消息仍然有128位长度。我知道ShiftRow操作会改变。

行。例如,我有以下消息必须加密:

 message = "encryptionaes256";
 key = "keyskeyskeyskeys";
 px = x^8 + x^4 + x^3 + x + 1;

现在我想创建我的StateMatrix(我不知道如何创建AES-256以及我的代码将描述AES-128的原因):

stateMatrix = Table[0, {4}, {4}];
partitionByBytes = Partition[ToDigits2Form[message], 8];
counter = 1;
For[j = 0, j < Length[partitionByBytes], ++j,
  If[Mod[j, 4] == 0 && j != 0,
   counter = counter + 1];
  stateMatrix[[Mod[j, 4] + 1, counter]] =  
   FromBitToGalua[partitionByBytes[[j + 1]]];
  ];

ToDigits2Form 将消息转换为二进制向量。 FromBitToGalua 表示GF(2 ^ 8)中的字节。

下一步是创建矩阵形式的键:

keyMatrix = Table[0, {4}, {4}];
partitionByBytes = Partition[ToDigits2Form[key], 8];
counter = 1;
For[j = 0, j < Length[partitionByBytes], ++j,
  If[Mod[j, 4] == 0 && j != 0,
   counter = counter + 1];
  keyMatrix[[Mod[j, 4] + 1, counter]] =  
   FromBitToGalua[partitionByBytes[[j + 1]]];
  ];

但我必须使用AES-256,我的密钥必须具有256位长度。这是否意味着我的矩阵将有8行4列?如果这是真的,我该如何进行圆形操作?我的StateMatrix代表我的消息将是4x4而我的KeyMatrix将是8x4。它将如何运作?

现在我要为SubBytes操作创建TransformationTable:

TransformationTable[Sbox_] := Block[{i, j, table, counter},
  table = Table[{0, 0}, {16}, {16}];
  counter = 1;
  For[i = 1, i <= 16, ++i,
   For[j = 1, j <= 16, ++j,
     table[[i, j]] = IntegerDigits[Sbox[[counter]], 16, 2];
     ++counter;
     ];
   ];
  Return[table];
  ]

table = TransformationTable[Sbox];

我没有放置SBox矩阵。你可以在互联网上找到它。它看起来像Sbox = {99, 124, 119, 123, 242,.......}

步骤1. AddRoundKey

现在是第一轮的操作。它是AddRoundKey:

AddRoundKey[matrix1_, matrix2_] := Block[{i, j, result},
      result = Table[0, {4}, {4}];
      For[i = 1, i <= 4, ++i,
       For[j = 1, j <= 4, ++j,
         result[[i, j]] = 
          PolynomialMod[matrix1[[i, j]] + matrix2[[i, j]], {2}]
         ];
       ];
      Return[result];
      ]

stateMatrix = AddRoundKey[stateMatrix, keyMatrix];

我应该得到哪种尺寸的结果?也许这是一个愚蠢的问题,但我一直坚持下去。

步骤2.通过规则替换矩阵状态的元素设置表

现在我想将StateMatrix的元素转换为十六进制系统:

FromBitToGalua[byte_] := Block[{t1, t2, x},
  t2 = byte;
  t1 = Sum[x^(7 - i)*t2[[i + 1]], {i, 7}];
  Return[t1]
  ]
FromGaluaToBit[byte_] := Block[{t1, t2, t3, x},
  t1 = PadLeft[Reverse@CoefficientList[byte, x], 8];
  Return[t1]
  ]
From16ToGalua[byte_] := Block[{t1, t2},
  t1 = IntegerDigits[
    FromDigits[
     byte /. {a -> 10, b -> 11, c -> 12, d -> 13, e -> 14, f -> 15}, 
     16], 2, 8];
  t2 = FromBitToGalua[t1];
  Return[t2]
  ]
FromGaluaTo16[byte_] := Block[{t1, t2},
  t1 = FromGaluaToBit[byte];
  t2 = IntegerDigits[FromDigits[t1, 2], 16, 2];
  t2 /. {10 -> a, 11 -> b, 12 -> c, 13 -> d, 14 -> e, 15 -> f};
  Return[t2]
  ]

SubBytes 操作:

SubBytes[matrix_, table_] := Block[{i, j, result, pos},
  result = Table[0, {4}, {4}];
  For[i = 1, i <= 4, ++i,
   For[j = 1, j <= 4, ++j,
     pos = matrix[[i, j]];
     result[[i, j]] = table[[pos[[1]] + 1, pos[[2]] + 1]];
     ];
   ];
  Return[result];
  ]

步骤3. ShiftRows操作

ShiftRows[matrix_] := Block[{i, j, result, pos},
  result = Table[0, {4}, {4}];
  For[i = 0, i < 4, ++i,
   For[j = 0, j < 4, ++j,
     result[[i + 1, Mod[j - i, 4] + 1]] = matrix[[i + 1, j + 1]];
     ];
   ];
  Return[result];
  ]

我有一个问题。我是否会为AES-128和AES-256提供相同的换档位置?我使用32位块,128位消息和256位密钥。

步骤4. MixColumns

MixColumns[matrix_, tMatrix_] := Block[{c, i, j, result, col, el},
  result = Table[0, {4}, {4}];
  For[c = 1, c <= 4, ++c,
   col = matrix[[All, c]];
   For[i = 1, i <= 4, ++i,
    el = 0;
    For[j = 1, j <= 4, ++j,
     el += Multiply[tMatrix[[i, j]], col[[j]]];
     ];
    result[[i, c]] = PolynomialMod[el, {2}];
    ];
   ];
  Return[result];
  ]

如果我使用AES-256,你能告诉我要改变什么吗?我的消息仍然是128位,我的块是32位。如何改变逆运算?

1 个答案:

答案 0 :(得分:1)

对于所有密钥大小,AES的块大小为16字节。

他只有使用不同的密钥大小只是使用不同的密钥大小,AES密钥大小为128,192和256位。

邮件大小不会根据密钥大小而改变,它取决于邮件大小,加密模式和任何填充。