Не могу соединить эллиптическую кривую Диффи-Хеллмана с JavaScript
Я знаю, что это очень специфический вопрос, но я пытался обмениваться ключами между php и клиентом, используя алгоритм Диффи-Хеллмана по эллиптической кривой (ECDH), основанный на двух библиотеках, которые кажутся звучащими:
https://github.com/mdanter/phpecc для части PHP и
http://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html для части JS.
Похоже, что параметры (как видно из второй демонстрации) просто не подходят для библиотеки Mattias Danter в (1)!
Что я пробовал:
а. создать открытый ключ Алисы в php
б. возьмите x- и y-значения из (a) и поместите на демонстрационную страницу js в Стэнфорде вместо полей Алисы
с. производить со страницы (б) Публичный пункт и личный ключ Боба
д. перезапустите php в (a), но теперь сбросьте свойства Алисы к предыдущему запуску (мне пришлось добавить некоторые сеттеры в классы Маттиаса Дантера), а затем использовали открытые значения Боба и секретный ключ, чтобы сбросить Боба в значения javascript
е. импортировать ключи и сравнивать
но php ловит ошибку:
Fatal error: Uncaught exception 'ErrorException' with message 'Curve CurveFp Object
( [a:protected] => -3 [b:protected] =>
2455155546008943817740293915197451784769108058161191238065 [prime:protected] =>
6277101735386680763835789423207666416083908700390324961279 ) does not contain point
( 1328803036204499271979785126753219480492435117174 ,
-228023147101697490181439300085858154675358736333 )' in
/var/www/users/test/php/tests/ext/phpecc-master/classes/Point.php:53
При поиске в моем коде я нашел причину ошибки: это было во время вычисления общего ключа Алисой:
public function calculateKey() {
$this->agreed_key = Point::mul($this->secret, $this->receivedPubPoint)->getX();
}
Открытый ключ Боба (из JavaScript) был сохранен вEcDH::receivedPubPoint
и генерирует ошибку !!
Вот объект Алиса с некоторой идентификацией (класс EcDH):
Alice:
EcDH Object
(
[generator:EcDH:private] => Point Object
(
[curve] => CurveFp Object
(
[a:protected] => -3
[b:protected] => 2455155546008943817740293915197451784769108058161191238065
[prime:protected] => 6277101735386680763835789423207666416083908700390324961279
)
[x] => 602046282375688656758213480587526111916698976636884684818
[y] => 174050332293622031404857552280219410364023488927386650641
[order] => 6277101735386680763835789423176059013767194773182842284081
)
[pubPoint:EcDH:private] => Point Object
(
[curve] => CurveFp Object
(
[a:protected] => -3
[b:protected] => 2455155546008943817740293915197451784769108058161191238065
[prime:protected] => 6277101735386680763835789423207666416083908700390324961279
)
[x] => 1230571492519579244570075682716266141492045436832711426918
[y] => 925696034592317781055362853857916815608433923236519324844
[order] =>
)
[receivedPubPoint:EcDH:private] =>
[secret:EcDH:private] => 14506874945990177925841757912817895350330843517362
[agreed_key:EcDH:private] =>
)
Мое мнение таково, что публичные значения javascript не верны из-за того, как поля в «параметрах эллиптической кривой» реализованы вhttp://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html.
В результате поиска я обнаружил, что эти js-блоки кода Стэнфорда проблематичны по сравнению с версией php:
// ECCurveFp
// constructor
function ECCurveFp(q,a,b) {
this.q = q;
this.a = this.fromBigInteger(a);
this.b = this.fromBigInteger(b);
this.infinity = new ECPointFp(this, null, null);
}
// ----------------
// SECNamedCurves
function secp192k1() {
// p = 2^192 - 2^32 - 2^12 - 2^8 - 2^7 - 2^6 - 2^3 - 1
var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37");
var a = BigInteger.ZERO;
var b = fromHex("3");
//byte[] S = null;
var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D");
var h = BigInteger.ONE;
var curve = new ECCurveFp(p, a, b);
var G = curve.decodePointHex("04"
+ "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D"
+ "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D");
return new X9ECParameters(curve, G, n, h);
}
Есть какие-нибудь предложения?
Благодарю.