AES от простого шифрования до шифрованного текста - PullRequest
0 голосов
/ 11 декабря 2011

В настоящее время я работаю через Практическая криптография и пытаюсь выполнить упражнения в конце главы 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

Мои вопросы:

  1. Мой метод хранения ключа выглядит правильно?
  2. Мой общий метод выглядит правильно?
  3. Кто-нибудь знает, каким должен быть фактический ответ?

код ниже

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;
}
...