对不起我的英语,- 太糟糕了:) 但这不是我的母语。我是俄国人。
检查数组 [0] 的第一个 MSB(7 位),然后将其向左移动。如果 MSB 7 位为 == 1,则异或;或者保存数组 [0] 的第一个 MSB 位,并在移位后将此位放在数组 [15] 的末尾(LSB 位)。
只是证明它在这里:
https ://www.nxp.com/docs/en/application-note/AN10922.pdf
试试这个方法:
零 <- 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
会话密钥 <- 00 01 02 03 E3 27 64 0C 0C 0D 0E 0F 5C 5D B9 D5
数据 <- 6F 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00
首先你必须用 SesionKey 加密 16 个字节(零);
enc_aes_128_ecb(Zeros);
你得到加密数据。
加密数据 <- 3D 08 A2 49 D9 71 58 EA 75 73 18 F2 FA 6A 27 AC
检查 EncryptedData[0] 的第 7 位 [MSB - LSB] == 1?将 i 切换为 true;
bool i = false;
if (EncryptedData[0] & 0x80){
i = true;
}
然后将所有 EncryptedData 移位到 1 位 <<。
ShiftLeft(EncryptedData,16);
现在,当 i == true - 最后一个字节 [15] 与 0x87 异或
if (i){
ShiftedEncryptedData[15] ^= 0x87;
}
7A 11 44 93 B2 E2 B1 D4 EA E6 31 E5 F4 D4 4F 58
将其另存为 KEY_1。
尝试 ShiftedEncryptedData[0] == 1 的第 7 位 [MSB - LSB]?
i = false;
if (ShiftedEncryptedData[0] & 0x80){
i = true;
}
然后将所有 ShiftedEncryptedData 移位到 1 位 <<。
ShiftLeft(ShiftedEncryptedData,16);
现在,当 i == true - 最后一个字节 [15] 与 0x87 异或
if (i){
ShiftedEncryptedData[15] ^= 0x87;
}
F4 22 89 27 65 C5 63 A9 D5 CC 63 CB E9 A8 9E B0
将其另存为 KEY_2。
现在我们获取我们的数据(6F 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00)
正如迈克尔所说 - 使用 0x80 0x00 填充命令...
XOR Data with KEY_2 - 如果命令被填充,或者 KEY_1 如果没有。如果我们有更多的 16 个字节(例如 32 个),你必须对最后 16 个字节进行异或。
然后加密它:
enc_aes_128_ecb(Data);
现在你有一个 CMAC。
CD C0 52 62 6D F6 60 CA 9B C1 09 FF EF 64 1A E3
零 <- 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
会话密钥 <- 00 01 02 03 E3 27 64 0C 0C 0D 0E 0F 5C 5D B9 D5
Key_1 <- 7A 11 44 93 B2 E2 B1 D4 EA E6 31 E5 F4 D4 4F 58
Key_2 <- F4 22 89 27 65 C5 63 A9 D5 CC 63 CB E9 A8 9E B0
数据 <- 6F 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00
CMAC <- CD C0 52 62 6D F6 60 CA 9B C1 09 FF EF 64 1A E3
C/C++ 函数:
void ShiftLeft(byte *data, byte dataLen){
for (int n = 0; n < dataLen - 1; n++) {
data[n] = ((data[n] << 1) | ((data[n+1] >> 7)&0x01));
}
data[dataLen - 1] <<= 1;
}
祝你今天过得愉快 :)