2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
請(qǐng)注意,關(guān)于getFormat Javadoc,這是 ASN.1 標(biāo)準(zhǔn)格式:
返回此鍵的主要編碼格式的名稱,如果此鍵不支持編碼,則返回 null。如果此密鑰的 ASN.1 規(guī)范存在,則主要編碼格式根據(jù)適當(dāng)?shù)?ASN.1 數(shù)據(jù)格式命名。例如,公鑰的ASN.1數(shù)據(jù)格式的名稱是SubjectPublicKeyInfo,由X.509標(biāo)準(zhǔn)定義;在這種情況下,返回的格式是“X.509”。同樣,私鑰的 ASN.1 數(shù)據(jù)格式的名稱是 PrivateKeyInfo,由 PKCS #8 標(biāo)準(zhǔn)定義;在這種情況下,返回的格式是“PKCS#8”。
但是,如果我們出于某種原因需要更改它,我們可以使用 Bouncy Castle:例如:
//Convert to PKCS#1
PrivateKeyInfo pkInfo = PrivateKeyInfo.getInstance(kg.getPrivateKey().getEncoded());
ASN1Encodable encodable = pkInfo.parsePrivateKey();
ASN1Primitive primitive = encodable.toASN1Primitive();
byte[] privateKeyPKCS1 = primitive.getEncoded();
//kg.writeToFile(PRIVATE_KEY_PATH, privateKeyPKCS1);
//Convert to PEM
PemObject pemObject = new PemObject("RSA PRIVATE KEY", privateKeyPKCS1);
StringWriter stringWriter = new StringWriter();
PemWriter pemWriter = new PemWriter(stringWriter);
pemWriter.writeObject(pemObject);
pemWriter.close();
String pemString = stringWriter.toString();
kg.writeToFile(PRIVATE_KEY_PATH, pemString.getBytes());
我們會(huì)得到一個(gè)這樣的文件:
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAr76DpCYkQKMCKRyjx9wyVKihU4vSBeTq7VpkJx9g616AUTtI
yzMZyHa2vVucgkZL9VFS+ZwJZk7b6pNUUSwnwKxHFnRndid2Hum1ZZZCzRYwhsKq
. . .
XIA+HTgaXbEsCyDcX7EWVlpnTzq5ASO2llKT8V0Mswyh2fznbm5nH92fUKUku2nL
VAQC2f8PL2eLec3wmb0ZWBazadakMC1fVH3umiBmFnkyDoEfojdOgSo=
-----END RSA PRIVATE KEY-----
我使用了這個(gè) BouncyCastle 版本:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.60</version>
</dependency>
這個(gè)問(wèn)題討論了同樣的問(wèn)題,但對(duì)于公鑰編碼:Generating RSA keys in PKCS#1 format in Java
感謝@dave_thompson_085 的評(píng)論,我意識(shí)到使用JcaMiscPEMGenerator類的另一種方法
JcaMiscPEMGenerator generator = new JcaMiscPEMGenerator(kg.getPrivateKey());
stringWriter = new StringWriter();
pemWriter = new PemWriter(stringWriter);
pemWriter.writeObject(generator.generate());
pemWriter.close();
pemString = stringWriter.toString();
kg.writeToFile(PRIVATE_KEY_PATH, pemString.getBytes());
要使用它,我們需要添加以下依賴項(xiàng):
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.60</version>
</dependency>

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
現(xiàn)在我已經(jīng)花了幾個(gè)小時(shí),我覺(jué)得很愚蠢..我會(huì)把答案放在這里。
所以問(wèn)題是我想將其存儲(chǔ)為字符串(在文本文件中存儲(chǔ)二進(jìn)制文件的內(nèi)容 - 就像上圖所示的那個(gè))
如果您使用的是基于 Unix 的系統(tǒng),您可以通過(guò)以下方式輕松獲得:
base64 filename.key > string.txt
現(xiàn)在,如果您想恢復(fù)二進(jìn)制文件,就像:
base64 -D string.txt > filename-clone.key
所以這不是java相關(guān)的問(wèn)題
添加回答
舉報(bào)