我的大脑很痛,我想不出来,我非常感谢你的帮助.我有一个使用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=="是"你好,世界!"我数据库中的信息.如果我运行str_decryptaesgcm函数,它会吐出原始消息.I need to decode this in 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/GXEHJYYYFYFONYRJUFBFIERC4AJ7/9UDZRLC21Q7V+1bADtuzEfG83iakBw==".

我得到can个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!"

R相关问答推荐

如何根据包含相同值的某些列获取总额

使用对管道内单元格的引用生成新变量

寻找图片边缘

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

如何自定义Shapviz图?

在R中创建一个包含转换和转换之间的时间的列

如何在ggplot中标记qqplot上的点?

如何改变x轴比例的列在面

R中的时间序列(Ts)函数计数不正确

以更少间隔的较小表中的聚合离散频率表

使用Facet_WRAP时更改框图中线的 colored颜色

R:从geom_ol()中删除轮廓并导出为pdf

如何指定我的函数应该查找哪个引用表?

如何在ggplot2中绘制具有特定 colored颜色 的连续色轮

跨列查找多个时间报告

将全局环境变量的名称分配给列表中的所有元素

如何使用For-R循环在向量中找到一系列数字

如何在反曲线图中更改X标签

如何在R中创建这些列?

将边列表转换为路径长度列表