我正在编写逻辑以在 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;
        }

难道我做错了什么?