1

メッセージ (文字列)、署名 (文字列)、公開アドレス (文字列) の 3 つの情報が与えられた場合、署名を検証したいと考えています。Javascript、Python、および PHP のライブラリでは、これは単純なメソッド呼び出しです。しかし、BitcoinJ (Java) では、簡単な解決策や例を思いつくことができません。

まず、署名を検証したいだけです。BitcoinJ はやり過ぎですが、私が見つけた唯一の Java ライブラリです。また、必要なものに対する直接メソッド呼び出しがないようです。公開鍵を必要とするメソッド呼び出しがありますが、私は公開アドレスを持っています。Web での議論は、公開鍵が署名から入手できることを示しています。ただし、これは思ったほど簡単ではないようです。Java は、文字列ではなくバイトも必要とします。簡単に聞こえますが、努力はうまくいきません。私が見つけることができる例はありません。

上記の 3 つの情報を使用して、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

これは、非推奨の呼び出しを使用せずにモールトの回答を修正し、提供されたアドレスからネットワークを推測するものです。

/**
 * 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 に答える