2016-08-30 3 views
0

Я новый java для шифрования. Пытаясь реализовать что-то легкое, чтобы зашифровать строку и сохранить ее где-то, и отменить ее перед использованием.BadPaddingException при расшифровке в java

С помощью некоторого веб-поиска я придумал это для шифрования и дешифрования.

public static String base64Encode(byte[] bytes) 
    { 
     return new BASE64Encoder().encode(bytes); 
    } 

    public static byte[] base64Decode(String property) throws IOException 
    { 
     return new BASE64Decoder().decodeBuffer(property); 
    } 


    public static String encrypt(String mystring) throws GeneralSecurityException, UnsupportedEncodingException 
     { 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey key = keyFactory.generateSecret(new PBEKeySpec(mystring.toCharArray())); 
     Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); 
     return base64Encode(pbeCipher.doFinal(mystring.getBytes("UTF-8"))); 
     } 

    public static String decrypt(String estring) throws GeneralSecurityException, IOException 
     { 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey key = keyFactory.generateSecret(new PBEKeySpec(estring.toCharArray())); 
     Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); 
     return new String(pbeCipher.doFinal(base64Decode(estring)), "UTF-8"); 
     } 

Я вижу, что шифрование работало, но я видел исключение связанной накладки в части расшифровки, из блока doFinal. Здесь это ...

encrypted string:zdrtgOKfkZMgpCOflr1ILQ== -> Encrypted String 
exceptionjavax.crypto.BadPaddingException: Given 
final block not properly padded -> Exception from the doFinal block. 

Похоже, что когда я зашифровал его, мне нужно сделать что-то вроде заполнения.

Может ли кто-нибудь сказать мне, что пошло не так, и как это можно исправить?

Благодаря

Тас

ответ

0

Вам нужно будет первым декодировать ввод методы расшифровки.

Вызвать метод base64Decode и параметр estring в вашем методе decrypt.

Это должно быть сделано.

1

Здесь вы используете шифрование на основе пароля. Это означает, что сам ключ шифрования основан на пароле. Вы должны использовать один и тот же пароль для шифрования и дешифрования.

private static char[] ENCRYPTION_PASSWORD 
    = "some password populated by configuration".toCharArray(); 

public static String encrypt(String mystring) 
    throws GeneralSecurityException, UnsupportedEncodingException { 
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
    SecretKey key = keyFactory.generateSecret(new PBEKeySpec(ENCRYPTION_PASSWORD)); 
    Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
    pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); 
    return DatatypeConverter 
     .printBase64Binary(pbeCipher.doFinal(mystring.getBytes("UTF-8"))); 
} 

public static String decrypt(String string) 
    throws GeneralSecurityException, IOException { 
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
    SecretKey key = keyFactory.generateSecret(new PBEKeySpec(ENCRYPTION_PASSWORD)); 
    Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
    pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); 
    return new String(pbeCipher.doFinal(DatatypeConverter 
              .parseBase64Binary(estring)), "UTF-8"); 
} 

Также обратите внимание на использование javax.xml.bind.DatatypeConverter для операций base64. Не нужно писать свои собственные или использовать третьи стороны в наши дни.

+0

Это работает - спасибо за вашу помощь. – Tas

0

Изменить код,

SecretKey key = keyFactory.generateSecret(new PBEKeySpec(mystring.toCharArray())); 

в

SecretKey key = keyFactory.generateSecret(new PBEKeySpec("PASSWORD".toCharArray(), SALT, 20)); 
Смежные вопросы