мой мозг болит, я не могу понять это, я был бы чрезвычайно благодарен за вашу помощь. У меня есть база данных, которая шифруется при хранении с помощью PHP. Мне нужно расшифровать его в R. Я чувствую, что я близко, но я просто не могу туда добраться.
Вот код PHP, используемый для шифрования:
<?php
function str_encryptaesgcm($plaintext, $password) {
$iv = "1234567890123456";
$ciphertext = openssl_encrypt(
$plaintext,
"AES-256-CBC",
hash('sha256', $password, true),
OPENSSL_RAW_DATA,
$iv);
return base64_encode($ciphertext);
}
function str_decryptaesgcm($ciphertext, $password) {
$iv = "1234567890123456";
return openssl_decrypt(
base64_decode($ciphertext),
"AES-256-CBC",
hash('sha256', $password, true),
OPENSSL_RAW_DATA,
$iv);
}
$enc = str_encryptaesgcm("Hello, world!", "ABCDEFGHIJKLMNOPQRST");
echo $enc . " ";
$enc = "8FT21xlAENs0Q8GTDE5k0A= = ";
$dec = str_decryptaesgcm($enc, "ABCDEFGHIJKLMNOPQRST");
echo $dec;
Здесь "8FT21xlAENs0Q8GTDE5k0A==" — это зашифрованный результат "Hello, world!" сообщение, которое у меня есть в моей базе данных. Если я запускаю его через функцию str_decryptaesgcm, он выдает исходное сообщение. Мне нужно расшифровать это в R.
Чтобы воспроизвести этот процесс в R, нужно запустить следующий код:
library(openssl)
x <- aes_cbc_encrypt(serialize('Hello, world!', NULL),
key = sha256(charToRaw('ABCDEFGHIJKLMNOPQRST')),
iv = charToRaw('1234567890123456'))
y <- aes_cbc_decrypt(
data = x,
key = sha256(charToRaw('ABCDEFGHIJKLMNOPQRST')),
iv = charToRaw('1234567890123456'))
unserialize(y)
с unserialize(y), выплевывающим исходное сообщение.
Однако base64_encode(x) выдает строку, полностью отличающуюся от строки, созданной в PHP: «1y6CgaY23ap+tQVXQKGsYyZWDMGj/GxeHjyyFOnyRJufbfieRC4aJ7/9uDzRllC21Q7v+1bADtuzEfG83iakBw==".
Я могу получаю R для создания строки PHP, но мне нужно запустить шифрование по-другому:
x <- aes_cbc_encrypt(charToRaw('Hello, world!'),
key = sha256(charToRaw('ABCDEFGHIJKLMNOPQRST')),
iv = charToRaw('1234567890123456'))
Затем base64_encode(x) выдает "8FT21xlAENs0Q8GTDE5k0A==". Однако подключение этого к декодеру производит мусор (обратите внимание, что он декодирует, он не выдает ошибку), который я не могу преобразовать:
> y <- aes_cbc_decrypt(
+ data = x,
+ key = sha256(charToRaw('ABCDEFGHIJKLMNOPQRST')),
+ iv = charToRaw('1234567890123456'))
> y
[1] 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21
> unserialize(y)
Error in unserialize(y) : unknown input format
Итак, вопрос в том, что мне нужно сделать, чтобы преобразовать "8FT21xlAENs0Q8GTDE5k0A==" обратно в исходное сообщение? Буду очень признателен за совет.





Да, вы были невероятно близки. Если вы внимательно посмотрите на y:
y
#> [1] 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21
Вы увидите, что это значения ascii вашего исходного сообщения в виде необработанного вектора. Итак, вам нужно только сделать:
rawToChar(y)
#> [1] "Hello, world!"