ed25519 -javaとjs-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
符号なしバイト配列を使用します。