java - JSch:从私钥文件创建公钥

标签 java jsch private-key public-key

我喜欢通过 QR 码(最佳安全实践除外)传输私钥,该私钥是作为 KeyPair 的一部分创建的,并且需要在之后恢复 KeyPair。因此

JSch jsch = new JSch();
KeyPair keypair = KeyPair.genKeyPair(jsch, KeyPair.RSA, 4096);

ByteArrayOutputStream prvstream = new ByteArrayOutputStream();
keypair.writePrivateKey(prvstream);
prvstream.close();

ByteArrayOutputStream pubstream = new ByteArrayOutputStream();
keypair.writePublicKey(pubstream, null /* key comment */);
pubstream.close();

byte[] prv_data = prvstream.toByteArray();
byte[] pub_data = pubstream.toByteArray();

// prv_data is transferred via QR-Code here

KeyPair keypair2 = KeyPair.load(jsch, prv_data, null);

ByteArrayOutputStream prvstream2 = new ByteArrayOutputStream();
keypair2.writePrivateKey(prvstream2);
prvstream2.close();

ByteArrayOutputStream pubstream2 = new ByteArrayOutputStream();
keypair2.writePublicKey(pubstream2, null /* key comment */));
pubstream2.close();

byte[] prv_data2 = prvstream2.toByteArray();
byte[] pub_data2 = pubstream2.toByteArray();

if (pub_data.equals(pub_data2) {
    // success
} else {
    // we hit failure here every time.
}

最佳答案

pub_data.equals(pub_data2) 不符合您的想法。它比较引用,而不是数组内容。您想要使用Arrays.equals(pub_data, pub_data2)

参见equals vs Arrays.equals in Java .

<小时/>

顺便说一句,从技术上讲,您无法从私钥创建公钥。但由于 KeyPair.writePrivateKey 实际上写入了整个 key 对,而不仅仅是私钥,它自然也包含公钥。

关于java - JSch:从私钥文件创建公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57058149/

相关文章:

java - Firebase (Android) - 将过滤后的数据加载到自定义 ArrayList 中

java - 在 spring-data 中为 MongoDB 配置 GridFS 模板

java - 在 Android 应用程序的 Java JSch 中从字符串或资源加载私钥

putty - JSch 如何与 PuTTY 私钥一起使用

ssl - 这个 SSL 场景是否有效?

powershell - 如何使用powershell向用户授予证书私钥的权限?

java - 根据字符串值修剪java字符串?

java - 调用音频播放功能时,Java事件被杀死

java - 如果没有私钥,jsch 身份验证失败

c++ - 给定曲线和私有(private)指数创建 ECDSA 私钥?