java - 加密/解密 - iphone 到 java - BadPaddingException : Given final block not properly padded

标签 java iphone encryption

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

我正在使用对称加密。

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

生成 key 的代码如下:

// 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代码如下:

//从文件中获取 key

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();
}

//解密字符串加密字符串(来自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:给定的最终 block 未正确填充

请帮忙...

最佳答案

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

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

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

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

关于java - 加密/解密 - iphone 到 java - BadPaddingException : Given final block not properly padded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6992019/

相关文章:

ios - 如何在后台连续播放闹钟声音

java - java和oracle 12c之间的加密值不匹配

java - OnStart () 在 OnStop() 之后调用,这给我的应用程序带来了问题

iphone - UIPageView UIWebView 预取

java - 在读取超时时写入 channel

iphone - 如何获取 iPhone 应用程序使用的语言

iphone - iOS 如何加密和解密二进制文件?

.net - 导出 RSA key 时出现问题 -'key not valid for use in specified state'

java - 使用 Java 8 DateTimeFormatter 解析 ZonedDateTime

java - Apache Ignite - java.lang.ClassNotFoundException : Unknown pair