Encryption AES-128和AES-256的使用有什么区别?如何更改状态矩阵或舍入操作?

Encryption AES-128和AES-256的使用有什么区别?如何更改状态矩阵或舍入操作?,encryption,cryptography,aes,wolfram-mathematica,Encryption,Cryptography,Aes,Wolfram Mathematica,我做了一个AES-128的简单实现,它只使用了一轮。我想知道如果我要实现AES-256,将如何更改状态矩阵或舍入操作?我知道我必须使用256位密钥,但我的消息仍然有128位长度。我知道ShiftRow的运作将会改变 嗯。例如,我有以下必须加密的消息: message = "encryptionaes256"; key = "keyskeyskeyskeys"; px = x^8 + x^4 + x^3 + x + 1; 现在我想创建我的状态矩阵(我不知道如何创建AES-256,这就是为什

我做了一个AES-128的简单实现,它只使用了一轮。我想知道如果我要实现AES-256,将如何更改状态矩阵或舍入操作?我知道我必须使用256位密钥,但我的消息仍然有128位长度。我知道ShiftRow的运作将会改变

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

 message = "encryptionaes256";
 key = "keyskeyskeyskeys";
 px = x^8 + x^4 + x^3 + x + 1;
现在我想创建我的状态矩阵(我不知道如何创建AES-256,这就是为什么我的代码将描述AES-128):

我应该得到多大的结果?也许这是个愚蠢的问题,但我还是被它难住了

第二步。将矩阵状态的元素替换为规则集表格 现在我想将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[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];
  ]
SubBytes[matrix,table]:=Block[{i,j,result,pos},
结果=表[0,{4},{4}];

对于[i=1,对于所有密钥大小,iAES的块大小为16字节

他使用不同密钥大小的唯一区别就是使用不同的密钥大小,AES密钥大小分别为128、192和256位


消息大小不会根据密钥大小而改变,它由消息大小、加密模式和任何填充决定。

这是否意味着我的所有操作都可以不经修改地工作?对于较大的密钥大小,轮数会增加。128位为10,192位为12,256位为15轮。请参阅。我假设此AES实现这不是为了生产,那将是一个非常糟糕的主意。
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];
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];
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[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];
  ]
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];
  ]
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];
  ]