如果我想將私鑰和公鑰存儲在一個文件中,最簡單的格式是什麼?特別是如果我打算使用Java的BouncyCastle庫?EC公鑰/私鑰的文件格式?
4
A
回答
3
從理論的角度來看,公鑰可以通過私鑰重新計算(計算成本稍低於生成單個ECDSA簽名的成本,或者執行ECDH的一半,因此速度很快) 。因此,從概念上講,您只需存儲私鑰,其標準格式爲PKCS#8,這是由Java支持的java.security.spec.PKCS8EncodedKeySpec
。此外,PKCS#8格式還包含了可選項,用於在同一個blob中沿着私鑰對公鑰進行編碼,因此這看起來就像您正在尋找的內容。
然而,棘手的事情是說服加密提供者(例如BouncyCastle)提取公共密鑰和/或重新計算它。顯然,如果您從包含公鑰的PKCS#8編碼的EC私鑰創建PKCS8EncodedKeySpec
,則BouncyCastle將足夠內部保留已編碼公鑰的副本,並在您決定重新編碼私鑰時將其寫回來鍵入PKCS#8格式。但是,它沒有別的用處;它把它當作一個不透明的blob處理。
因此,您必須重新計算公鑰。通過JCE和BouncyCastle的API和未實現的位涉水,我發現下面的,這似乎工作(JDK 1.6.0_24,BouncyCastle的1.46):
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Provider;
import java.security.spec.PKCS8EncodedKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.provider.JCEECPrivateKey;
import org.bouncycastle.jce.provider.JCEECPublicKey;
import org.bouncycastle.jce.spec.ECParameterSpec;
import org.bouncycastle.jce.spec.ECPublicKeySpec;
// Create the provider and an appropriate key factory.
Provider pp = new BouncyCastleProvider();
KeyFactory kf = KeyFactory.getInstance("EC", pp);
// Decode the private key (read as a byte[] called 'buf').
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(buf);
PrivateKey sk = kf.generatePrivate(ks);
// Recompute public key.
JCEECPrivateKey priv = (JCEECPrivateKey)sk;
ECParameterSpec params = priv.getParameters();
ECPublicKeySpec pubKS = new ECPublicKeySpec(
params.getG().multiply(priv.getD()), params);
PublicKey pk = kf.generatePublic(pubKS);
// To reencode the private key.
buf = kf.getKeySpec(sk, PKCS8EncodedKeySpec.class).getEncoded();
從概念上講,我應該使用kf.getkeySpec()
與org.bouncycastle.jce.spec.ECPrivateKeySpec
,而不是無情鑄造JCEECPrivateKey
類的私鑰,但乾淨的方法似乎還沒有在BouncyCastle中實現。
0
試試這個(BouncyCastle的v1.47,使用JDK 1.7 *但我以爲JDK 1.6 *將被罰款過。):
// Recreate the private key.
final KeyFactory kf = KeyFactory.getInstance("EC", "BC");
final PKCS8EncodedKeySpec encPrivKeySpec = new PKCS8EncodedKeySpec(rawPrivKey);
final PrivateKey privKey = kf.generatePrivate(encPrivKeySpec);
final byte[] rawPrivKey = privKey.getEncoded();
// Recreate the public key.
final X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(rawPubKey);
final PublicKey pubKey = kf.generatePublic(pubKeySpec);
final byte[] rawPubKey = pubKey.getEncoded();
其中rawPrivKey
和rawPubKey
是字節類型的數組。
我建議你用分組密碼(即AES)加密編碼後的私鑰,否則文件將被盜取,然後你無限期暴露。
相關問題
- 1. 私鑰/公鑰
- 2. 生成EC Diffie-Hellman公鑰和私鑰對
- 3. 使用OpenSSL從文件設置私人和公共EC密鑰
- 4. PyCrypto:解密只用文件中的公鑰(無私鑰+公鑰)
- 5. 公鑰和私鑰文件(.pkr,.skr)
- 6. 與公鑰/私鑰
- 7. 提取從OpenSSL的密鑰文件的公鑰和私鑰
- 8. 格式公鑰
- 9. 創建公鑰和私鑰
- 10. Google recaptcha公鑰和私鑰
- 11. 私鑰長度>公鑰?
- 12. OpenSSL AES_cfb128_encrypt公鑰/私鑰C++
- 13. 公鑰和私鑰混淆
- 14. EC私鑰在C#中的CngKey#
- 15. 從pem格式的私鑰中提取公鑰
- 16. 公鑰和私鑰API密鑰
- 17. C#BouncyCastle EC私鑰導出使用PemWriter
- 18. OpenSSH私鑰的格式
- 19. java中私鑰的公鑰不正確
- 20. 公鑰和私鑰的關係
- 21. 擴展的私鑰和公鑰
- 22. Ruby Net的公鑰/私鑰驗證:: SFTP
- 23. 帶公鑰/私鑰的java-jwt
- 24. 創建公鑰和私鑰的Gem?
- 25. 從ssh中的公鑰生成私鑰
- 26. 基於公鑰/私鑰的許可
- 27. 帶私鑰/公鑰的EPub加密
- 28. Android的Keytool公鑰/私鑰對
- 29. 需要私鑰和公鑰的數量?
- 30. OpenSSL的RSA私鑰和公鑰