簡體   English   中英

使用帶有 Bouncy Castle (Java) 的 ED25519 密鑰對 Json 進行簽名/驗證

[英]Sign/Verify Json using ED25519 keys with Bouncy Castle (Java)

我使用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加載並使用OpenSSHPrivateKeyUtil.parsePrivateKeyBlob()導入Ed25519PrivateKeyParameters實例。 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

請注意,您可以直接使用Ed25519PrivateKeyParametersEd25519PublicKeyParameters導入原始密鑰,即 32 字節密鑰。 因此,另一種解決方案是從 OpenSSH 格式的密鑰中獲取原始密鑰並使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM