2011-03-15 244 views
0

我的脚本使用openssl_private_decrypt()解密在另一个程序中使用RSA加密的字符串。目前它写入文件。但是当我尝试在文本编辑器中打开它时,它说它无法检测到编码。如果我尝试回显它,则不显示任何内容。如果我输出它的长度,我得到256,而不是正确的3RSA解密数据损坏

我知道解密是正确的,因为在输出文件上使用cat终端命令可以提供正确的数据。

$ cat decrypted.txt 

看起来这是一个字符编码问题,我听到的问题会给PHP带来很多痛苦。我甚至试过utf8_encode()。问题可能是什么?

下面的代码:

$results = ''; 
openssl_private_decrypt(
    base64_decode(
     <<<EOS 
QWlG+AZIt9GE0hw0wwcPRtUWueMLBxj3YWpa5zQBoz1ttnt7TvlxDtYWZcvaUL/qr2CJCADE2iTR 
G72FhAwew2fhqlqmsxL7Nns3yegflTTMXyilVM3mPU4Cx94ylLfa+ZrqrNEepaRorNJ/js5iTq9i 
avegO/kYOv4zhEsZirlk/Mj0vVv6irWo8WyZoCDC2SwfGWeSUI8F4pq4FUkRh9V/0zAUZ+3P0A7Z 
SrA80dSa6U/J+poRcmE1vRLQXvM8dBtFRKmb0zfltLUBMcMhcglzAhcpemJ99OCZmUuynFRcRNkj 
CkOLsO+lSHntcbmXqsKE+of78gnU3tp5hHSHIg== 
EOS 
    ), 
    $results, 
    openssl_pkey_get_private(
     // load private key 
    ), 
    OPENSSL_NO_PADDING 
); 
echo $results; 
+0

请向我们提供您的代码和示例输入 – AbiusX 2011-03-15 21:47:46

+0

特别是,您能向我们展示您用于将加密字符串写入文件的代码,然后是您用于将其读取的代码吗?另外,你完全不应该在这里使用'utf8_encode/decode'。加密的数据是一串字节,而不是一串字符。 – Charles 2011-03-15 21:51:58

+2

长度差异也可能是由于加密函数将原始数据填充到加密算法所需的块大小。 – 2011-03-15 21:52:37

回答

1

事实上,你得到的解密数据正好是单个块的长度而不是预期数据的长度,这真的是指向padding问题。

确保您使用的是双面同样的padding flag

+0

谢谢,我设置双方使用PKCS1而不是没有,现在它工作正常。 – Jonah 2011-03-15 22:21:14

0

我不熟悉openssl_private_decrypt,但它似乎是合乎逻辑,我认为你会提供BASE64_ENCODE()'d数据openssl_private_encrypt()。

在这种情况下,您通过在解密时以错误顺序运行来损坏数据。

好像你想先解密字符串,然后在未加密的字符串上运行base64_decode()。

+0

好主意,但不幸的是并非如此。在我的其他程序(实际上是用Java编写的)中,我加密了数据,然后base64对它进行编码,以便通过HTTP安全地将其发送到此脚本。 – Jonah 2011-03-15 21:57:49