开头的稀有字符openssl_private_encrypt

时间:2013-02-15 15:40:15

标签: php encryption openssl private-key

我有一个来自我的经纪人的测试页面,在第一部分我包含一个证书(.crt)文件

  

MIIFETCCA/mgAwIBAgIUMDAwMDAwMDAwMDAwM...

和第二部分,带有我的私钥的加密字符串,原始字符串是“f2e140eb-2b09-44ab-8504-87b25d81914c”,带有我的私钥的结果加密字符串是:

  

ugSMAsCQlIKIlQ17exIvSEqkA60eWcnF4AAEVJG3BP4hYcCc+DCKeeHur6X2ShbjYWoeugPJe7AecPO0JY9jG75R67jS1OLUeUkB7HZqXCSzPANKWjQ/vx+0O0PlHHcWI24aUFCSiA2iuNXcssIbt2uJAChegXa7XKgNXxDJm+o=

有一个标签为“Decipher”的按钮,当按下它时,我获得:

  

�����������������������������������������������������������������������������������������f2e140eb-2b09-44ab-8504-87b25d81914c

正如你所看到的,我获得了原始字符串,但开头有很多奇怪的字符,有了这个,我无法继续签名过程。

技术说明(也许我做错了): 第一部分(证书:MIIFETC .....)获得:

$filename="instancia_ope.cer";
$imgbinary = fread(fopen($filename, "r"), filesize($filename));
$certificadoInstancia64 = base64_encode($imgbinary);

和使用我的私钥(ugSMAsCQlIKI ..​​....)加密的字符串:

$llave_priv = file_get_contents("i.pem");  //i.pem is my private key file
$plaintext = "f2e140eb-2b09-44ab-8504-87b25d81914c";
openssl_private_encrypt($plaintext, $encrypted, $llave_priv);
$reto = base64_encode($encrypted);

我使用

从.key文件中获取了i.pem文件
openssl pkcs8 -inform DER -in instancia_ope.key -out i.pem

我的程序有错误吗?我问我的经纪人解密按钮是做什么的,但我还没有收到回答。

2 个答案:

答案 0 :(得分:0)

看起来您已从decrypt选项中检索到原始结果。但是,查看结果时,结果不是由PKCS#1 v2.1兼容加密创建的。这可能意味着加密过程出现了问题。

答案 1 :(得分:0)

看起来你的经纪人做了纯粹的教科书RSA解密,而不是默认情况下像OpenSSL这样的PKCS#1填充RSA。因此,代理测试应用程序不会删除填充,因此会得到填充的明文块。

使用OPENSSL_NO_PADDING作为openssl_private_encrypt的可选第四个参数,您可以尝试加密而不进行任何随机填充:

openssl_private_encrypt($plaintext, $encrypted, $llave_priv, OPENSSL_NO_PADDING);

请注意,在大多数情况下使用unpadded plain textbook RSA is inherently insecure。通常,RSA应该与安全的随机填充机制一起使用,例如PKCS#1 2.1 OAEP。否则会出现许多加密安全问题,例如解密和签名的完全可互换性,easy attacks against the mathematical structure包括malleability以及缺少semantic security。这些可能适用于您的情况,也可能不适用,因为您似乎主要使用ad-hoc RSA签名协议。