我做了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,.......}
现在是第一轮的操作。它是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];
我应该得到哪种尺寸的结果?也许这是一个愚蠢的问题,但我一直坚持下去。
现在我想将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];
]
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位密钥。
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位。如何改变逆运算?
答案 0 :(得分:1)
对于所有密钥大小,AES的块大小为16字节。
他只有使用不同的密钥大小只是使用不同的密钥大小,AES密钥大小为128,192和256位。
邮件大小不会根据密钥大小而改变,它取决于邮件大小,加密模式和任何填充。