1

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

$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->sign....)不起作用?你对这一切有什么看法?谢谢马里奥

4

3 回答 3

2

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

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

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

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

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

于 2013-04-19T15:13:44.980 回答
1

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

您使用公钥加密,以便只有预期的接收者可以解密(再次或非对称对的私钥的另一个持有者)。

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

于 2013-04-19T14:30:41.283 回答
0

整个文档的示例(为了安全而截断的字段),请参阅 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
于 2013-04-19T16:24:42.463 回答