当前位置: 首页 > 知识库问答 >
问题:

Android AES解密和来自iOS的数据:javax.crypto.BadPaddingException:pad块损坏

甘祺
2023-03-14
public  String decrypt(byte[] cipherText, SecretKey key, byte [] initialVector) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
    IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector);
    cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec);
    cipherText = cipher.doFinal(cipherText);

    return new String(cipherText, "UTF-8");
}
public static byte[] decodeWebSafe(String s) throws Base64DecoderException {
    byte[] bytes = s.getBytes();
    return decodeWebSafe(bytes, 0, bytes.length);
}

byte[] iv = Base64.decodeWebSafe(enciv);
byte[] salt = Base64.decodeWebSafe(encsalt);
byte[] data = Base64.decodeWebSafe(encdata);
SecretKey key = Security.getExistingKey(password, salt);
String original = aes.decrypt(data, key, iv);
public static SecretKey getExistingKey(String password, byte[] salt) throws Exception{
    SecretKey key= null;
    KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, 10000, 256);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

    byte[] keyBytes=new byte[32]; 
    keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
    key= new SecretKeySpec(keyBytes, "AES");

    return key;
}

附注:这是我们在IOS中设置加密的方式:

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
self.encryptionKey.bytes, kCCKeySizeAES128,
self.encryptionIV.bytes, [rawData bytes], dataLength, 
/* input */buffer, bufferSize, /* output */&numBytesEncrypted);

key和IV的推导方法:

(NSData *)keyForPassword:(NSString *)password salt:(NSData *)salt {
NSMutableData *
derivedKey = [NSMutableData dataWithLength:kCCKeySizeAES128];

int result = CCKeyDerivationPBKDF(kCCPBKDF2,            // algorithm
                              password.UTF8String, 
                              password.length,  
                              salt.bytes,           // salt
                              salt.length,          // saltLen
                              kCCPRFHmacAlgSHA1,    // PRF
                              kPBKDFRounds,         // rounds
                              derivedKey.mutableBytes, // derivedKey
                              derivedKey.length); // derivedKeyLen
}

共有1个答案

赵河
2023-03-14

我可以看到您生成密钥的方式有几个不同之处:

  • 在iOS中,生成16字节/128位的密钥;在Android中是256位。
  • 在iOS中,密码是UTF-8编码的,而Android要么取每个字符的低8位,要么取完整的16位(具体算法细节我不知道)。
  • 在iOS中,您传递的密码长度无效(在UTF-8编码中是字符数,而不是字节数)。

您最好在更好地匹配密钥生成和解密前比较密钥方面投入一些时间。

 类似资料:
  • 我做了很多研究,但我找不到我的问题的答案。我在做AES加密(Rijndael块大小128位)。NET和解密在Android(AES)与相同的密码,盐 C#加密代码片段: Android解密代码段: 密码doFinal调用引发以下异常。 “05-02 18:17:38.239:W/System.err(25547):javax.crypto.BadPaddingException:填充块损坏” 我确

  • 我有CMS加密数据使用弹跳城堡,我想解密它的内容。然而,我遇到了获取。我相信,秘密钥匙有问题

  • 我被困在一个问题与AES解密在我的Android应用程序。我已经搜索了很多,但无法得到解决方案。 这是步骤,我正在做的。 用我的密钥加密信用卡号并发送到Web服务器 此外,来自服务器的加密信息与我们以加密格式发送的信息不同。在iPhone应用程序中也做了同样的事情,iPhone能够成功地解密信息。 我使用以下代码进行加密和解密。 请建议。 编辑:我还有一件事,那就是工作

  • 我最近正在研究文件加密/解密。 当我尝试用相同的密钥解密文件时,总是会发生EVP_CipherFinal_ex。 代码片段将在下面发布。 我做错什么了吗? 谢谢你的帮助。 加密 解密 顺便说一句:当我使用CipherInputStream/CipherOutStream时,它会正常工作。我想知道是否可以只使用FileInputStream/FileOutputStream?非常感谢。 编辑:加密功

  • 我尝试解密从Web服务接收的加密数据。 使用AES 128进行加密。 我使用以下代码对数据进行解密: 在 密码doFinal() 我得到了以下例外: javax.crypto.badpaddingexception垫块损坏 我浏览了我的帖子,但没有找到解决办法。我被困在这里了。

  • 我正在从谷歌地图上提取一些数据,但我似乎不能用它做任何事情。下面是我的代码: 你知道我做错了什么吗?