我正在尝试为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编译似乎导致了这个错误。
请帮忙。 谢谢, 莱恩
答案 0 :(得分:1)
您是否尝试在模式参数中明确指定块大小?
例如:
Cipher.getInstance("AES/CBC16/PKCS5Padding");
我注意到here,如果你没有指定块大小,那么它是依赖于提供者的。