【问题标题】:Decryption of encrypted text in PHPPHP中加密文本的解密
【发布时间】:2013-03-25 22:33:32
【问题描述】:

我正在尝试在 PHP 中解码加密数据,但返回值一直为空。

要解密的数据作为数据参数进入 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 ]

【问题讨论】:

  • 数据最初是如何加密的?为什么你认为那正是你的私钥?
  • 为什么你认为它是NULL 而不是false 或空字符串?你试过看var_dump($sensitiveData);吗? openssl_private_decrypt() 在你的情况下返回什么?
  • 我不知道 var_dump()。谢谢你。我更新了我的问题。函数的返回值是 FALSE,而数据值是 NULL 也就不足为奇了。我使用 var_dump() 收集 NULL 并回显返回值。
  • 我在另一个 Stack Overflow 问题中使用响应的第一部分加密了 JavaScript 中的数据。我验证了 JavaScript 端可以正常工作。我能够加密和解密。我验证了我可以传递加密数据,并且我验证了我可以在 PHP 中以可用格式构造私钥。那是另一个问题的主题。不过,我确实将上面的私钥从真实值更改为一些垃圾值。
  • 你检查 $dataArg1 是否为空?

标签: php encryption rsa cryptico


【解决方案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 库使用 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 实现也并非没有先例。

【讨论】:

  • 我的目标是在客户端用 JavaScript 加密文本(与在您的示例中的链接中加密密码没有什么不同),并在服务器 PHP 端解密密码。我不拘泥于任何解决方案,只是一个可行的解决方案。我执行了谷歌搜索并遇到了上面使用的方法,只是无法让它工作。我下载了zip文件,但是用frostjedi.com给力的不是,所以demo和源文件链接都失效了。显然,皇帝并没有灭亡。
  • 您应该能够将源代码复制/粘贴到该文件以在您的站点上使用:frostjedi.com/terra/dev/rsa/index.txt 您还需要获取 sha1.js 的副本,因为该站点的副本是使用本地来源:frostjedi.com/terra/dev/rsa/sha1.js
猜你喜欢
  • 2015-03-26
  • 1970-01-01
  • 2011-07-19
  • 2011-05-27
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多