这是如何使用本地 EC 密钥对和服务器的公共点生成与 Java 兼容的共享密钥pointycastle
。(请注意,JavaKeyAgreement
仅使用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();