使用Crypt_RSA加密vs符号,稀有输出

时间:2013-04-19 14:27:59

标签: php xml encryption sign phpseclib

我正在尝试用以下字符签署一个字符串:

$rsa = new Crypt_RSA();
//$rsa->setPassword('*****');
$rsa->loadKey(file_get_contents('i.pem')); // private key
$plaintext = 'f2e140eb-2b09-44ab-8504-87b25d81914c';
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
$ciphertext = $rsa->sign($plaintext);
$reto = base64_encode($ciphertext);

当我在本地验证时,使用:

$pubb_key = openssl_pkey_get_public(file_get_contents('instancia_imta_ope.crt'));      
$keyData = openssl_pkey_get_details($pubb_key);
$pkeyy = $keyData['key'];
$rsa->loadKey($pkeyy); // PUBLIC key
echo $rsa->verify($plaintext, $ciphertext) ? 'verified' : 'unverified';

它显示已验证, 当我使用我的经纪人的测试页面时,这个相同的代码,不起作用。它不会恢复原始字符串。 尝试使用不同的东西,我尝试了以下奇怪的代码:

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('i.pem')); // PRIVATE key, IT SHOULD BE PUBLIC
$plaintext = 'f2e140eb-2b09-44ab-8504-87b25d81914c';
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$ciphertext = $rsa->encrypt($plaintext);
$reto = base64_encode($ciphertext);

它的奇怪或不合逻辑,因为我使用私钥加密,它被公共密钥,目标使用其私钥的子,解密消息。奇怪的是,这个weid代码使测试页面发送一个OK,它恢复了字符串。我不知道为什么。 所有这些都是一个更大的消息的一部分,它最终用xml签名处理,当我处理所有(添加xml签名),代理的另一个测试页面发送无效签名,我敢打赌,这是因为奇怪码。没关系,问: 为什么正确的代码(rsa->符号....)没有工作?这件事对你有什么影响? 谢谢 马里奥

3 个答案:

答案 0 :(得分:2)

所以代码可以在一台机器上运行但不在另一台机器上运行?在这种情况下,您的.crt文件可能会有所不同。也就是说,您不需要使用openssl_*来提取公钥 - 您可以使用phpseclib就可以了。例如

<?php
include('File/X509.php');

$x509 = new File_X509();
$cert = $x509->loadX509('...'); // see google.crt

echo $x509->getPublicKey()->getPublicKey();
?>

我不确定您对加密问题的要求是什么..虽然通常您使用公钥进行加密,但您也可以使用私钥进行加密。它们都执行相同的操作 - 模幂运算。我无法对测试页面发表评论,因为它的来源尚未发布。

答案 1 :(得分:1)

处理加密和认证时。您使用私钥进行签名,该私钥可以保证它来自您(或者其他密钥持有者应该安全地保存在安全密钥库中)。

您使用公钥加密,以便只有预期的收件人才能解密(再次或AN非对称对的私钥的其他持有者)。

这就是SSL大致工作的方式(跳过加密的AES对称密钥部分)。

答案 2 :(得分:0)

整个doc的示例(为安全性而截断的字段),请参见UPPERSOCRE评论请:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SolicitudRegistro xmlns="http://www.cidge.gob.mx/SCG/Interoperabilidad"     
IdMensaje="f2e140eb-2b09-44ab-8504-87b25d81914c">
<FechaEnvio>2013-04-19T02:09:08</FechaEnvio>
<Registrante EndPoint="https://200.34.175.46:443/InteropOPE    
/MensajeInteroperabilidadService" Nombre="Institnologia del Agua"  
NombreCorto="IMTA" URI="op.mx">
<DatosDeContacto AreaOficina="Inmatica" 
CorreoElectronico="jbloc.imta.mx"     
Nombre="JoChacon" Puesto="Subdireclecomunicaciones">
<Telefonos>
<Telefono Extension=" " NumeroTelefonico="7773293644"/>
</Telefonos>
</DatosDeContacto>
<CertificadoInstancia>MIIFETCCA/mgAwIBAgIUMDAwMDAwM
</Registrante>
<Reto>         //THIS IS THE STRING SIGNED WITH PRIVATE KEY, is part of info
<CadenaCifrada>Ln0BAsnwrNg6IzjW7hk2c/Nxx/x  //I COPY THIS IN FIRST TESTER AND FAILS
</Reto>                              //UNLESS I USE ENCRYPT CODE WITH PRIV KEY (RARE)
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-
c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI=""><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09 
/xmldsig#enveloped-signatu
<ds:KeyInfo><ds:X509Data>   
<ds:X509Certificate>MIIFETCCA/mgAwIBAgIUMDAwMDAwMDAwMDAwMDAwMDI1MzMwDQY