gpt4 book ai didi

java - 读取 RSA OpenSSH 格式的 KeyPair 的公钥?

转载 作者:行者123 更新时间:2023-11-30 03:49:04 25 4
gpt4 key购买 nike

我通过执行以下操作在 Java 中创建了一个 KeyPair:

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024, new SecureRandom());
KeyPair keyPair = keyPairGenerator.generateKeyPair();

如何从 keyPair 获取以 “-----BEGIN” 开头的 RSA OpenSSH 格式的 publicKey

最佳答案

这是一个我尚未测试过的快速技巧。这需要 Java 6 或更高版本。有关详细信息,请参阅以下 RFC:

RFC 4716
RFC 4253
RFC 4251

import java.io.*;
import java.math.BigInteger;
import java.nio.*;
import java.nio.charset.Charset;
import java.security.*;
import java.security.interfaces.RSAPublicKey;

import javax.xml.bind.DatatypeConverter;

public class SecshPublicKey {

/*
* Taken from RFC 4716, with reference to RFCs 4253 and 4251.
*/
public static void main(String[] args) throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024, new SecureRandom());
KeyPair keyPair = keyPairGenerator.generateKeyPair();

ByteArrayOutputStream binaryOS = new ByteArrayOutputStream();
writeSshString(binaryOS, "ssh-rsa");
RSAPublicKey rsaPub = (RSAPublicKey)keyPair.getPublic();
writeSshMPInt(binaryOS, rsaPub.getPublicExponent());
writeSshMPInt(binaryOS, rsaPub.getModulus());

// Now base64-encode the result.

String b64Encoded = sshBase64Encode(binaryOS.toByteArray());

// Now write out the result

System.out.println("---- BEGIN SSH2 PUBLIC KEY ----");
System.out.println(b64Encoded);
System.out.println("---- END SSH2 PUBLIC KEY ----");
}

private static String sshBase64Encode(byte[] byteArray) {
String b64_prelim = DatatypeConverter.printBase64Binary(byteArray);

// Break into lines of at most 72 characters.

StringBuilder b64_final = new StringBuilder(b64_prelim.length() * 2);

while (b64_prelim.length() > 72) {
b64_final.append(b64_prelim.substring(0, 72));
b64_final.append("\n");
b64_prelim = b64_prelim.substring(72);
}
b64_final.append(b64_prelim);
return b64_final.toString();
}

private static void writeSshMPInt(OutputStream os, BigInteger mpint) throws IOException {
ByteBuffer lengthBuf = ByteBuffer.allocate(4);
lengthBuf.order(ByteOrder.BIG_ENDIAN);
byte [] x;
if (mpint.equals(BigInteger.ZERO)) {
x = new byte[0];
} else {
x = mpint.toByteArray();
}
lengthBuf.putInt(x.length);
os.write(lengthBuf.array());
os.write(x);
}

private static void writeSshString(OutputStream os, String s) throws IOException {
ByteBuffer lengthBuf = ByteBuffer.allocate(4);
lengthBuf.order(ByteOrder.BIG_ENDIAN);
byte [] encoded = s.getBytes(Charset.forName("UTF-8"));
lengthBuf.putInt(encoded.length);
os.write(lengthBuf.array());
os.write(encoded);
}

}

关于java - 读取 RSA OpenSSH 格式的 KeyPair 的公钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24876762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com