当前位置: 首页 > 知识库问答 >
问题:

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

宋健柏
2023-03-14

ed25519 java和js nacl都实现了ed25519加密签名方法。然而,我从ed25519 java获得了一个公钥和一个签名消息(使用公钥对应的私钥签名),并尝试在js中使用公钥验证签名消息。这给出了一个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());
    }
}

检查有效调用返回true。

输出签名:of mu_mczzzcjp2c-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为空,但如果可以使用公钥打开签名,则应将“www.example.com”作为输出。

不确定它是否会影响工作,但是Java的字节数组是有符号的,而js-nacl使用Javascript的Uint8Array无符号字节数组。

共有1个答案

越伟泽
2023-03-14

Ed25519的实现方式有两种不同:

>

  • 私钥格式有点不同。有些使用扩展的私钥工作,有些在签名时要求同时使用种子和公钥。您的java实现属于后一类。

    这种差异仅适用于签名功能,而不适用于验证功能。这不会给你带来任何问题。

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

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

    这种不匹配会给你带来麻烦。要修复它,您需要将concat(签名、消息)传递到crypto\u sign\u open

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

  •  类似资料:
    • 问题内容: 我正在与一个以Java中的图形渲染器为目标的小组合作。我试图弄清楚以 java.awt.Graphics2D 为目标是否会向前兼容。即,其他库(例如JavaFX)是否可以显示 Graphics2D 实例的渲染? java.awt.Graphics2D 和 javafx.scene.canvas.GraphicsContext 之间是否存在互操作性? 或者,如果不是直接在 Graphic

    • 本文向大家介绍Java 8中的中间操作和终端操作之间的区别,包括了Java 8中的中间操作和终端操作之间的区别的使用技巧和注意事项,需要的朋友参考一下 在Java 8中引入了Stream,它仅用于处理数据组而不用于存储元素。它不修改实际的集合,它们仅根据流水线方法提供结果。 Stream api支持多种操作,并且操作分为两部分- 中间操作—这些操作用于管道化其他方法并转换为其他流。它们不会产生结果

    • 在这个问题中,我必须调用一个第三方Java库,该库期望,其结果来自Scala例程返回。 我会将Scala-Future封装到一个新的Java-Future中,但是没有办法实现Java-Future方法< code > def cancel(mayinterruptirunning:Boolean):Boolean ,因为它会中断封装的Scala-Future(否则请告诉我)。 我该如何解决这个问题

    • 本文向大家介绍C#中父窗口和子窗口之间控件互操作实例,包括了C#中父窗口和子窗口之间控件互操作实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中父窗口和子窗口之间控件互操作的方法。分享给大家供大家参考。具体分析如下: 很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件。相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即

    • 本文向大家介绍在Objective-C和Swift之间进行细粒度的互操作,包括了在Objective-C和Swift之间进行细粒度的互操作的使用技巧和注意事项,需要的朋友参考一下 示例 将API标记为时NS_REFINED_FOR_SWIFT,将其__导入Swift时将以两个下划线()作为前缀: 生成的界面如下所示: 现在,您可以使用更“ Swifty”扩展名替换API。在这种情况下,我们可以使用

    • Java 互操作 Clojure程序可以使用所有的java类以及接口。和在java里面一样 java.lang 这个包里面的类是默认导入的。你可以手动的用 import 函数来导入其它包的类。看例子: (import '(java.util Calendar GregorianCalendar) '(javax.swing JFrame JLabel)) 同时也可以看下宏ns下面的 [: