我正在尝试在PHP中解码加密数据,但返回值仍然会返回为null。
要解密的数据作为数据参数进入PHP文件。
$dataArg1 = $_REQUEST["data"];
// Retrieve $encryptedData from storage ...
//
// Load the private key and decrypt the encrypted data
$encryptedData = $dataArg1;
$privateKey = array ( array(123456,654321,123456), array(123456,1234),
array(1234567,4321)
);
openssl_private_decrypt($encryptedData, $sensitiveData, $privateKey);
上面的函数来自Stack Overflow上另一个帖子的第二个响应: How to encrypt data in javascript and decrypt in php?
我假设解密的值在PHP变量$ sensitiveData。
中当我回到屏幕上时,我什么都没得到。
echo("sensitiveData=[$sensitiveData]<br />");
思想?
更新: openssl_private_decrypt()的返回值为FALSE,返回值为NULL。
更新2: 我从以下URL创建了公钥/私钥。 http://shop-js.sourceforge.net/crypto2.htm
在底部,有一条线: 并将以下内容放在您的私人脚本中(可能在您的本地硬盘上 - 而不是在互联网上 - 如果发现您的私钥,则整个过程无用。)
<script>
function decrypt() {
// key = [ [d], [p], [q] ];
var key=[[123456789,123456789,123456789],[123456789,1234],[123456789,4321]];
document.form.text.value=rsaDecode(key, document.form.text.value);
}
</script>
(actual values changed)
我复制了将“var key =”行翻译成PHP(根据我的其他帖子)。上面的翻译使用嵌入式阵列然后我将该密钥传递给解密函数。
我的想法是PHP文档调用私钥“混合”。我想知道是否我需要一个不同的私钥格式。
这是输出:
dataArg1=[jmOdss9ktFc\"WO5eltUZXt0rpqS1NluNKa]
bResult=[]
sensitiveData=[]
var_dump=[NULL ]
答案 0 :(得分:1)
$ privateKey必须采用某种格式。你不能只是向它投入随机数据,并且神奇地期望它知道如何处理它。
另外,看看你正在使用的js,它不仅仅是做RSA。它有一个名为base64ToText
的函数。它正在解码密文,将第一个字节作为“加密会话密钥”的长度,获取“加密会话密钥”,用RSA解密,然后使用它作为RC4的密钥对其进行解密。但是也有很多问题。除其他事项外,base64ToText
与PHP的base64_encode
不同,正如名称所暗示的那样。
无论如何,我无法让它工作。就个人而言,我建议更像这样的东西(可与PHP / phpseclib's Crypt_RSA互操作):
http://area51.phpbb.com/phpBB/viewtopic.php?p=208860
那就是说,我确实设法解决了一些问题。你的js lib使用base-28。要将数字从该格式转换为一个phpseclib使用,您需要使用此函数:
function conv_base($num)
{
$result = pack('N', $num[count($num) - 1]);
for ($i = count($num) - 2; $i >= 0; --$i) {
_base256_lshift($result, 28);
$result = $result | str_pad(pack('N', $num[$i]), strlen($result), chr(0), STR_PAD_LEFT);
}
return $result;
}
function _base256_lshift(&$x, $shift)
{
if ($shift == 0) {
return;
}
$num_bytes = $shift >> 3; // eg. floor($shift/8)
$shift &= 7; // eg. $shift % 8
$carry = 0;
for ($i = strlen($x) - 1; $i >= 0; --$i) {
$temp = ord($x[$i]) << $shift | $carry;
$x[$i] = chr($temp);
$carry = $temp >> 8;
}
$carry = ($carry != 0) ? chr($carry) : '';
$x = $carry . $x . str_repeat(chr(0), $num_bytes);
}
这是我用来确认其正确性的脚本:
<?php
include('Math/BigInteger.php');
$p = array(242843315,241756122,189);
$q = array(177094647,33319298,129);
$n = array(45173685,178043534,243390137,201366668,24520);
$p = new Math_BigInteger(conv_base($p), 256);
$q = new Math_BigInteger(conv_base($q), 256);
$n = new Math_BigInteger(conv_base($n), 256);
$test = $p->multiply($q);
echo $test . "\r\n" . $n;
即。他们匹配。
我还将你的js base64ToText
移植到PHP:
function decode($t)
{
static $b64s = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"';
$r = '';
$m = $a = 0;
for ($n = 0; $n < strlen($t); $n++) {
$c = strpos($b64s, $t[$n]);
if ($c >= 0) {
if ($m) {
$r.= chr(($c << (8-$m))&255 | $a);
}
$a = $c >> $m;
$m+=2;
if ($m == 8) {
$m = 0;
}
}
}
return $r;
}
我可能遇到的其他潜在问题......谁知道他们的RC4实施是否正确?他们的base64实现并非如此,RC4实现也不会没有先例。