Сценарий таков: у меня разговаривают клиент и сервер.Вот стандартная идея:
- Используйте Диффи-Хеллмана для генерации секретного ключа между клиентом и сервером.
- Используйте этот секретный ключ для шифра 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';`