0

나는이 질문이 매우 구체적이지만, PHP와 클라이언트간에 Elliptic Curve Diffie-Hellman 알고리즘 (ECDH)을 사용하는 두 라이브러리를 기반으로 키 교환을 시도했다. 소리 :Elliptic Curve Diffie-Hellman을 자바 스크립트로 연결할 수 없다.

  1. PHP는 부분에 대한 https://github.com/mdanter/phpecc

  2. http://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html을 JS 부분에 대해.

매개 변수 (두 번째 데모에서 볼 수있는 것처럼)는 (1)의 Mattias Danter 라이브러리에 적합하지 않은 것 같습니다!

내가 시도한 것 :

a. PHP에서 앨리스 공개 키를 생성

b. (a)에서 x와 y 값을 가져 와서 앨리스 필드 대신 스탠포드의 js 데모 페이지에 넣으십시오.

c. 페이지 (b)에서 생성합니다. Bob의 공개 지점 및 개인 키

d. (a)에서 php를 다시 실행하지만 앨리스의 속성을 이전 실행으로 재설정 한 다음 Bob의 공개 값과 비밀 키를 사용하여 Bob을 자바 스크립트 값으로 재설정합니다

e.

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 

내가 오류의 원인을 찾아 내 코드를 검색 : 수입 키와

하지만 PHP는 비교가 오류를 잡는다

public function calculateKey() { 
    $this->agreed_key = Point::mul($this->secret, $this->receivedPubPoint)->getX(); 
} 

: 그것은 앨리스으로 공통 키를 계산하는 동안이었다 Bob의 공개 키 (자바 스크립트에서)는 EcDH::receivedPubPoint에 저장되어 있으며 오류가 발생합니다 !!

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] => 
) 

내 의견은 자바 스크립트 공공 값 때문에 "타원 곡선 매개 변수"아래의 방법 필드에 올바르지 않은 것입니다 http://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html에서 구현됩니다 : 여기

어떤 identation와 객체 앨리스 (ECDH 클래스)입니다. 어떤 제안이

// 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); 
} 

있습니다 검색하여

더 나는이 스탠포드의 코드 블록은 PHP 버전에 비해 문제가있다 JS 것을 발견?

감사합니다.

답변

1

JS와 PHP 라이브러리가 동일한 곡선을 사용해야합니다. 그들은 할?

+0

분명히 그렇습니다! 이 문제를 어떻게 해결할 수 있습니까? – centurian