使用 R 解密在 PHP 中加密的消息

Using R to decrypt messages encrypted in PHP

脑袋疼,想不通,不胜感激。我有一个在存储时使用 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!"