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

Posted

技术标签:

【中文标题】加密/解密 - iphone 到 java - BadPaddingException:给定最终块未正确填充【英文标题】:Encryption/Decryption - iphone to java - BadPaddingException: Given final block not properly padded 【发布时间】:2011-08-09 06:05:38 【问题描述】:

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

我正在使用对称加密。

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

生成key的代码如下:

//生成密钥的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();

//解密字符串 encryptedString(from 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】:

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

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

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

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

【讨论】:

PKCS5 和 PKCS7 确实兼容。 ECB 模式不安全,不应使用,请改用 CTR 或 CBC 模式。您明确指定要在两端使用的填充的建议是正确的。 其实问题出在关键。我在保存文件时对密钥进行了编码。在电话中,我使用编码密钥进行加密,而在 Java 中,我使用原始密钥进行解密。感谢您的宝贵时间!

以上是关于加密/解密 - iphone 到 java - BadPaddingException:给定最终块未正确填充的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 加密和解密 mp4 文件

如何利用JAVA对文档进行加密和解密处理,完整的java类

主题:AndroidiPhone和Java三个平台一致的加密工具

如何解密加密的 Apple iTunes iPhone 备份?

Java对称与非对称加密解密,AES与RSA

JAVA 前端用RSA.js加密 传到后端解密有乱码