1

ed25519 -javajs-naclの両方に、ed25519 暗号署名メソッドが実装されています。ただし、ed25519-java から公開鍵と署名付きメッセージ (公開鍵に対応する秘密鍵を使用して署名) を取得し、js-nacl の公開鍵を使用して署名付きメッセージを検証しようとしました。これによりnull値が得られました。つまり、署名されたメッセージを公開鍵で開くことができませんでした。

私の質問は、Java にサインインし、Javascript で署名を検証することは可能ではないでしょうか? ある場合、またはない場合、その理由は何ですか?

Java コード:

public static void main(String[] args) {
    byte[] privateKey = new byte[32];
    Arrays.fill(privateKey, (byte) 0);
    byte[] publicKey = ed25519.publickey(privateKey);
    byte[] signature = ed25519.signature("www.example.com".getBytes(), privateKey, publicKey);
    System.out.println("Signature: " + Base64.encodeBase64URLSafeString(signature) + "\nPublicKey: " + Base64.encodeBase64URLSafeString(publicKey));
    try{
        System.out.println("Verification: " + ed25519.checkvalid(signature, "www.example.com".getBytes(), publicKey));
    } catch (Exception e){
        System.out.println(e.getStackTrace());
    }
}

checkvalid 呼び出しは true を返します。

出力署名:oFMU_mC_zzZcJP2C-uTqsyUHoyLUSnwirJbhcdkSTnj2nI_p-VgKAqN5bFMPKsKYiWvyiUgHWu3s4OyB9WbKDg

出力公開鍵:O2onvM62pC1io6jQKm8Nc2UyFXcd4kOmOsBIoYtZ2ik

JavaScript コード:

var signature = "oFMU_mC_zzZcJP2C-uTqsyUHoyLUSnwirJbhcdkSTnj2nI_p-VgKAqN5bFMPKsKYiWvyiUgHWu3s4OyB9WbKDg";
var pk = "O2onvM62pC1io6jQKm8Nc2UyFXcd4kOmOsBIoYtZ2ik";

var nacl_factory = require('js-nacl');
var nacl = nacl_factory.instantiate();
var b64 = require('urlsafe-base64');
var x = nacl.crypto_sign_open(Uint8Array(b64.decode(signature)), Uint8Array(b64.decode(pk)));
response.send(x);

xは null ですが"www.example.com"、署名を公開鍵で開くことができた場合は出力として与える必要があります。

動作に影響があるかどうかはわかりませんが、Java のバイト配列は符号付きですが、js-nacl は Javascript のUint8Array符号なしバイト配列を使用します。

4

1 に答える 1

5

Ed25519 の実装は、次の 2 つの点で異なります。

  1. 秘密鍵の形式は少し異なります。拡張された秘密鍵を使用するものもあれば、署名時にシードと公開鍵の両方を要求するものもあります。あなたの Java 実装は後者のカテゴリに分類されます。

    この違いは署名機能にのみ適用され、検証機能には適用されません。それはあなたにとって何の問題も引き起こしません。

  2. 一部の実装では、署名が署名とメッセージの連結を返す「署名ボックス」を使用します ( signedMessage.Length = 64 + message.Length)。検証するとき、署名されたメッセージが入力として期待されます。元の NaCl の実装と JavaScript の実装は、このカテゴリに分類されます。

    一部の実装では、64 バイトの署名が返されます。彼らは、検証時にプレーンテキストを別のパラメーターとして期待しています。あなたの Java 実装はこのカテゴリに分類されます。

    この不一致が問題の原因です。それを修正するには、に渡す必要がありconcat(signature, message)ますcrypto_sign_open

より詳細な説明については、Brian Warner のEd25519 Keys記事を参照してください。

于 2014-04-23T11:32:53.680 に答える