【发布时间】:2014-04-15 19:19:42
【问题描述】:
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 无符号字节数组。
【问题讨论】:
-
1) 您是在谈论加密(使用基于 Curve25519 + xsalsa20poly1305 的
crypto_box)还是签名(使用 Ed25519-SHA512)? 2)请将相关代码连同示例消息/签名一起发布 -
是的,你还在谈论加密方法。然后你谈论一个签名的消息。示例代码可以清楚地说明您的实际要求,甚至可以告诉我们出了什么问题。
-
不要在java中使用
string.getBytes(),它使用依赖于语言环境的遗留编码。明确指定编码,最好是 UTF-8。
标签: java javascript digital-signature ed25519 nacl-cryptography