1

给定三个信息:消息(字符串)、签名(字符串)和公共地址(字符串),我想验证签名。在 Javascript、Python 和 PHP 库中,这是一个简单的方法调用。但是在 BitcoinJ (Java) 中,我无法提出一个简单的解决方案或示例。

首先,我只想验证签名。BitcoinJ 有点矫枉过正,但它是我能找到的唯一 Java 库。它似乎也没有我需要的直接方法调用。有一个方法调用需要公钥,但我有公共地址。网络上的讨论表明公钥可以来自签名。然而,这似乎并不像听起来那么简单。Java 也需要字节而不是字符串。听起来很容易,但努力没有奏效。我找不到任何例子。

那么有人可以为我提供一个使用上述三条信息在 Java(BitcoinJ 或其他)中进行简单消息验证的示例吗?蒂亚!

4

2 回答 2

1

发表我自己的答案:

String loginSig = ""; // base64 encoded signature
String pubAddress = ""; // bitcoin public address
String message = "Hello World";

ECKey result = new ECKey().signedMessageToKey(message, loginSig);

if (pubAddress.equals(result.toAddress(NetworkParameters.prodNet()).toString())) {
    // success!
}
于 2015-08-19T15:17:43.593 回答
0

这是对 mohrt 答案的更正,没有不推荐使用的调用,并从提供的地址猜测网络。

/**
 * Validate a signature.
 *
 * @param address   Bitcoin address
 * @param signature Signature content
 * @param message   Signed message
 * @return true if the signature of a given message by the given address is correct.
 */
public boolean isValidSignature(String address, String signature, String message) {
    try {
        return ECKey.signedMessageToKey(message, signature).toAddress(Address.fromBase58(null, address).getParameters()).toString().equals(address);
    } catch (Exception e) {
        return false;
    }
}
于 2017-04-04T07:39:13.653 回答