我正在编写逻辑以在 Dart 中签名和验证字符串。
我正在导入以下库
import 'package:web3dart/web3dart.dart';
import 'package:eth_sig_util/eth_sig_util.dart';
import 'package:collection/collection.dart';
import 'package:web3dart/crypto.dart';
我使用以下代码生成密钥对。我利用'package:web3dart/web3dart.dart';
图书馆来实现它。
var random_number = Random.secure();
EthPrivateKey keyPair = EthPrivateKey.createRandom(random_number);
我循环运行多次签名和验证。
当我运行超过 100 次时,我得到 1-2 次验证失败。当我运行超过 1000 次时,这个错误率也是成正比的。大约有 1-2% 的验证失败。这是我的签名逻辑
Future<String> sign (final String message) async
{
List<int> message_list = message.codeUnits;
final Uint8List bytes_message = Uint8List
.fromList(message_list);
String signature = EthSigUtil.signPersonalMessage
(
privateKey: bytesToHex(keyPair.privateKey),
message: bytes_message
);
return signature;
}
验证代码如下:
Future<bool> verify (final String message, final String signature, String public_key) async
{
String recovered_address = '';
List<int> message_list = message.codeUnits;
final Uint8List bytes_message = Uint8List
.fromList(message_list);
try {
recovered_address = EthSigUtil.recoverPersonalSignature
(
signature: signature,
message: bytes_message
);
}
catch (e)
{
return false;
}
var given_address = publicKeyToAddress(hexToBytes(public_key));
bool is_verified = const ListEquality()
.equals(
hexToBytes(recovered_address),
given_address
);
return is_verified;
}
难道我做错了什么?