Android Cipher问题。 InvalidKeyException异常?

时间:2010-02-15 04:27:31

标签: java android encryption

我正在尝试为Android创建一个使用加密来保存用户信息的应用程序,我无法弄清楚我做错了什么。我正在尝试创建AES密码的实例,但应用程序继续抛出“InvalidKeyExceptions”。请考虑以下代码:

public static final byte[] IV = new byte[]
{ 0x04, 0x08, 0x15, 0x16, 0x23, 0x42, 0x00, 0x00, 0x00, 0x00,0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
protected final IvParameterSpec params = new IvParameterSpec(IV);
protected Cipher myCipher;

public AESEncryptor(String passwd, InputStream source, String destinationFile)
{
    try
    {           
        myCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        Log.d("System.out.println", "Block Size: "+myCipher.getBlockSize());
        myCipher.init(Cipher.ENCRYPT_MODE, AESEncryptor.generateSecretKeyFromPassword(passwd),params);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

我得到了这个例外:

  

java.security.InvalidKeyException:   初始化向量必须相同   长度为块大小..

myCipher.init(...)行会触发此异常。

我理解它的含义但是根据myCipher.getBlockSize(),IV字节数组应该保存16个字节,但确实如此,但它不起作用。我还尝试了长度为0-128的字节数组,并且该范围内的任何内容都不起作用。

哦,如果我采用这个代码,不加改变,并将其添加到常规Java应用程序,我没有错误。为Android编译似乎导致了这个错误。

请帮忙。 谢谢, 莱恩

1 个答案:

答案 0 :(得分:1)

您是否尝试在模式参数中明确指定块大小?

例如:

Cipher.getInstance("AES/CBC16/PKCS5Padding");

我注意到here,如果你没有指定块大小,那么它是依赖于提供者的。