openssl_encrypt ($ string, $ encrypt_method, $ key, 0, $ iv) PHP-функция эквивалентна в Java? - PullRequest
1 голос
/ 11 октября 2019

Я использую следующую логику шифрования-дешифрования на внешнем сайте, написанном на PHP и которую невозможно заменить на другую логику -

<?php
/**
 * simple method to encrypt or decrypt a plain text string
 * initialization vector(IV) has to be the same when encrypting and decrypting
 * 
 * @param string $action: can be 'encrypt' or 'decrypt'
 * @param string $string: string to encrypt or decrypt
 *
 * @return string
 */
function encrypt_decrypt($action, $string, $secret_key, $secret_iv) {
    $output = false;
    $encrypt_method = "AES-256-CBC";

    // hash
    $key = hash('sha256', $secret_key);

    // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
    $iv = substr(hash('sha256', $secret_iv), 0, 16);
    if ( $action == 'encrypt' ) {
        $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
        $output = base64_encode($output);
    } else if( $action == 'decrypt' ) {
        $output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
    }
    return $output;
}
$plain_txt = "This is my plain text";
echo "Plain Text =" .$plain_txt. "\n";
$encrypted_txt = encrypt_decrypt('encrypt', $plain_txt);
echo "Encrypted Text = " .$encrypted_txt. "\n";
$decrypted_txt = encrypt_decrypt('decrypt', $encrypted_txt);
echo "Decrypted Text =" .$decrypted_txt. "\n";
if ( $plain_txt === $decrypted_txt ) echo "SUCCESS";
else echo "FAILED";
echo "\n";
?>

, и поэтому мне нужно написать эквивалентную функцию в Java, чтобымы можем использовать подобную логику для шифрования и дешифрования в Java. Я пытался написать логику шифрования в java as-

    private static String openssl_encrypt(String data, String strKey, String strIv) throws Exception {

        Base64 base64 = new Base64();
        Cipher ciper = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec key = new SecretKeySpec(Arrays.copyOfRange(strKey.getBytes(), 0, 16), "AES");
        IvParameterSpec iv = new IvParameterSpec(strIv.getBytes("UTF-8"), 0, ciper.getBlockSize());

        // Encrypt
        ciper.init(Cipher.ENCRYPT_MODE, key, iv);
        byte[] encryptedCiperBytes = base64.encode((ciper.doFinal(data.getBytes())));

        String s = new String(encryptedCiperBytes);
        System.out.println("Ciper : " + s);
        return s;
    }

, но он дает мне разные результаты при шифровании одного и того же значения и того же ключа и iv.

Может кто-нибудь помочь мне в поискепроблема с кодом Java и помочь написать код расшифровки тоже? Спасибо в ADV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...