Зашифруйте закрытый ключ с помощью кода Java
У меня есть личный ключ с кодом Java и сохранить его так:
KeyPair keys;
try {
keys = KeyTools.genKeys("2048", AlgorithmConstants.KEYALGORITHM_RSA);
//SAVE PRIVKEY
//PrivateKey privKey = keys.getPrivate();
//byte[] privateKeyBytes = privKey.getEncoded();
PKCS10CertificationRequest pkcs10 = new PKCS10CertificationRequest("SHA256WithRSA",
CertTools.stringToBcX509Name("CN=NOUSED"), keys.getPublic(), null, keys.getPrivate());
//Save Privatekey
String privateKeyFilename = "C:/Users/l.calicchio/Downloads/privateKey.key";
String password="prismaPrivateKey";
byte[] start="-----BEGIN PRIVATE KEY-----\n".getBytes();
byte[] end="\n-----END PRIVATE KEY-----".getBytes();
byte[] privateKeyBytes = keys.getPrivate().getEncoded();
byte[] encryptedPrivateKeyBytes = passwordEncrypt(password.toCharArray(), privateKeyBytes);
File f=new File(privateKeyFilename);
if (f.exists()){
f.delete();
}
FileOutputStream fos = new FileOutputStream(f,true);
fos.write(start);
fos.write(Base64.encode(encryptedPrivateKeyBytes));
fos.write(end);
fos.close();
Теперь я хочу добавить пароль к закрытому ключу. поэтому я нашел этот код:
private static byte[] passwordEncrypt(char[] password, byte[] plaintext) throws Exception {
String MYPBEALG = "PBEWithSHA1AndDESede";
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);
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(plaintext);
// 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!
return encinfo.getEncoded();
но когда я использую эту команду openssl openssl asn1parse -in privateKey.key, у меня нет ошибки, но когда я пытаюсь это сделать: openssl rsa -noout -modulus -in privatekey.it у меня возникает ошибка:
невозможно загрузить закрытый ключ 9964: ошибка:0D0680A8: подпрограммы кодирования asn1:ASN1_CHECK_TLEN: неправильный тег:.\crypto\as n1\tasn_dec.c:1319: 9964: ошибка:0D06C03A: подпрограммы кодирования asn1:ASN1_D2I_EX_PRIMITIVE:nesr или n1.\crypto\asn1\tasn_dec.c:831: 9964: ошибка:0D08303A: подпрограммы кодирования asn1:ASN1_TEMPLATE_NOEXP_D2I: вложенная ошибка asn1:.\crypto\asn1\tasn_dec.c:751: поле = версия_ININ_K_6464: CR = PKS ошибка:0907B00D: процедуры PEM:PEM_READ_BIO_PRIVATEKEY:ASN1 lib:.\crypto\pem\p em_pkey.c:132:
Я думаю, что в закрытом ключе отсутствует следующая строка: Proc-Type: 4,ENCRYPTED "DEK-Info: " + "AES-256-CBC"...... но как мне добавить это (где я получаю эту информацию?)? Тпх
1 ответ
Пожалуйста, прочитайте инструкцию, man rsa
дает следующие детали:
Обратите внимание, что эта команда использует традиционный формат, совместимый с SSLeay, для шифрования закрытым ключом: более новые приложения должны использовать более безопасный формат PKCS#8 с помощью утилиты pkcs8.