Скрипт PHP openssl_encrypt для эмуляции этой функции шифрования Java (также следующим этапом будет дешифрование) - PullRequest
0 голосов
/ 23 января 2020

Я работал над сценарием PHP для работы со сценарием Java, им обоим нужно шифровать и дешифровать, используя одну и ту же процедуру / iv / key / method et c, чтобы данные проходили в обоих направлениях является переводимым *

Скрипт в основном берет соли (x3) и запускает al oop до количества солей, каждый раз добавляя суффикс к входному / зацикленному значению.

Это шифрование Java:

VALUE = "myinputvalue"; // test value for string tests
ALGORITHM = "Blowfish";
MODE = "Blowfish/CBC/PKCS5Padding";
IV = "myivmyiv"; //random test value, 8 characters
KEY = "atextstringencryptionkey";
SALT = {"salt1111", "salt2222", "salt3333"};
ITERATIONS = SALT.length;

String encrypt(String value) {
    try{
        SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(MODE);
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, new IvParameterSpec(IV.getBytes()));
        String valueToEncode = value;
        for(int i = 0; i < ITERATIONS; i++){
            valueToEncode = SALT[i] + valueToEncode;
            byte[] values = cipher.doFinal(valueToEncode.getBytes());
            valueToEncode = Base64.encodeToString(values, Base64.DEFAULT);
            Log.i("Encryption " + (i + 1), valueToEncode);
        }
        return valueToEncode;
    }
    catch(Exception e){
        e.printStackTrace();
        return "";
    }
}

Это мой PHP скрипт:

$valueToEncode = "myinputvalue";
$cipher_method = "BF-CBC";
$enc_iv = "myivmyiv";
$options = 0;
$enc_key = "atextstringencryptionkey";
$salts = array('salt1111', 'salt2222', 'salt3333');
$arrayLength = count($salts);
$iterations = array();
$i = 0;
while ($i < $arrayLength) {
    $iterations[$i] = strlen($salts[$i]);
    $i++;
}


        $s = 0;

        $valueToEncode = $value;

        while ($s < $arrayLength) {

            $valueToEncode = $salts[$s] . $valueToEncode;

            $valueToEncode = openssl_encrypt($valueToEncode, $cipher_method, $enc_key, $options, $enc_iv);

            $s++;
        }

        $return = $valueToEncode;

Это настолько близко, насколько я могу понять, это 100% первый l oop, но затем конец вывода идет не так, когда прошло обратно. Извините, если я упускаю что-то очевидное, у меня все в порядке с PHP, но шифрование для меня ново, я много искал и пытался, и оказался пустым.

Я пытался реализовать base64_decode / base64_encode, чтобы попытаться приблизиться к тому, как Java делает это), но это выкидывает все, и я надеюсь, что то, что мне не хватает, легко и очевидно для вас умные люди.

1 Ответ

1 голос
/ 28 января 2020

Я обнаружил, что проблема, с которой я столкнулся, была вызвана Java созданием разрывов строк (значение \ n) в конце каждой итерации в попытке l oop.

Эти значения \ n были удалены и теперь выходы совпадают.

К вашему сведению, мой PHP расшифровывает это (простите, мой ленивый l oop):

        $s = $arrayLength - 1;

    while ($s >= 0) {

        $valueToDecode = openssl_decrypt($valueToDecode, $cipher_method, $enc_key, $options, $enc_iv);
        $valueToDecode = substr($valueToDecode, $block_size);

        $s--;
    }

Спасибо тем, кто предложил обратную связь.

...