2011-02-26 22 views
10

Ben şifre ile şifrelenmiş bir privatekey PKCS8 biçimini oluşturmak istiyorum, ve bu kodla deneyin:Parola ile şifrelenmiş bir Privatekey ile RSA keyPair nasıl oluşturulur?

String password = "123456"; 
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA"); 
gen.initialize(2048); 
KeyPair key = gen.generateKeyPair(); 
PrivateKey privateKey = key.getPrivate(); 
PublicKey publicKey = key.getPublic(); 

FileOutputStream pvt = new FileOutputStream("d:\\pvt123456.der"); 
try { 
    pvt.write(privateKey.getEncoded()); 
    pvt.flush(); 
} finally { 
    pvt.close(); 
} 
FileOutputStream pub = new FileOutputStream("d:\\pub123456.der"); 
try { 
    pub.write(publicKey.getEncoded()); 
    pub.flush(); 
} finally { 
    pub.close(); 
} 

Ama Openssl biçimi ile uyumlu olacak şekilde 3DES ile bir şifre şifrelemek bilmem.

cevap

28

Biliyorum biraz geç oldu ama ben de bunu yapmanın bir yolunu arıyordum ve aradığım sırada soruyu buldum, şimdi bunu yapmanın bir yolunu buldum geri gelip paylaşmaya karar verdim Bu:

// generate key pair 

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); 
keyPairGenerator.initialize(1024); 
KeyPair keyPair = keyPairGenerator.genKeyPair(); 

// extract the encoded private key, this is an unencrypted PKCS#8 private key 
byte[] encodedprivkey = keyPair.getPrivate().getEncoded(); 

// We must use a PasswordBasedEncryption algorithm in order to encrypt the private key, you may use any common algorithm supported by openssl, you can check them in the openssl documentation http://www.openssl.org/docs/apps/pkcs8.html 
String MYPBEALG = "PBEWithSHA1AndDESede"; 
String password = "pleaseChangeit!"; 

int count = 20;// hash iteration count 
SecureRandom random = new SecureRandom(); 
byte[] salt = new byte[8]; 
random.nextBytes(salt); 

// Create PBE parameter set 
PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, count); 
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray()); 
SecretKeyFactory keyFac = SecretKeyFactory.getInstance(MYPBEALG); 
SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec); 

Cipher pbeCipher = Cipher.getInstance(MYPBEALG); 

// Initialize PBE Cipher with key and parameters 
pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec); 

// Encrypt the encoded Private Key with the PBE key 
byte[] ciphertext = pbeCipher.doFinal(encodedprivkey); 

// Now construct PKCS #8 EncryptedPrivateKeyInfo object 
AlgorithmParameters algparms = AlgorithmParameters.getInstance(MYPBEALG); 
algparms.init(pbeParamSpec); 
EncryptedPrivateKeyInfo encinfo = new EncryptedPrivateKeyInfo(algparms, ciphertext); 

// and here we have it! a DER encoded PKCS#8 encrypted key! 
byte[] encryptedPkcs8 = encinfo.getEncoded(); 

Bu örnek kod buldum folowing koduna dayanmaktadır: http://www.jensign.com/JavaScience/PEM/EncPrivKeyInfo/EncPrivKeyInfo.java

ama folowing kaynak da biraz daha iyi anlamama yardım: http://java.sun.com/j2se/1.4.2/docs/guide/security/jce/JCERefGuide.html

+7

'rastgele rastgele = new Random(); 'SecureRandom r olmalıdır andom = new SecureRandom(); ' – Carsten

+0

Öneriniz için teşekkürler Carsten! – Hrzio

+1

JDK 8'den itibaren, bu belgenin Oracle tarafından önerilen şekilde güçlü bir uygulama kullandığınızdan emin olmak için 'SecureRandom random = SecureRandom.getInstanceStrong();' kullanılmalıdır: https://docs.oracle.com/javase/tutorial /security/apisign/step2.html – CrashproofCode

İlgili konular