繁体   English   中英

Java和Javascript Ed25519实现之间的互操作性

[英]Interoperability between Java and Javascript Ed25519 implementations

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无符号的字节数组。

Ed25519的实现在两个方面有所不同:

  1. 私钥格式有些不同。 有些使用扩展的私钥,有些则在签名时要求种子和公钥。 您的Java实现属于后一类。

    此差异仅适用于签名功能,不适用于验证功能。 它不会给您带来任何问题。

  2. 一些实现使用“签名框”,其中签名返回签名和消息的串联( signedMessage.Length = 64 + message.Length )。 验证时,他们希望已签名的消息作为输入。 原始的NaCl实现和您的javascript实现都属于此类。

    一些实现返回64字节签名。 他们希望在验证时将纯文本作为单独的参数。 您的Java实现属于此类。

    这种不匹配会引起您的麻烦。 要修复它,您需要将concat(signature, message)传递给crypto_sign_open

您应该阅读Brian Warner的Ed25519 Keys文章以获得更详细的解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM