繁体   English   中英

无法使用JavaScript桥接椭圆曲线Diffie-Hellman

[英]Can't bridge Elliptic Curve Diffie-Hellman with javascript

我知道这是一个非常具体的问题,但是我尝试使用基于2个听起来不错的库的椭圆曲线Diffie-Hellman算法(ECDH)在php和客户端之间交换密钥:

  1. https://github.com/mdanter/phpecc用于php部分,

  2. 对于js部分, 请http://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html

似乎参数(如在第二个演示中可以看到的)对于(1)中的Mattias Danter库来说不合适!

我试过的

一种。 在php中产生Alice公钥

从(a)中获取x和y值,并将其放在斯坦福的js演示页中,代替Alice字段

C。 从(b)页产生鲍勃的公钥和私钥

d。 在(a)中重新运行php,但现在将爱丽丝的属性重置为之前的运行(我必须在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并产生错误!

这是带有某种标识的对象Alice(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] =>
)

我的观点是,由于http://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html中实现了“椭圆曲线参数”下的字段,因此javascript公共值不正确。

通过搜索更多内容,我发现斯坦福代码的这些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库使用相同的曲线。 有吗

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM