簡體   English   中英

用PHP解密加密的文本

[英]Decryption of encrypted text in PHP

我正在嘗試用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上發布的第二個響應: 如何在javascript中加密數據並在php中解密?

我假設解密后的值在PHP變量$ sensitiveData中。

當我將其回顯到屏幕上時,我什么也沒得到。

echo("sensitiveData=[$sensitiveData]<br />");

有什么想法嗎?

更新:openssl_private_decrypt()的返回值為FALSE,並且返回值為NULL。

更新2:我從以下URL創建了公用/專用密鑰。 http://shop-js.sourceforge.net/crypto2.htm

在底部,有一行:然后將以下內容放入您的私有腳本中(可能在您的本地硬盤上,而不是在Internet上,如果找到了您的私有密鑰,那么這整個事情就沒用了。)

<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 ]

$ privateKey必須采用某種格式。 您不能只是將隨機數據扔給它,並且神奇地期望它知道如何處理它。

另外,查看您正在使用的js,這不僅僅是在做RSA。 它具有一個名為base64ToText的函數。 它以此來解密密文,以第一個字節作為“加密會話密鑰”的長度,獲取“加密會話密鑰”,用RSA解密,然后將其用作RC4的密鑰來解密。 但是與此同時也存在許多問題。 base64ToTextbase64ToText與PHP的base64_encode並不相同。

無論如何,我無法使其正常工作。 就個人而言,我建議使用類似以下的內容(可與PHP / phpseclib的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實現也要打破先例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM