Как конвертировать Java OpenSSLRSAPrivateCrtKey в формат PKCS1 - PullRequest
0 голосов
/ 06 декабря 2018

CipherText

i5SvmG2TbtZfkWdwJ5qeaYzvLlQknY3uMvZxSEwhBdRcXKHjgzrRk6XLDCEG9ZtZDGDA7iB3tFhLPMisfqGZvSSrcBfiV8b71+qzWVDNW9EedVShk6kaeEN6rw4UgVi6P5PvrDMn6pmYmLWCjtuFWrmboCvvYgI+FJurhlbsQESkA5oDYirjS8L0wnsQB/TnnQ5UPY2xfOBdY2MJpUSTyIjJPhI40GST8YWjXEMkJeDV/1zuKuK55RHCDF5AdTMEvgvvRnGhN2Fzh+rsDziHqVS9d8FmrtjdU445F6ki0d8DkaeFfrofptxGIncqfuukKSXpSp4cPLvM3LxtRvp+Aw==

Код для расшифровки

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
            kpg.initialize(2048);
KeyPair kp2 = kpg.generateKeyPair();
            generatedPub = kp2.getPublic();
            generatedPvt = kp2.getPrivate();

public String rsaDecrypt(String encrypted) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, generatedPvt);
            byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted.getBytes()));
            return new String(original);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

Ошибка

javax.crypto.BadPaddingException: ошибка: 04000089: процедуры RSA: OPENSSL_internal: PKCS_DECODING_ERROR

Также, если я пытаюсь напечатать закрытый ключ как:

generatedPvt.toString()

, я получаюследующее:

OpenSSLRSAPrivateCrtKey{modulus=c7544bf521bbdd7db52dd28bd3c6f694214dc2356b905edd2730b631d11be9aea703692c2db690e6725da65737b5ec511c13668d1735bfbbc2519e0d33a67b41b289bae6ea71903af91e4f12c6e8660614ef12cd439293a0a38f564fd8f19a3e38f9e2defa269d0bcf0f53159bba1b4fd539ad934fb691e860113be53901de5a10d0c0e3ceaec3715841bc6e56b7738336e8df95a989b61175b06d70d349dcb4a031acf5b25647a1d77f6e6e11efc66e98bb321430f148a63c103a0a59e94b147a4fb49a9ecb0b23603a6ceed6e6e298650667cd61de71455bd4f95767444d89bcf485cc47a297b5306a60a14f77a3fbc19552c5fddfa5cfa2e68020e245ad91,publicExponent=10001}

Пока я ожидал, что будет отформатирован ключ формата PKCS # 8.Как получить ключ, напечатанный в формате PKCS # 8?

И почему я получаю ошибку заполнения, как показано выше?

1 Ответ

0 голосов
/ 06 декабря 2018
byte[] original = cipher.doFinal(encrypted.getBytes());

удалить Base64.decodeBase64 из методов шифрования и дешифрования

, если вы хотите преобразовать ключ в строку, используйте

String keyString= Base64.encodeBase64String(key.getEncoded());

Реализация RSA

 public static void main(String[] args) {
    try {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(2048);
        KeyPair kp2 = kpg.generateKeyPair();
        PublicKey publicKey = kp2.getPublic();
        PrivateKey privateKey = kp2.getPrivate();
        NewClass nc = new NewClass();
        byte[] encrypt=nc.rsaEncrypt("hi",publicKey);
        byte[] decrypt=nc.rsaDecrypt(encrypt,privateKey);
        String decryptString = new String(decrypt);
        System.out.println("decryptString = " + decryptString);
    } catch (NoSuchAlgorithmException ex) {
        Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
    }

}

public byte[] rsaDecrypt(byte[] encrypted,PrivateKey privateKey) {
    try {

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] original = cipher.doFinal(encrypted);
        return original;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

public byte[] rsaEncrypt(String message,PublicKey publicKey) {
    try {

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] original = cipher.doFinal(message.getBytes());
        return original;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

Когда кодирование и декодирование выполняются вместе с шифрованием и дешифрованием, порядок должен быть

Шифрование

cipher.doFinal(Base64.encodeBase64(message.getBytes()));

Расшифровка

Base64.decodeBase64(cipher.doFinal(cipher.getBytes()));
...