飞镖-密钥生成方法

时间:2019-09-08 05:48:05

标签: dart secret-key ecdh pointycastle

我正在寻找一个dart软件包,以便在Flutter应用程序中实现密钥交换协议(椭圆曲线Diffie–Hellman)。

  • app在登录期间生成密钥对并将公钥发送到服务器(因此每次登录都会生成一个新的密钥对)
  • 服务器发回刚生成的公钥
  • 应用程序通过其私钥和服务器的公钥生成私钥
  • 应用程序包含发送到服务器的所有后续消息的hmac

我看了Pointycastle,它支持Diffie-Hellman。但是我找不到在哪里生成密钥的任何方法。这是java生成的:

 KeyAgreement a = KeyAgreement.getInstance("ECDH", "SC");
 a.init(mProvisionerPrivaetKey);
 a.doPhase(publicKey, true);

想知道是否有线索可以从dart的私钥和服务器的公钥中生成私钥。

1 个答案:

答案 0 :(得分:0)

这是使用pointycastle从本地EC密钥对和服务器的公共点生成Java兼容共享机密的方法。 (请注意,Java的KeyAgreement仅使用点的x坐标-y未使用。我对SC提供程序并不熟悉,该提供程序可能会做不一样。

Uint8List sharedSecret(AsymmetricKeyPair localPair, ECPoint remotePublicPoint) {
  var ss = remotePublicPoint * (localPair.privateKey as ECPrivateKey).d;
  return hex.decode(toHex(ss.x.toBigInteger()));
}

toHex是一种实用程序,可将BigInt打印到十六进制,以确保十六进制数字为偶数。

String toHex(BigInt bi) {
  var hex = bi.toRadixString(16);
  return (hex.length & 1 == 0) ? hex : '0$hex';
}

hex.decode来自package:convert(注意-不是dart:convert),因此请确保将其添加到pubspec.yaml并导入:import 'package:convert/convert.dart';

最后,要使用aaaaaa,bbbbbb格式从十六进制解析服务器的公共点,请使用:

ECPoint parsePoint(String s) {
  var parts = s.split(',');
  return domainParams.curve.createPoint(
    BigInt.parse(parts[0], radix: 16),
    BigInt.parse(parts[1], radix: 16),
  );
}

其中domainParams是您的曲线,例如:

var domainParams = ECCurve_secp256k1();