2013-04-19 3 views
1

Я пытаюсь подписать строку:шифровать против знака, редкий выход с 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); 

его странно или не логично, потому что я с помощью закрытого ключа шифрования, он suposed быть открытым ключом, сын целевых применений его секретный ключ, чтобы дешифровать сообщение. Странно, этот код weid делает страницу тестера отправленной OK, она восстанавливает строку. Я не знаю, почему. Все это часть более крупного сообщения, которое, наконец, обрабатывается с помощью подписи xml, когда я обрабатываю все (добавление подписи xml), другая страница тестера брокера отправляет недопустимые подписи, я могу поспорить, что это из-за странный код. Неважно, вопрос: ПОЧЕМУ ПРАВИЛЬНЫЙ КОД (rsa-> sign ....) DOESNT WORK? ЧТО ВЫ ЭТО ВСЕ ЭТО? спасибо mario

+0

Может быть, странный код правильно, зашифровать с закрытым ключом, и все люди с расшифровывать, но только с моей публикой , ключ, возможно, именно поэтому первая страница отправляет OK – user1873420

+0

Так что, может быть, я сомневаюсь, почему два кода, один с знаком rsa-> и односторонний с rsa-> encrypt, не дают тот же результат, спасибо за его разъяснение – user1873420

ответ

1

При обработке шифрования и сертификации. Вы подписываете секретный ключ, который гарантирует, что он пришел от вас (или AN другой держатель ключа, который должен храниться безопасно в безопасном хранилище ключей).

Вы ENCRYPT с открытым ключом, так что только предполагаемый получатель может расшифровать (снова или AN другой держатель закрытого ключа асимметричной пары).

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

+0

Спасибо, Джефф, вот почему я ставил странно, любая идея, почему код знака (первый параграф кода) не работает? – user1873420

+0

", когда я использую страницу тестера с моим брокером, ЭТОТ ИГЛЫЙ КОД, не работает" - мне бы очень хотелось увидеть тестовую страницу. Будет какая-то разница, которую вам не хватает, возможно, вы забываете об декодировании Base64? –

+0

Джефф, ты имеешь в виду код внутри страницы тестера? согласитесь, я попрошу его брокеру, чтобы посмотреть, как проверяются ... – user1873420

2

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

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

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

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

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

+0

Привет, ноубед, не совсем, код работает в первом тесте, этот первый тестер проверяет только знак строки f2e this знак является частью документа, затем я XML-подписи весь документ, тогда полученный подписанный документ тестируется во втором тесте, там он отправляет «недопустимые подписи». То, что мне нравится, это применить код для обозначения строки, а затем применить подпись xml к целому документу и поместить полученный подписанный документ в тестер. Я не могу достичь этой точки, потому что, когда я вздыхаю строку с закрытым ключом, первый тестер, отправляет ошибку, не восстанавливает исходную строку, помещает, мусор – user1873420

+0

Можете ли вы опубликовать нерабочий код? Похоже, вы опубликовали рабочий код, а затем некоторый несвязанный код, связанный с шифрованием, но я не вижу ничего, связанного с подписями XML в вашем OP. Как вы их генерируете с помощью Crypt_RSA и как вы их проверяете? idk слишком много о XML-подписях, но я знаю, что XML должен быть канонизирован, прежде чем генерировать сиги, чтобы вы всегда получали один и тот же сиг. Без canoicalization ' вал и' вал 'вполне может рассматриваться как одно и то же, например. – neubert

+0

$ rsa = new 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); $ reto = base64_encode ($ ciphertext); – user1873420

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 
+0

Это решение сейчас или просто дополнительный комментарий или просто что-то еще? Как это связано с вашим вопросом? Можете ли вы более четко рассказать о комментариях? – hakre

+0

Уверенный hakre, этот код представляет собой окончательный документ с подстрокой xml. Существует поле (рето), которое было подписано с функциями Crypt_RSA. У брокера есть страница для проверки этой первой подписи, которая не работает (поэтому я не могу достичь 2-й страницы). Если я вместо этого использую функцию шифрования, эта первая страница будет отправляться нормально, но затем вторая страница тестера для всего документа не работает, она указывает недопустимые подписи, вот почему я спрашивал, ЧТО НЕПРАВИЛЬНО ПЕРВЫМ КОДОМ, надеюсь, что кто-то увидит проблема. – user1873420

+0

код сообщения, для обозначения поля рето, код для генерации всего документа, не представлен – user1873420