鉴于三条信息:消息(字符串),签名(字符串)和公共地址(字符串),我想验证签名。在Javascript,Python和PHP的库中,这是一个简单的方法调用。但是在BitcoinJ(Java)中,我无法想出一个简单的解决方案或示例。
首先,我只想验证签名。 BitcoinJ太过分了,但它是我能找到的唯一一个Java库。它似乎也没有直接的方法调用我需要的东西。有一个方法调用需要公钥,但我有公共地址。网络上的讨论表明公钥可以来自签名。然而,它似乎并不像听起来那样直截了当。 Java还需要字节而不是字符串。听起来很容易,但努力不起作用。我找不到任何例子。
那么有人可以通过上述三条信息为我提供Java(BitcoinJ或其他)中的简单消息验证示例吗? TIA!
答案 0 :(得分: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!
}
答案 1 :(得分: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;
}
}