gpt4 book ai didi

javax.crypto.IllegalBlockSizeException :Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH

转载 作者:行者123 更新时间:2023-12-02 02:04:41 26 4
gpt4 key购买 nike

我使用 aes-256-cbc 进行数据加密/解密。

当使用 php 代码解密数据时,我没有收到错误。

PHP 代码如下:

$key = 'd7df7d66bc110ba2e03a3a647ecd8c3f';
$iv = '73e8c03a24b4bb1e';
$encrypt_method = "AES-256-CBC";
$encrypted_text = "K0JOVFQreEQ4TlRjWGwyNXBhejRtQWVWU2doVkRsUjkvaEhQamlRdWRIWWpQQ0dVWmNpNTJXR3hhbXdWbDN4WGJpcGZTblpHRVpyeGpDY2lLc3o4cGJEeHdwdmZDTUlxalRyeDdVYlB4SmJtVUhEQkVSN3VZSklWb2h0dlZkYmY=";


$output = openssl_decrypt(base64_decode($data), $encrypt_method, $key, 0, $iv);

输出:

{"Sayfa":"b2pneVd4bUcQT09","TelNo":"905373603204","Sifre":"9cbf8a4dcb8e30682b927f352d6559a0"}

但是当使用 android ( java ) 代码解密数据时,我收到如下错误:

javax.crypto.IllegalBlockSizeException:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH

Java 代码:

String key = "d7df7d66bc110ba2e03a3a647ecd8c3f";
String iv = "73e8c03a24b4bb1e";
String encryptedText = "K0JOVFQreEQ4TlRjWGwyNXBhejRtQWVWU2doVkRsUjkvaEhQamlRdWRIWWpQQ0dVWmNpNTJXR3hhbXdWbDN4WGJpcGZTblpHRVpyeGpDY2lLc3o4cGJEeHdwdmZDTUlxalRyeDdVYlB4SmJtVUhEQkVSN3VZSklWb2h0dlZkYmY=";

AESUtil.decrypt(encryptedText,key,iv);

public String decrypt(String encryptedText, String key, String iv) {
byte[] cipheredBytes = Base64.decode(encryptedText,Base64.DEFAULT);
byte[] keyBytes = getKeyBytes(key);
byte[] ivBytes = getIvBytes(iv);
return new String(decrypt(cipheredBytes, keyBytes, ivBytes), "UTF-8");
}

public byte[] decrypt(byte[] cipherText, byte[] key, byte [] initialVector) {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
return cipher.doFinal(cipherText);
}
private byte[] getIvBytes(String iv) {
byte[] keyBytes= new byte[16];
byte[] parameterKeyBytes= iv.getBytes(characterEncoding);
System.arraycopy(parameterKeyBytes, 0, keyBytes, 0, Math.min(parameterKeyBytes.length, keyBytes.length));
return keyBytes;
}

private byte[] getKeyBytes(String key){
byte[] keyBytes= new byte[32];
byte[] parameterKeyBytes= key.getBytes(characterEncoding);
System.arraycopy(parameterKeyBytes, 0, keyBytes, 0, Math.min(parameterKeyBytes.length, keyBytes.length));
return keyBytes;
}

java代码哪里出错了?

最佳答案

我没有 Android,在常规 Java (Oracle JavaSE 8) 上,将 Base64 解码器替换为 Oracle 解码器后,我没有收到该错误,但我确实收到 BadPaddingException 因为您的数据实际上是 double base64 编码的。在 PHP 中,这是可行的,因为您显式解码一次,然后使用 options=0 的 openssl_decrypt 进行第二次解码。

在Java中,如果我对数据进行base64解码两次(并像PHP那样直接使用 key 和IV作为字节,即使它们看起来应该是十六进制-decoded)它确实解密成功且符合预期。根据developer.android.com 上的文档,我认为 Android 的 Base64.DEFAULT 与 Oracle 的默认值相同,但我自己无法验证这一点。

关于javax.crypto.IllegalBlockSizeException :Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50995268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com