2016-03-29 3 views
0

У меня есть приложение для Android, которое шифрует текст с помощью ключа RSA 2048 бит.RSA-шифрование Android и дешифрование в Java: javax.crypto.BadPaddingException: ошибка дешифрования

Шифрование и дешифрование отлично работают в приложении.

Моя проблема заключается в том, что я пытаюсь зашифровать приложение, а затем отправлять шифр во внешнюю программу Java для дешифрования.

Вот как это делается:

public static PrivateKey getPrivateKey(String key) { 
    try { 
     /* Add PKCS#8 formatting */ 
     byte[] byteKey = Base64.getDecoder().decode(key.getBytes()); 
     ASN1EncodableVector v = new ASN1EncodableVector(); 
     v.add(new ASN1Integer(0)); 
     ASN1EncodableVector v2 = new ASN1EncodableVector(); 
     v2.add(new ASN1ObjectIdentifier(PKCSObjectIdentifiers.rsaEncryption.getId())); 
     v2.add(DERNull.INSTANCE); 
     v.add(new DERSequence(v2)); 
     v.add(new DEROctetString(byteKey)); 
     ASN1Sequence seq = new DERSequence(v); 
     byte[] privKey = seq.getEncoded("DER"); 

     PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privKey); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     return kf.generatePrivate(keySpec); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

public static String decrypt(String cipherString,PrivateKey privateKey){ 
    try{ 
     Cipher cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.DECRYPT_MODE, privateKey); 
     byte[] plainByte = cipher.doFinal(Base64.getDecoder().decode(cipherString)); 
     return Base64.getEncoder().encodeToString(plainByte); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

Но когда я пытаюсь дешифрования шифра я получаю сообщение об ошибке:

javax.crypto.BadPaddingException: Decryption error 
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380) 
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291) 
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363) 
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2165) 
    at RSA.decrypt(RSA.java:94) 
    at RSA.main(RSA.java:116) 

Что мне не хватает?

UPDATE я регенерировать новую пару ключей в самой Java и избавилась от части:

/* Add PKCS#8 formatting */ 
byte[] byteKey = Base64.getDecoder().decode(key.getBytes()); 
ASN1EncodableVector v = new ASN1EncodableVector(); 
v.add(new ASN1Integer(0)); 
ASN1EncodableVector v2 = new ASN1EncodableVector(); 
v2.add(new ASN1ObjectIdentifier(PKCSObjectIdentifiers.rsaEncryption.getId())); 
v2.add(DERNull.INSTANCE); 
v.add(new DERSequence(v2)); 
v.add(new DEROctetString(byteKey)); 
ASN1Sequence seq = new DERSequence(v); 
byte[] privKey = seq.getEncoded("DER"); 

, но я застрял с той же ошибкой!

+0

Я вижу код дешифрования, но не шифрует код. –

ответ

1

Ваше дополнение не установлено или не установлено неправильно.

Попробуйте изменить Cipher cipher = Cipher.getInstance("RSA"); к Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

Если это не работает, вы можете увидеть here для других режимов заполнения.

Смежные вопросы