В данный момент я работаю над реализацией обмена ключами ECDH. Я использую для этого кривую P-384. Возможны и другие кривые, но я думаю, что реализации должны быть очень похожими.
Клиент (Javascript) и сервер (Java) хотят найти общий секрет и поэтому
1) Сервер создает открытый и закрытый ключи.
2) Сервер отправляет открытый ключ клиенту. Примечание. Открытый ключ имеет длину 120 байт.
3) Клиент создает закрытый и открытый ключ. Примечание: открытый ключ имеет длину 97 байт, а закрытый ключ имеет длину 48 байт.
4) Клиент пытается вычислить общий секрет. Однако я получаю сообщение об ошибке «Неверный аргумент».
На стороне клиента я использую Google-Closure-Library с пакетом e2e. ( https://code.google.com/p/end-to-end/source/browse/javascript/crypto/e2e#e2e%2Fecc )
Для реализации я просмотрел файлы ecdh.js и ecdh_test.html.
Моя реализация на стороне клиента выглядит так:
var serverPublicKeyStringAsHex = "3076301006072a8648ce3d020106052b8104....." //*
var serverPublicKey = goog.crypt.hexToByteArray(serverPublicKeyStringAsHex)
var bobKeyPair = e2e.ecc.Protocol.generateKeyPair("P_384");
var bobECDH = new e2e.ecc.Ecdh("P_384");
var bobMessage = bobECDH.bob(serverPublicKey, bobKeyPair['privKey']);
Как уже упоминалось, я получаю сообщение об ошибке «неверный аргумент» в консоли. Подробнее:
Я хотел знать, может ли эта ошибка появиться из-за неправильной длины открытого ключа сервера? Если это причина, в чем может быть проблема в моей реализации? Я использую тот же EC на стороне сервера.
С этим вопросом "public-key-length" я узнал, что существуют несжатые и сжатые представления ключи. Однако я не думаю, что это может быть моей проблемой, поскольку длина ключа (открытый ключ сервера: 120 байт, открытый ключ клиента: 97 байт) не соответствует описанным шаблонам (размер поля + 1 против 2 * размер поля + 1)
Спасибо за любую помощь, так как я потратил так много часов на эту проблему и не знаю, что я могу попробовать дальше.
* Если это важно знать, что это полный открытый ключ: 3076301006072a8648ce3d020106052b8104002203620004f87dc79943b20e0f57d61f8b7d02425baa4d1220b8b8c1e3596f5ab49ae6ad2acffad95e5860231821b4aedefe5cf1d0262563cffdc8dbe4f28973ebebf3985ba50c7b275888934dcd607007c288a5afaf196834395983cd7f01c548e5edca0b EM>