Я знаю, что это очень конкретный вопрос, но я попытался обменять ключи между php и клиентом, используя алгоритм Elliptic Curve Diffie-Hellman (ECDH) на основе двух библиотек, которые кажутся звуковыми:
https://github.com/mdanter/phpecc для части php и
http://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html для части js.
Кажется, что параметры (как видно из второй демонстрации) просто не соответствуют библиотеке Mattias Danter в (1)!
То, что я пробовал:
а. выпустить открытый ключ Alice в php
б. возьмите x- и y-значения из (a) и разместите демонстрационную страницу js в Стэнфорде вместо полей Алисы
с. производить со страницы (б) общественная точка и частный ключ Боба
д. повторно запустите php в (a), но теперь сбросьте свойства Алисы к предыдущему запуску (мне пришлось добавить некоторые сеттеры в классах Mattias Danter), а затем использовались общедоступные значения и секретный ключ Боба для сброса значений Боба на 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(); }
Открытый ключ Bob (из 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); }
Есть ли предложения?
Благодарю.
Вы должны убедиться, что библиотеки JS и PHP используют одну и ту же кривую. Они?