我有一个由这个函数生成的publicKey/privateKey对:
public static void generateKey() {
try {
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM);
keyGen.initialize(2048);
final KeyPair key = keyGen.generateKeyPair();
File privateKeyFile = new File(PRIVATE_KEY_FILE);
File publicKeyFile = new File(PUBLIC_KEY_FILE);
// Create files to store public and private key
if (privateKeyFile.getParentFile() != null) {
privateKeyFile.getParentFile().mkdirs();
}
privateKeyFile.createNewFile();
if (publicKeyFile.getParentFile() != null) {
publicKeyFile.getParentFile().mkdirs();
}
publicKeyFile.createNewFile();
// Saving the Public key in a file
ObjectOutputStream publicKeyOS = new ObjectOutputStream(
new FileOutputStream(publicKeyFile));
publicKeyOS.writeObject(key.getPublic());
publicKeyOS.close();
// Saving the Private key in a file
ObjectOutputStream privateKeyOS = new ObjectOutputStream(
new FileOutputStream(privateKeyFile));
privateKeyOS.writeObject(key.getPrivate());
privateKeyOS.close();
} catch (Exception e) {
e.printStackTrace();
}
}
现在我想在写的时候把publicKey转换成base64
,然后使用base64解码来获取publicKey,怎么做呢?
1条答案
按热度按时间g52tjvyc1#
一般来说,如果你想用base64存储一个文件,你可以简单地对字节数组进行编码。您甚至可以在
ObjectOutputStream
和FileOutputStream
之间放置一个Base64流(由Java 8中的Base64类提供)。然而,公钥和私钥都有默认的编码,可以使用它们的
getEncoded
方法访问:这将公钥保存为
SubjectPublicKeyInfo
,可以被多种类型的软件和加密库读取和写入。例如,您可以将其粘贴到在线ASN.1解码器中(在线解码器本身会将其转换为十六进制,但它也会解析base 64)。字节的格式是所谓的ASN.1 / DER(这是一种通用格式,就像您可以在XML中编码多种类型的文件一样)。
如果你想拥有OpenSSL兼容格式的密钥(带有“PUBLIC KEY”页眉和页脚),你可以使用一个库,比如Bouncy Castle(例如:
org.bouncycastle.openssl.jcajce.JcaPEMWriter
)。