шифрование против знака, редкий вывод с Crypt_RSA

Я пытаюсь подписать строку с помощью:

$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....) НЕ РАБОТАЕТ? ЧТО ТЫ ДУМАЕШЬ ИЗ ЭТОГО? спасибо марио


person user1873420    schedule 19.04.2013    source источник
comment
Может код странный он правильный, шифрую с закрытым ключом, а все люди расшифровывают, но только с моим публичным ключом, может поэтому первая страница, отправляет ОК   -  person user1873420    schedule 20.04.2013
comment
Так что, может быть, я сомневаюсь, почему два кода, один с rsa-›sign, а другой с rsa-›encrypt, не дают одного и того же результата, спасибо за разъяснение.   -  person user1873420    schedule 20.04.2013


Ответы (3)


То есть код работает на одной машине, а на другой нет? Похоже, в этом случае ваши файлы .crt могут отличаться. Тем не менее, вам не нужно использовать openssl_* для извлечения открытого ключа — вы можете сделать это с помощью phpseclib. например.

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

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

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

Я не совсем уверен, о чем вы спрашиваете с вопросом о шифровании ... хотя обычно вы шифруете с помощью открытого ключа, вы можете сделать это и с закрытым ключом. Оба они выполняют одну и ту же операцию — модульное возведение в степень. Я не могу комментировать страницу тестера, так как исходный код не был опубликован.

person neubert    schedule 19.04.2013
comment
Привет, neubert, не совсем так, код работает в первом тестере, этот первый тестер проверяет только знак строки f2e, этот знак является частью документа, затем я подписываю xml весь документ, затем полученный подписанный документ проверяется в второй тестер, там он присылает неверные подписи. Что мне нравится, так это применять код для подписи строки, затем применять подпись xml ко всему документу и помещать полученный подписанный документ в тестер. Я не могу достичь этой точки, потому что, когда я подписываю строку закрытым ключом, первый тестер выдает ошибку, не восстанавливает исходную строку, ставит, мусор - person user1873420; 19.04.2013
comment
Можете ли вы опубликовать нерабочий код тогда? Похоже, вы опубликовали рабочий код, а затем какой-то несвязанный код, связанный с шифрованием, но я не вижу ничего, относящегося к подписям XML в вашем OP. Как вы их генерируете с помощью Crypt_RSA и как вы их проверяете? Я слишком много думаю о XML-подписях, но я знаю, что XML должен быть канонизирован перед созданием знаков, чтобы вы всегда получали один и тот же знак. Например, без каноизации <tag1><tag2>val</tag2></tag1> и <tag1> <tag2>val</tag2> </tag1> вполне можно рассматривать как одно и то же. - person neubert; 19.04.2013
comment
$rsa = новый Crypt_RSA(); //$rsa-›setPassword('*****'); $rsa-›loadKey(file_get_contents('i.pem')); // закрытый ключ $plaintext = 'f2e140eb-2b09-44ab-8504-87b25d81914c'; $rsa-›setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); $ciphertext = $rsa-›sign($plaintext); $ рето = base64_encode ($ зашифрованный текст); - person user1873420; 19.04.2013
comment
этот предыдущий код не работает в тестере. Я не знаю почему, он использует закрытый ключ и закрытую функцию, он должен работать, что с ним не так? - person user1873420; 19.04.2013
comment
Я пробовал даже со следующим, и тестер не восстанавливает исходную строку: $pkeyid = file_get_contents('i.pem'); //закрытый ключ $data = 'f2e140eb-2b09-44ab-8504-87b25d81914c'; // вычислить подпись openssl_sign($data, $signature, $pkeyid,OPENSSL_ALGO_SHA1); $ рето = base64_encode ($ подпись); - person user1873420; 19.04.2013
comment
поместите немного информации выше @neubert - person user1873420; 19.04.2013

При работе с шифрованием и сертификацией. Вы ПОДПИСЫВАЕТЕСЬ, используя закрытый ключ, который гарантирует, что он получен от вас (или другого держателя ключа, который должен безопасно храниться в безопасном хранилище ключей).

Вы ШИФРУЕТЕ с помощью открытого ключа, так что только предполагаемый получатель может расшифровать (опять же или другой владелец закрытого ключа асимметричной пары).

Вот как SSL работает примерно под капотом (пропуская зашифрованную часть симметричного ключа AES).

person Jeff Watkins    schedule 19.04.2013
comment
Спасибо, Джефф, вот почему я сказал странно, есть идеи, почему знаковый код (первый абзац кода) не работает? - person user1873420; 19.04.2013
comment
, когда я использую тестовую страницу с моим брокером, ЭТОТ ЖЕ КОД не работает - мне действительно нужно увидеть тестовую страницу. Будет разница, которую вы упускаете, возможно, вы забыли декодировать Base64? - person Jeff Watkins; 19.04.2013
comment
Джефф, ты имеешь в виду код на странице тестера? согласен, попрошу у брокера, посмотреть как проходят проверки... - person user1873420; 19.04.2013
comment
Но сначала мне нужно исправить эту первую часть, правильно подписать эту часть сообщения (строка f2e140eb-.....). Может быть, с этим решенным, тестер работает нормально - person user1873420; 19.04.2013
comment
уточнение, первая тестовая страница, проверяет, знак строки, вторая тестовая страница, проверяет все сообщение, с уже включенной подписью xml. Первая страница - это то, что я пытаюсь решить, но не с нелогичным кодом, а с кодом знака. - person user1873420; 19.04.2013

Пример всего документа (поля усечены для безопасности), СМОТРИТЕ ЗАГЛАВНЫЕ КОММЕНТАРИИ, ПОЖАЛУЙСТА:

<?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
person user1873420    schedule 19.04.2013
comment
Это решение сейчас или просто дополнительный комментарий или что-то еще? Как это связано с вашим вопросом? Можно подробнее, о чем комментарии? - person hakre; 20.04.2013
comment
Несомненно, этот код представляет собой окончательный документ с подписью xml. Есть поле (рето), которое было подписано функциями Crypt_RSA. У брокера есть страница для проверки этой первой подписи, которая не работает (поэтому я не могу добраться до второй страницы). Если вместо этого я использую функцию шифрования для подписи, эта первая страница отправляет нормально, но затем вторая тестовая страница для всего документа дает сбой, это указывает на недопустимые подписи, поэтому я спрашивал, ЧТО НЕ ТАК С ПЕРВЫМ КОДОМ, надеюсь, кто-нибудь увидит проблема. - person user1873420; 20.04.2013
comment
код поста, для знака поля рето, код для генерации всего дока, не представлен - person user1873420; 20.04.2013