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