java和php的简单解密/加密

vbkedwbf  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(501)

以前,我有一个工作系统用php加密数据,用java解密。这是php代码:

function encrypt($message, $initialVector, $secretKey) {

return base64_encode(
  mcrypt_encrypt(
    MCRYPT_RIJNDAEL_128,
    md5($secretKey),
    $message,
    MCRYPT_MODE_CFB,
    $initialVector
    )
  );
}

function decrypt($message, $initialVector, $secretKey) {
  $decoded = base64_decode($message);
  return mcrypt_decrypt(
    MCRYPT_RIJNDAEL_128,
    md5($secretKey),
    $decoded,
    MCRYPT_MODE_CFB,
    $initialVector
  );
}

以及java代码

public String decrypt(String encryptedData, String initialVectorString, String secretKey) {
    String decryptedData = null;
    try {
        SecretKeySpec skeySpec = new SecretKeySpec(md5(secretKey).getBytes(), "AES");
        IvParameterSpec initialVector = new IvParameterSpec(initialVectorString.getBytes());
        Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, initialVector);
        byte[] encryptedByteArray = (new org.apache.commons.codec.binary.Base64()).decode(encryptedData.getBytes());
        byte[] decryptedByteArray = cipher.doFinal(encryptedByteArray);
        decryptedData = new String(decryptedByteArray, "UTF8");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return decryptedData;

}

但是,我最近从PHP5.x切换到7.1,现在得到以下消息:
“不推荐使用函数mcrypt\u encrypt()”
看来麦克里普不再是个好选择了。我在google上搜索了很多,但大多数例子仍然使用mcrypt。唯一其他好的选择是使用诸如rncryptor或defuse之类的工具,但没有任何工作示例。有没有一些简单的工作示例可以用于php和java?我需要能够将数据解密为其原始形式,因为我需要用它执行某些任务。
提前谢谢

jaql4c8m

jaql4c8m1#

你考虑过搬家吗 mcrypt_encryptopenssl_encrypt . 请记住 openssl 如果给定相同的明文和密钥,则不会输出相同的加密文本。
另外,移除 md5 因为它是非常快速和容易暴力。

3b6akqbq

3b6akqbq2#

这看起来像来自此链接的代码:http://php.net/manual/de/function.mcrypt-encrypt.php#119395. 但是无论如何,我认为应该用openssl\u encrypt()来代替它。
这是函数的一个端口(当然没有md5)。

<?php

function encrypt_new($data, $iv, $key, $method)
{
    return base64_encode(openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv));
}

function decrypt_new($data, $iv, $key, $method)
{
    return openssl_decrypt(base64_decode($data), $method, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
}

$data = "plain text";
$method = 'AES-128-CFB8'; // AES/CFB8/NoPadding
$ivSize = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($ivSize);
$password = 'default-secret-salt';
$key = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);

$encrypted = encrypt_new($data, $iv, $key, $method);
echo $encrypted. "\n";
$decrypted = decrypt_new($encrypted, $iv, $key, $method);
echo $decrypted. "\n"; // plain text

相关问题