Sry для моего английского языка, - его страшный :), но это не мой родной язык. Я русский.
Проверьте сначала MSB (7 бит) массива [0], а затем сдвиньте это налево. А затем XOR, если бит MSB 7 был равен 1; Или сохраните первый бит MSB бит [0] и после того, как shiffting поместите этот бит в конец массива [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
SessionKey < - 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 0 0 0 00 00 00 00 00
Сначала вы должны зашифровать 16 байтов (нулей) с помощью SesionKey;
enc_aes_128_ecb(Zeros);
И получить зашифрованные данные.
< EncryptedData - 3D 08 А2 49 D9 71 58 75 73 EA 18 F2 FA 6A 27 переменного тока
Проверить бит 7 [MSB - младший бит] из EncryptedData [0] == 1? переключить i в true;
bool i = false;
if (EncryptedData[0] & 0x80){
i = true;
}
Затем сделайте Shiffting всех EncryptedData 1 бит < <.
ShiftLeft(EncryptedData,16);
И теперь, когда я == TRUE - XOR последний байт [15] с 0x87
if (i){
ShiftedEncryptedData[15] ^= 0x87;
}
7А 11 44 93 В2 В1 Е2 Д4 Е.А. Е6 31 Е5 F4 D4 4F 58
Сохраните его как KEY_1.
Попробуйте бит 7 [MSB - LSB] ShiftedEncryptedData [0] == 1?
i = false;
if (ShiftedEncryptedData[0] & 0x80){
i = true;
}
Затем сделайте Shiffting всех ShiftedEncryptedData 1 бит < <.
ShiftLeft(ShiftedEncryptedData,16);
И теперь, когда я == TRUE - XOR последний байт [15] с 0x87
if (i){
ShiftedEncryptedData[15] ^= 0x87;
}
F4 22 89 27 65 63 С5 А9 Д5 CC 63 КБ Е9 A8 9E B0
Сохраните его как KEY_2.
Теперь мы принимаем наши данные (6F 80 00)
Как Майкл Сэя - команда коврик с 0x80 0x00 ...
XOR Данные с KEY_2 - если команда была заполнена, или KEY_1, если нет. Если у нас больше 16 байт (например, 32), вы должны XOR только последние 16 байт.
Затем зашифровать:
enc_aes_128_ecb(Data);
Теперь у вас есть КЦР.
CD-С0 52 62 6D F6 60 CA 9В C1-09 FF EF 64 1A E3
Нули < - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
< SessionKey - 00 01 02 03 27 64 Е3 0C 0C 0D 0E 0F 5C 5D В9 Д5
Key_1 < - 7A 11 44 93 В2 Е2 В1 Д4 Е.А. Е6 31 Е5 F4 D4 4F 58
Key_2 < - F4 22 89 27 65 С5 63 А9 Д5 CC 63 КБ Е9 A8 9E В0
данных < - 6F 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00
КЦР < - CD-С0 52 62 6D F6 60 CA 9В 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;
}
Имейте хороший день :)
Привет, Мохаммад, смогли ли вы это разрешить? Я столкнулся с той же проблемой ... – macbutch
Нет, я еще не смог решить эту проблему. –
Я думаю, что понял (см. Мой ответ). Большая проблема, с которой я столкнулся, заключается в том, что я неправильно вычислял сеансовый ключ. – macbutch