Запутался, как клиент и сервер, использующий AES и Hmac, будут проверять друг друга - PullRequest
3 голосов
/ 05 марта 2012

Сценарий таков: у меня разговаривают клиент и сервер.Вот стандартная идея:

  • Используйте Диффи-Хеллмана для генерации секретного ключа между клиентом и сервером.
  • Используйте этот секретный ключ для шифра AES / CTR / PKCS7Padding на обоих клиентахи сервер.
  • Использование Hmac в исходном сообщении
  • Шифрование сообщения Hmac с помощью шифра AES

Таким образом, это позволит клиенту и серверу безопасно общаться.

Соответствующий пример кода, на который я смотрю, является учебным пособием: Подделанное сообщение с HMac, шифрование с помощью AES в режиме CTR: Расширенный стандарт шифрования «Безопасность« Учебник по Java

Я могу сгенерировать секретный ключ как для клиента, так и для сервера.Я могу зашифровать это с помощью Hmac и AES.Поскольку шифрование и дешифрование происходят независимо, я не уверен, как получить соответствующую информацию, необходимую для дешифрования.

Вот раздел, в котором я запутался:

cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);

byte[] plainText = cipher.doFinal(cipherText, 0, ctLength);
int messageLength = plainText.length - hMac.getMacLength();

hMac.init(hMacKey);
hMac.update(plainText, 0, messageLength);

byte[] messageHash = new byte[hMac.getMacLength()];

Если клиент отправляет зашифрованное сообщение, как сервер извлекает ivSpec, hMac.getMacLength() и hMacKey?Эти элементы требуются на сервере для расшифровки сообщения от клиента.

Я понимаю, что вектор инициализации (IV) можно сохранить из зашифрованного текста, поскольку он добавляется в начало результирующего зашифрованного текста (думаю, яПридется добавить его вручную, так как я не думаю, что AES-шифр это делает?).Однако длина hMacKey и hMac, используемая для проверки целостности сообщения, остается загадкой.

В последней заметке кто-нибудь может объяснить, для чего предназначена эта строка?Это для шифрования или дешифрования?

     cipherText[9] ^= '0' ^ '9';`

1 Ответ

1 голос
/ 06 марта 2012

Во-первых, для такого рода вещей используйте SSL, если вы делаете это по-настоящему. В образовательных целях этот материал классный.

Как уже говорили другие, это пример, который доказывает, что HMAC работает, когда зашифрован текст. Отсюда cipherText[9] ^= '0' ^ '9';

Чтобы использовать HMAC, вы должны убедиться, что тег аутентификации сообщений (который возвращает hmac), полученный с вашим текстом шифра, совпадает с тем, который вы должны иметь. Чтобы сделать это в этом коде, вы: 1) расшифровываете сообщение, используя согласованный вами ключ, 2) вычисляете hmac этого текста, используя другой согласованный вами ключ, и затем 3) сравниваете, что оба они совпадают.

Поскольку вы знаете эти ключи, вы можете расшифровать сообщение и вычислить Mac. Длина Mac, кстати, является фиксированным свойством функции hmac и общеизвестна.

Поскольку у вас должен быть ключ для создания действительного тега, если они совпадают, то сообщение является подлинным.

Как примечание, этот код, вероятно, небезопасен, так как вам нужно MAC зашифровать, а не незашифровать. Если вы этого не сделаете, вы столкнетесь с такими проблемами, как атака оракула Padding , которая нарушила реализацию защищенных файлов cookie. Используйте SSL для подобных вещей.

...