我需要生成 M1、M2 和 M3 以便在 SHE 模块中重新编程安全密钥。我已经验证了我的 AES_128_ECB 函数以及我的 CMAC 函数都可以针对 NIST 测试向量正常工作。我也能够毫无问题地正确生成 M1 和 M2,但是,当我将 M1||M2 输入到我的 CMAC 函数中时,我得到的结果不是我应该根据 SHE 测试向量得到的 M3 的结果SHE 文档中的内存重新编程。
以下是 M1、M2、M3 生成过程中每个步骤的所有输入和结果:
New Key: 0f 0e 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00
Auth Key: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
M1: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 1
KDF result 1 K1: 7a cb d da b8 d3 ea 7b 97 9e 4c 6d 1a eb ac 8d
KDF result 1 K2: 7a cb d da b8 d3 ea 7b 97 9e 4c 6d 1a eb ac 8d
KDF result 2 K1: 6a 40 18 d6 87 a4 67 fc 15 14 25 af 38 9 7d 43
KDF result 2 K2: 55 72 74 af 5b fe d7 1f 26 15 ea 24 24 74 12 1f
K1: 11 8a 46 44 7a 77 d 87 82 8a 69 c2 22 e2 d1 7e
K2: 2e bb 2a 3d a6 2d bd 64 b1 8b a6 49 3e 9f be 22
input 1 M2: 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0
output 1 M2: 2b 11 1e 2d 93 f4 86 56 6b cb ba 1d 7f 7a 97 97
输出 1 xor 输入 2 M2:24 1f 13 21 98 fe 8f 5e 6c cd bf 19 7c 78 96 97
output 2 M2: c9 46 43 b0 50 fc 5d 4d 7d e1 4c ff 68 22 3 c3
M2: 2b 11 1e 2d 93 f4 86 56 6b cb ba 1d 7f 7a 97 97 c9 46 43 b0 50 fc 5d 4d 7d e1 4c ff 68 22 3 c3
input M3: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 1 2b 11 1e 2d 93 f4 86 56 6b cb ba 1d 7f 7a 97 97 c9 46 43 b0 50 fc 5d 4d 7d e1 4c ff 68 22 3 c3
M3: c 12 41 48 ff d6 fa f7 e4 25 6a 84 53 b2 81 8d
这真让我抓狂。生成算法的输入数据直接取自 SHE 测试向量。根据算法,要获得 M3,我要做的就是在 M1||M2 上运行 CMAC,但我的结果与应有的不匹配。
我只能假设我错过了 M3 所需的一些额外步骤,而不仅仅是在 M1||M2 上运行 CMAC。这里有人对 SHE 模块和生成数据以重新编程密钥有任何经验吗?
尝试重新排列 M1||M2 的顺序,但没有成功
byte KEY_UPDATE_ENC_C[16] = { 0x01, 0x01, 0x53, 0x48, 0x45, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0 };
byte KEY_UPDATE_MAC_C[16] = { 0x01, 0x02, 0x53, 0x48, 0x45, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0 };
byte keyAuth[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
byte keyNew[16] = { 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 } ;
byte iniVec[16];
byte k1_o1[16];
byte k1[16];
byte k2_o1[16];
byte k2[16];
byte m1[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01 }
byte m2_i1[16] = { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte m2_o1[16];
byte m2_o2[16];
byte m2[32];
byte m3_i[48];
byte m3[16];
qword i;
...
// Generate K1, K2
encrypt( KEY_LEN_128, iniVec, BLOCK_LEN_128, keyAuth, k2_o1 );
for( i = 0; i < BLOCK_LEN_128; i++ )
k1_o1[i] = k2_o1[i] ^= keyAuth[i];
encrypt( KEY_LEN_128, k1_o1, BLOCK_LEN_128, KEY_UPDATE_ENC_C, k1 );
encrypt( KEY_LEN_128, k2_o1, BLOCK_LEN_128, KEY_UPDATE_MAC_C, k2 );
for( i = 0; i < BLOCK_LEN_128; i++ ) {
k1[i] ^= k1_o1[i] ^ KEY_UPDATE_ENC_C[i];
k2[i] ^= k2_o1[i] ^ KEY_UPDATE_MAC_C[i]; }
// Generate M2
encrypt( KEY_LEN_128, k1, BLOCK_LEN_128, m2_i1, m2_o1 );
for( i = 0; i < BLOCK_LEN_128; i++ )
keyNew[i] ^= m2_o1[i];
encrypt( KEY_LEN_128, k1, BLOCK_LEN_128, keyNew, m2_o2 );
for( i = 0; i < 32; i++ ) {
if( i < 16 )
m2[i] = m2_o1[i];
else
m2[i] = m2_o2[i-16]; }
// Generate M3
for( i = 0; i < 48; i++ ) {
if( i < 16 )
m3_i[i] = m1[i];
else
m3_i[i] = m2[i-16]; }
LocalSecurityGenerateCMAC( k2, KEY_LEN_128, m3_i, 48, m3, BLOCK_LEN_128 );
M3 / CMAC 结果应为: b9 d7 45 e5 ac e7 d4 18 60 bc 63 c2 b9 f5 bb 46