나는이 질문이 매우 구체적이지만, PHP와 클라이언트간에 Elliptic Curve Diffie-Hellman 알고리즘 (ECDH)을 사용하는 두 라이브러리를 기반으로 키 교환을 시도했다. 소리 :Elliptic Curve Diffie-Hellman을 자바 스크립트로 연결할 수 없다.
PHP는 부분에 대한 https://github.com/mdanter/phpecc 및
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 것을 발견?
감사합니다.
분명히 그렇습니다! 이 문제를 어떻게 해결할 수 있습니까? – centurian