Encryption AES-128和AES-256的使用有什么区别?如何更改状态矩阵或舍入操作?
我做了一个AES-128的简单实现,它只使用了一轮。我想知道如果我要实现AES-256,将如何更改状态矩阵或舍入操作?我知道我必须使用256位密钥,但我的消息仍然有128位长度。我知道ShiftRow的运作将会改变 嗯。例如,我有以下必须加密的消息: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,这就是为什
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];
]