В настоящее время я работаю через Практическая криптография и пытаюсь выполнить упражнения в конце главы 4. Есть пара вопросов, которые просят вас расшифровать немного зашифрованного текста в шестнадцатеричном виде с помощью ключ также в шестнадцатеричном виде. Я использую криптографические библиотеки openssl, чтобы попытаться сделать это.
Мне трудно понять, правильно ли я это сделал, потому что я сделал это несколькими способами и получаю разные ответы. Кроме того, поскольку указанные значения представлены в шестнадцатеричном формате, мне сложно получить их в пригодное для использования значение.
Я просто использую printf, чтобы поместить шестнадцатеричные значения в строку. Мне кажется, это правильно, потому что я могу прочитать их снова, и они верны. Ключ сложнее, я пытаюсь сохранить числа непосредственно в структуре ключа, предоставленной openssl, но я не знаю, как реализация openssl использует структуру ключа.
Мой код ниже. Если я запускаю его в этом формате, я получаю следующий вывод.
In: 0x53: 0x9b: 0x33: 0x3b: 0x39: 0x70: 0x6d: 0x14: 0x90: 0x28: 0xcf: 0xe1: 0xd9: 0xd4: 0xa4: 0x7
Out: 0xea: 0xb4: 0x1b: 0xfe: 0x47: 0x4c: 0xb3: 0x2e: 0xa8: 0xe7: 0x31: 0xf6: 0xdb: 0x98: 0x4e: 0xe2
Мои вопросы:
- Мой метод хранения ключа выглядит правильно?
- Мой общий метод выглядит правильно?
- Кто-нибудь знает, каким должен быть фактический ответ?
код ниже
int main( void )
{
unsigned char InStr [100];
unsigned char OutStr[100];
char KeyStr[100];
AES_KEY Key;
Key.rd_key[0] = 0x8000000000000000;
Key.rd_key[1] = 0x0000000000000000;
Key.rd_key[2] = 0x0000000000000000;
Key.rd_key[3] = 0x0000000000000001;
Key.rounds = 14;
sprintf( InStr, "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\0",
0x53, 0x9B, 0x33, 0x3B, 0x39, 0x70, 0x6D, 0x14,
0x90, 0x28, 0xCF, 0xE1, 0xD9, 0xD4, 0xA4, 0x07 );
AES_decrypt( InStr, OutStr, &Key );
printf( "In : %#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx\n",
InStr[0], InStr[1], InStr[2], InStr[3], InStr[4], InStr[5], InStr[6], InStr[7],
InStr[8], InStr[9], InStr[10], InStr[11], InStr[12], InStr[13], InStr[14], InStr[15] );
printf( "Out: %#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx:%#hx\n",
OutStr[0], OutStr[1], OutStr[2], OutStr[3], OutStr[4], OutStr[5], OutStr[6], OutStr[7],
OutStr[8], OutStr[9], OutStr[10], OutStr[11], OutStr[12], OutStr[13], OutStr[14], OutStr[15] );
return 0;
}