我正在寻找一个dart软件包,以便在Flutter应用程序中实现密钥交换协议(椭圆曲线Diffie–Hellman)。
我看了Pointycastle,它支持Diffie-Hellman。但是我找不到在哪里生成密钥的任何方法。这是java生成的:
KeyAgreement a = KeyAgreement.getInstance("ECDH", "SC");
a.init(mProvisionerPrivaetKey);
a.doPhase(publicKey, true);
想知道是否有线索可以从dart的私钥和服务器的公钥中生成私钥。
答案 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();