java中 41f29ed1_Java和Javascript Ed25519实现之间的互操作性

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) +"

PublicKey:" + 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为空,但如果可以使用公钥打开签名,则应提供"www.example.com"作为输出。

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

1)您是在谈论加密(使用基于Curve25519的crypto_box + xsalsa20poly1305)还是签名(使用Ed25519-SHA512)? 2)请张贴相关代码以及示例消息/签名

是的,您仍在谈论加密方法。 然后,您谈论一个已签名的消息。 示例代码可以清楚地说明您的实际要求,甚至可以告诉我们出了什么问题。

不要在Java中使用string.getBytes(),它使用与语言环境相关的旧式编码。 明确指定一种编码,最好是UTF-8。

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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值