Android异常java.io.IOException:最后一个块不完整

时间:2015-01-31 07:01:55

标签: java android encryption aes

我正在使用Rijndael加密方法解密用C#加密的二进制文件。该文件被复制到Android设备。在基于Java的桌面测试程序中运行时,解密逻辑工作正常。但是当它在android中运行时抛出java.io.IOException: last block incomplete。我正在使用下面的代码。

public static void Decrypt(String fileIn, String fileOut, byte[] key, byte[] IV, long offset)  
{
// First we are going to open the file streams 
FileInputStream fsIn;
try 
{
    fsIn = new FileInputStream(fileIn);,,
    FileOutputStream fsOut = new FileOutputStream(fileOut);

    // create cipher object
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(IV));

    // create the encryption stream
    CipherInputStream cis = new CipherInputStream(fsIn, cipher);

    // set a buffer and keep writing to the stream
    int bufferLen = KiloByte;
    byte[] buffer = new byte[bufferLen];
    int bytesRead = 0;

    // read a chunk of data from the input file
    while ( (bytesRead = cis.read(buffer, 0, bufferLen)) != -1)
    {
        // write to file  
        fsOut.write(buffer, 0, bytesRead);
    } 

    fsOut.flush();
    // close streams 
    fsOut.close();
    cis.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
} catch (NoSuchPaddingException e) {
    e.printStackTrace();
} catch (InvalidKeyException e) {
    e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
}

使用函数

生成密钥
public static byte[] GetKey(String password, byte[] IV, int length)
        throws NoSuchAlgorithmException, InvalidKeySpecException
{
    // Length is kept 16 to make it compatible with all platforms
    SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    KeySpec ks = new PBEKeySpec(password.toCharArray(), IV, 1000, length*8);
    SecretKey s = f.generateSecret(ks);
    Key k = new SecretKeySpec(s.getEncoded(),"AES");

    return k.getEncoded();
}

我在互联网上经历了很多与该主题相关的帖子。基于此,我确保使用字节数组而不是字符串。但仍然遇到这个问题。

0 个答案:

没有答案