Обмен ключами ECDH с открытыми ключами разной длины?

В данный момент я работаю над реализацией обмена ключами 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']);

Как уже упоминалось, я получаю сообщение об ошибке «неверный аргумент» в консоли. Подробнее: Скриншот FF-консоли

Я хотел знать, может ли эта ошибка появиться из-за неправильной длины открытого ключа сервера? Если это причина, в чем может быть проблема в моей реализации? Я использую тот же EC на стороне сервера.

С этим вопросом "public-key-length" я узнал, что существуют несжатые и сжатые представления ключи. Однако я не думаю, что это может быть моей проблемой, поскольку длина ключа (открытый ключ сервера: 120 байт, открытый ключ клиента: 97 байт) не соответствует описанным шаблонам (размер поля + 1 против 2 * размер поля + 1)

Спасибо за любую помощь, так как я потратил так много часов на эту проблему и не знаю, что я могу попробовать дальше.

* Если это важно знать, что это полный открытый ключ: 3076301006072a8648ce3d020106052b8104002203620004f87dc79943b20e0f57d61f8b7d02425baa4d1220b8b8c1e3596f5ab49ae6ad2acffad95e5860231821b4aedefe5cf1d0262563cffdc8dbe4f28973ebebf3985ba50c7b275888934dcd607007c288a5afaf196834395983cd7f01c548e5edca0b


person crypton00b    schedule 25.09.2014    source источник


Ответы (1)


То, что вы здесь является ASN.1 закодированный открытый ключ (вероятно X9.42 совместимы). Я предполагаю, что JavaScript просто ожидает закодированную в нем несжатую точку. Поэтому вам нужно проанализировать ASN.1 и получить несжатую точку со смещением 23 (десятичное число) в открытом ключе.

person Maarten Bodewes    schedule 25.09.2014