2012-01-10 63 views
1

这里是我的加密设置:解密时为什么会出现'BadPaddingException'?

public static String encryptionAlgorithm = "AES"; 
public static short encryptionBitCount = 256; 
public static int encryptionMessageLength = 176; 
public static String hashingAlgorithm = "PBEWITHSHAAND128BITAES-CBC-BC"; 
     //PBEWithSHA256And256BitAES-CBC-BC"PBEWithMD5AndDES";//"PBKDF2WithHmacSHA1"; 
public static short hashingCount = 512; 
public static String cipherTransformation = "AES/CBC/PKCS5Padding"; 

这里是我的代码解密:

public byte[] readMessage() throws Exception 
{ 
    byte[] iv = new byte[16]; 
    byte[] message = new byte[EncryptionSettings.encryptionMessageLength]; 

    try 
    { 
     // read IV from stream 
     if (stream.read(iv) != 16) 
      throw new Exception("Problem receiving full IV from stream"); 
    } 
    catch (final IOException e) 
    { 
     throw new Exception("Unable to read IV from stream"); 
    } 

    try 
    { 
     cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv)); 
    } 
    catch (final InvalidKeyException e) 
    { 
     throw new Exception("Invalid key"); 
    } 
    catch (final InvalidAlgorithmParameterException e) 
    { 
     throw new Exception("Invalid algorithm parameter"); 
    } 

    try 
    { 
     //read message from stream 
     if (stream.read(message) != EncryptionSettings.encryptionMessageLength) 
      throw new Exception("Problem receiving full encrypted message from stream"); 
    } 
    catch (final IOException e) 
    { 
     throw new Exception("Unable to read message from stream"); 
    } 

    try 
    { 
     return cipher.doFinal(message); //decipher message and return it. 
    } 
    catch (IllegalBlockSizeException e) 
    { 
     throw new Exception("Unable to decrypt message due to illegal block size - " 
          + e.getMessage()); 
    } 
    catch (BadPaddingException e) 
    { 
     throw new Exception("Unable to decrypt message due to bad padding - " 
          + e.getMessage()); 
    } 
} 

这里是我的代码进行加密:

public void writeMessage (final byte[] message) throws Exception 
{ 
    try 
    { 
     // write iv 
     byte b[] = cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV(); 
     System.out.println(b.length); 
     stream.write(b); 
    } 
    catch (final InvalidParameterSpecException e) 
    { 
     throw new Exception("Unable to write IV to stream due to invalid"+ 
          " parameter specification"); 
    } 
    catch (final IOException e) 
    { 
     throw new Exception("Unable to write IV to stream"); 
    } 

    try 
    { 
     // write cipher text 
     byte b[] = cipher.doFinal(message); 
     System.out.println(b.length); 
     stream.write(b); 
    } 
    catch (final IllegalBlockSizeException e) 
    { 
     throw new Exception("Unable to write cipher text to stream due to "+ 
          "illegal block size"); 
    } 
    catch (final BadPaddingException e) 
    { 
     throw new Exception("Unable to write cipher text to stream due to " + 
          "bad padding"); 
    } 
    catch (final IOException e) 
    { 
     throw new Exception("Unable to write cipher text to stream"); 
    } 
} 

错误:Unable to decrypt message due to bad padding - null.

解密时遇到BadPaddingException克,为什么?该消息是完全168字符,这是176填充(被16整除)

+1

另外,你的异常处理并不是真正的“处理”......你只是将堆栈跟踪的一部分扔掉,以交换一个不太容易描述的异常类型和稍微更具描述性的消息。 – 2012-01-10 21:03:22

+0

我应该指出,我只挑选了关键方法,并且正确地打开/关闭了所有东西。密钥不能与服务器和客户端内置的不同(现在 - 显然这会改变)。 – Cheetah 2012-01-10 23:18:41

+0

我们的信息太少,无法编译,因为我们没有代码,例如为溪流。说一切都没问题,但我的意思是,你的代码不会运行。所以它*不正确。 – 2012-01-12 01:21:13

回答

4

从我的最初的注释后:

一个典型的方案是其中的关键是从在另一侧所使用的不同。这是最可能的原因,但您可能还想检查处理流的方式,因为您确实缺少.close()和可能的.flush()语句。您还假设您始终可以将所有数据读入缓冲区,但情况可能并非如此。

关键确实计算不正确。在enryption /解密