使用ED25519键和Bouncy Castle(Java)对Json进行签名/验证

用户名

我已经使用ssh-keygen -t ed25519生成了以下密钥

PRIVATE KEY:
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1r.....dFUQE=
-----END OPENSSH PRIVATE KEY-----

PUBLIC KEY:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGWZbgFOWl97YZJ5Voljoz0f52jRO24jqLLcEhWtalo6 USER@LAPTOP

我试图使用上面的键来签名和验证json字符串,但是,verifySignature总是返回false。

    byte[] privateKeyBytes = Files.readAllBytes(Paths.get("C:\\workspace\\ssh\\ed25519"));
    Ed25519PrivateKeyParameters privateKey = new Ed25519PrivateKeyParameters(privateKeyBytes, 0);

    byte[] publicKeyBytes = Files.readAllBytes(Paths.get("C:\\workspace\\ssh\\ed25519.pub"));
    Ed25519PublicKeyParameters publicKey = new Ed25519PublicKeyParameters(publicKeyBytes, 0);

    byte[] message = "Json String".getBytes("utf-8");

    // create the signature
    Signer signer = new Ed25519Signer();
    signer.init(true, privateKey);
    signer.update(message, 0, message.length);
    byte[] signature = signer.generateSignature();

    // verify the signature
    Signer verifier = new Ed25519Signer();
    verifier.init(false, publicKey);
    verifier.update(message, 0, message.length);
    boolean verified = verifier.verifySignature(signature);

验证始终是错误的。任何的想法...

尝试使用Bouncy Castle(Java)遵循ED25519密钥的重建

托帕可

私钥和公钥Ed25519的大小均为32个字节。它们可以封装为不同的格式。ssh-keygen使用所使用的语句以OpenSSH格式生成两个Ed25519密钥。此格式不能直接导入。但是,BouncyCastle为此提供了帮助程序类。

私钥可以使用加载,PemReader并使用导入到Ed25519PrivateKeyParameters实例中OpenSSHPrivateKeyUtil.parsePrivateKeyBlob()OpenSSHPublicKeyUtil.parsePublicKey()允许将公共密钥的Base64解码主体导入Ed25519PublicKeyParameters实例。

使用ssh-keygen -t ed25519外观创建的密钥对,例如,如下所示:

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACDbBP+5jmEtjh1JvhzVQsvvTC2IQrX6P68XzrV7ZbnGsQAAAKBgtw9/YLcP
fwAAAAtzc2gtZWQyNTUxOQAAACDbBP+5jmEtjh1JvhzVQsvvTC2IQrX6P68XzrV7ZbnGsQ
AAAEAaKYn22N1O78HfdG22C7hcG2HiezKMzlq4JTdgYG1DstsE/7mOYS2OHUm+HNVCy+9M
LYhCtfo/rxfOtXtlucaxAAAAHHRmbG9yZXNfZHQwMUB0ZmxvcmVzX2R0MDEtUEMB
-----END OPENSSH PRIVATE KEY-----

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINsE/7mOYS2OHUm+HNVCy+9MLYhCtfo/rxfOtXtlucax whatever

这两个密钥都可以导入,并用于签名和验证,如下所示:

import java.io.FileReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;
import org.bouncycastle.crypto.Signer;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.signers.Ed25519Signer;
import org.bouncycastle.crypto.util.OpenSSHPrivateKeyUtil;
import org.bouncycastle.crypto.util.OpenSSHPublicKeyUtil;
import org.bouncycastle.util.io.pem.PemReader;

...

byte[] message = "Json String".getBytes("utf-8");

// Load private key
AsymmetricKeyParameter privateKeyParameters = null;
String pathPrivateKey = "<path to private key>";
try (FileReader fileReader = new FileReader(pathPrivateKey);
     PemReader pemReader = new PemReader(fileReader)) {     
    byte[] privateKeyContent = pemReader.readPemObject().getContent();
    privateKeyParameters = OpenSSHPrivateKeyUtil.parsePrivateKeyBlob(privateKeyContent);
}
    
// Load public key  
String pathPublicKey = "<path to public key>";      
String publicKeyBody = new String(Files.readAllBytes(Paths.get(pathPublicKey)), StandardCharsets.UTF_8).split(" ")[1];
AsymmetricKeyParameter publicKeyParameters = OpenSSHPublicKeyUtil.parsePublicKey(Base64.getDecoder().decode(publicKeyBody));

// Sign
Signer signer = new Ed25519Signer();
signer.init(true, privateKeyParameters);
signer.update(message, 0, message.length);
byte[] signature = signer.generateSignature();

// Verify
Signer verifier = new Ed25519Signer();
verifier.init(false, publicKeyParameters);
verifier.update(message, 0, message.length);
boolean verified = verifier.verifySignature(signature);

System.out.println("Verification: " + verified); // Verification: true

请注意,您可以直接使用Ed25519PrivateKeyParameters导入原始密钥(即32个字节的密钥)Ed25519PublicKeyParameters因此,另一种解决方案是从OpenSSH格式化的密钥中获取原始密钥并使用这些原始密钥。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在近协议中使用ed25519进行签名和验证

来自分类Dev

重建与充气城堡ED25519键(JAVA)

来自分类Dev

java:使用BouncyCastle验证Ed25519签名无法正常工作

来自分类Dev

使用OpenSSH创建的Ed25519(非ppk)私钥进行WinSCP身份验证-可以吗?

来自分类Dev

OpenSSL对ed25519的支持,是否对内容进行加密?

来自分类Dev

Java:使用Bouncy Castle进行PGP加密

来自分类Dev

JDK 15中的Ed25519,从字节数组中解析公钥并进行验证

来自分类Dev

Java / Kotlin输出Ed25519密钥对作为JCE KeyPair实例并采用OpenSSH格式

来自分类Dev

带有SHA1签名验证的Bouncy Castle DSA

来自分类Dev

带有SHA1签名验证的Bouncy Castle DSA

来自分类Dev

使用OpenSSL进行签名验证

来自分类Dev

使用OpenSSL进行签名验证

来自分类Dev

如何使用ed25519加密/解密数据?

来自分类Dev

限制sshd仅使用ssh-ed25519密钥进行身份验证

来自分类Dev

如何使用PFX(Bouncy Castle或其他)以编程方式对可执行文件进行代码签名

来自分类Dev

GnuPG使用哪些密钥进行签名验证?

来自分类Dev

存在Ed25519的哪些实现?

来自分类Dev

在Debian Wheezy中启用ed25519

来自分类Dev

gen pubkey openssl ed25519

来自分类Dev

ED25519 for Putty 0.67登录失败

来自分类Dev

使用.Net进行RSA签名并使用OpenSSL命令进行验证

来自分类Dev

RSA Java投诉签名和验证

来自分类Dev

使用Java来验证Golang产生的签名

来自分类Dev

Moz API:使用R进行签名的身份验证

来自分类Dev

使用.pem格式的公钥在Xcode中进行签名验证

来自分类Dev

openssl_sign 是否支持 Ed25519 密钥?

来自分类Dev

Jasypt和Bouncy Castle的EncryptionOperationNotPossibleException

来自分类Dev

ECDSA使用Java的公钥和签名在C#中验证签名

来自分类Dev

如何使用Bouncy Castle编辑Java中的密码套件列表

Related 相关文章

  1. 1

    在近协议中使用ed25519进行签名和验证

  2. 2

    重建与充气城堡ED25519键(JAVA)

  3. 3

    java:使用BouncyCastle验证Ed25519签名无法正常工作

  4. 4

    使用OpenSSH创建的Ed25519(非ppk)私钥进行WinSCP身份验证-可以吗?

  5. 5

    OpenSSL对ed25519的支持,是否对内容进行加密?

  6. 6

    Java:使用Bouncy Castle进行PGP加密

  7. 7

    JDK 15中的Ed25519,从字节数组中解析公钥并进行验证

  8. 8

    Java / Kotlin输出Ed25519密钥对作为JCE KeyPair实例并采用OpenSSH格式

  9. 9

    带有SHA1签名验证的Bouncy Castle DSA

  10. 10

    带有SHA1签名验证的Bouncy Castle DSA

  11. 11

    使用OpenSSL进行签名验证

  12. 12

    使用OpenSSL进行签名验证

  13. 13

    如何使用ed25519加密/解密数据?

  14. 14

    限制sshd仅使用ssh-ed25519密钥进行身份验证

  15. 15

    如何使用PFX(Bouncy Castle或其他)以编程方式对可执行文件进行代码签名

  16. 16

    GnuPG使用哪些密钥进行签名验证?

  17. 17

    存在Ed25519的哪些实现?

  18. 18

    在Debian Wheezy中启用ed25519

  19. 19

    gen pubkey openssl ed25519

  20. 20

    ED25519 for Putty 0.67登录失败

  21. 21

    使用.Net进行RSA签名并使用OpenSSL命令进行验证

  22. 22

    RSA Java投诉签名和验证

  23. 23

    使用Java来验证Golang产生的签名

  24. 24

    Moz API:使用R进行签名的身份验证

  25. 25

    使用.pem格式的公钥在Xcode中进行签名验证

  26. 26

    openssl_sign 是否支持 Ed25519 密钥?

  27. 27

    Jasypt和Bouncy Castle的EncryptionOperationNotPossibleException

  28. 28

    ECDSA使用Java的公钥和签名在C#中验证签名

  29. 29

    如何使用Bouncy Castle编辑Java中的密码套件列表

热门标签

归档