gpt4 book ai didi

java - 简单的 AES 在 PHP 中加密,在 Java 中解密

转载 作者:可可西里 更新时间:2023-11-01 01:14:54 24 4
gpt4 key购买 nike

我想实现一种简单而安全的方式来将一些信息从 PHP 脚本发送到 Java 客户端。我已经在这里查看了几个实现,但到目前为止没有一个有效,我现在感到很沮丧。我使用的最后一个经过一些编辑的是这个:

PHP:

function enc3($plaintext) {

$length = 16;
$key = openssl_random_pseudo_bytes($length);

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
$plaintext, MCRYPT_MODE_CBC, $iv);

echo base64_encode($ciphertext);
echo "\n".base64_encode($iv);
echo "\n".base64_encode($key);
}
enc3("test");

Java:

public static byte[] decrypt(byte[] key, byte[] initVector, byte[] encryptedValue) {

try {

IvParameterSpec iv = new IvParameterSpec(initVector);
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/NOPADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

byte[] original = cipher.doFinal(encryptedValue);

return original;
} catch (Exception ex) {
Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex);
}

return null;
}
...
byte[] encpryted = Base64.getDecoder().decode(rd.readLine());
byte[] iv = Base64.getDecoder().decode(rd.readLine());
byte[] key = Base64.getDecoder().decode(rd.readLine());

byte[] output = decrypt(key, iv, encpryted);

然后我得到:

javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes

key 只是用来调试的,当然,我会在它运行时将其删除,并将其存储在客户端中。不知道什么是最好的方法,不知何故,我想通过以隐藏的方式组合它来隐藏它,服务器也知道如何生成它。但我猜它会在内存中可读,不是吗?

最佳答案

AES 是一种 block 密码,仅适用于 16 字节的 block 。当您的密文长度不能被 16 整除时,它会导致 IllegalBlockSizeException。

您可以在 PHP 中轻松实现 AES/CBC 密码的 PKCS5 填充,这基本上是一种标准化方式,用于将您的纯文本输入填充为 block 大小的精确倍数:

function pkcs5_pad($text) {
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = $size - (strlen($text) % $size);
return $text . str_repeat(chr($pad), $pad);
}

然后更新您的加密函数以使用填充:

$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
pkcs5_pad($plaintext), MCRYPT_MODE_CBC, $iv);

Java已经实现了对PKCS5的支持,只需更新AES密码初始化即可:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");

关于java - 简单的 AES 在 PHP 中加密,在 Java 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41562408/

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