java - php 中的 AES/CBC/PKCS5Padding java 等价物是什么?

标签 java php encryption checksum block-cipher

我正在尝试将下面的 java 片段移植到 php,但不知何故,从 php 生成的输出与 java 的输出不匹配。我做错了什么?

Java 片段:

public static String generateChecksum(String requestId, String validationString) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
IvParameterSpec iv = new IvParameterSpec(new byte[16]);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

MessageDigest mDigest = MessageDigest.getInstance("SHA-512");
byte[] digestSeed = mDigest.digest(requestId.getBytes());
byte[] seedEncArray = Arrays.copyOf(digestSeed, 32);
SecretKeySpec skspec = new SecretKeySpec(seedEncArray, "AES");
cipher.init(Cipher.ENCRYPT_MODE, skspec, iv);

byte[] finalByteArray = cipher.doFinal(validationString.getBytes());
String finalValue = new String(Base64.encodeBase64(finalByteArray), "utf-8");
return finalValue;
}

Java 校验和输入/输出(虚拟数据):

requestId:
1052

validationString:
AP_TPBabcdefghijklmnopqrstuvwxyz1234567890txnref777923212218553AP2GW_TPB2552122185536001052

finalValue:
mpCL2oS91/Mm1Xerz3rYBTEXtXFRPDodixkcJAooENvrgsc4xzrd2EeIHgmbf8rdgobmVYKFwxc0N5514FLyLyrJrxV99VztoRKBJE8LDRqXIkhU4FrobNA5FYuhVrrF

等效的 PHP 代码段:

$requestId = '1052';
$validationString = 'AP_TPBabcdefghijklmnopqrstuvwxyz1234567890txnref777923212218553AP2GW_TPB2552122185536001052';

$digestSeed = hash('sha512', $requestId, true);
$seedEncArray = substr($digestSeed, 0, 32);

$finalByteArray = openssl_encrypt(
    $validationString,
    'AES-128-CBC',
    $seedEncArray,
    OPENSSL_RAW_DATA,
    '0000000000000000'
);
$finalValue = base64_encode($finalByteArray);

echo 'finalByteArray: ' . $finalByteArray;
echo '<br />';
echo 'finalValue: ' . $finalValue;
echo '<br />';

PHP 校验和输出:

finalByteArray: �V/��X�"�5���ܪ⳻����|��>��F��G�h�|�9�6��{��Y
finalValue: AvxWL4+VDliBBwgiijWlqMzcqhjis7uZPGM/h3AhB8o+0e28fOyf6z7TE4lGy9FHm2jdfAGrOcA2k7F7trlZBg==

最佳答案

经过多次尝试,我终于达到了目标结果。附上示例代码:

function encrypt($requestId, $validationString) {
    $digestSeed = hash('SHA512', $requestId, true);
    $seedEncArray = substr($digestSeed, 0, 32);

    $finalByteArray = openssl_encrypt(
        $validationString,
        'AES256',
        $seedEncArray,
        OPENSSL_RAW_DATA,
        str_repeat(chr(0), 16)
    );

    return base64_encode($finalByteArray);
}

关于java - php 中的 AES/CBC/PKCS5Padding java 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57322735/

相关文章:

java - JavaEE 的图数据库

java - James 邮件服务器出现问题 : some time email message can't be received from gmail

java - 执行android应用程序时出现错误

php - 使用 PHP 在一个大文件中获取一行

php - 使用 url var 下载文件 Curl

security - 使用安全通道时如何让 jetty 发送带有安全标志的jsessionid-cookies

java - 有没有一种方法可以更新 Arraylist 中的记录而不删除现有记录?

php - 具有 AJAX 异步工作的 JQuery 加载器 :false

java - Java中的密文窃取

c++ - C++ 中的简单文本文件加密