加密/解密 - iphone到java - BadPaddingException:给定最终块未正确填充

时间:2011-08-09 06:05:38

标签: java iphone encryption

我的目标是加密Iphone中的数据并在java服务器上解密。

我正在使用对称加密。

我已经在java端使用KeyGenerator生成了密钥。

生成密钥的代码如下:

//用于密钥生成的Java代码

File keyFile = new File("F:/key","mykey.key");
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey skey = kgen.generateKey();
byte[] enc= skey.getEncoded();
FileUtils.writeStringToFile(keyFile ,Base64.encodeBase64String(enc),"UTF-8");   

以下是用于解密的java代码:

//从文件中获取密钥

File file = new File("F:/key", "mykey.key");
    SecretKeySpec keySpec= null;
try {
    byte[] keyBytes = Base64.decodeBase64(FileUtils.readFileToString(file,"UTF-8"));
     keySpec= new SecretKeySpec(keyBytes, 0, 16, "AES");
     byte[] raw = keySpec.getEncoded();

} catch (Exception e) {
    e.printStackTrace();
}

// Decrypt String encryptedString(来自Iphone)

byte[] tempByte = Base64.decodeBase64(encryptedString);

Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] cipherData = cipher.doFinal(tempByte);

String ttt = new String(cipherData ,"UTF-8");
System.out.println(ttt);

iphone代码类似于以下链接中给出的代码: Encrypting data with Objective-C and decrypt it with Java Problem

我在java中解密时遇到以下异常。

javax.crypto.BadPaddingException:给定最终块未正确填充

请帮忙......

1 个答案:

答案 0 :(得分:2)

填充和模式必须匹配。如果您复制了Objective-C代码,则Objective-C端的密文具有ECB模式和PKCS7填充。

默认情况下,java AES密码具有CBC模式和PKCS5填充(虽然我不确定,AFAIK PKCS5和PKCS7有些兼容)。我想你必须明确指定这些。这些设置必须匹配否则出错。所以你必须创建这样的密码:

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

顺便说一下。如果您可以选择加密模式,则应使用CBC(但双方均使用)。