Как расшифровать строку в OpenSSL, которая была ранее зашифрована с помощью Crypto ++? - PullRequest
2 голосов
/ 19 октября 2010

РЕДАКТИРОВАТЬ: Я обнаружил, что ключи не проблема, как я сказал в комментариях.Я могу без проблем использовать их для шифрования и дешифрования данных в OpenSSL.

Но мне нужно расшифровать строку в OpenSSL, которая ранее была зашифрована с помощью Crypto ++, и она не работает.

Дополнительные подробности я опубликую позже.

Привет, я зашифровал строку, используя открытый ключ RSA, созданный с помощью Crypto ++, и сейчас пытаюсь (пока безуспешно)) для расшифровки через PHP и OpenSSL.

Вот что я делаю:

  • Закрытый ключ, который НЕ является base64 или hex-кодом, хранится в файле с именем "rsa".-private.key "
  • Зашифрованное сообщение хранится в" message.txt "(в шестнадцатеричном коде)

ШАГ 1: загрузить закрытый ключ с помощью: $key = file_get_contents("rsa-private.key");

ШАГ 2: преобразовать ключ в формат PEM, используя следующую функцию:

<?php
function pkcs8_to_pem($der) {

    static $BEGIN_MARKER = "-----BEGIN PRIVATE KEY-----";
    static $END_MARKER = "-----END PRIVATE KEY-----";

    $value = base64_encode($der);

    $pem = $BEGIN_MARKER . "\n";
    $pem .= chunk_split($value, 64, "\n");
    $pem .= $END_MARKER . "\n";

    return $pem;
    }

    $PEMprivatekey = pkcs8_to_pem($key); 
?>

(stackoverflow.com/questions/1357569/)

ШАГ 3: подготовить ключ для дальнейшегоиспользовать OpenSSL: (без проблем)

<?php
$privateKey = openssl_get_privatekey($PEMprivatekey);
if (!$privateKey) {
    echo "Cannot get public key";
}
?>

ШАГ 4: Получить сообщение ирасшифруйте сообщение, используя следующую функцию:

<?php
function hex_to_str($hex){

    for ($i=0; $i < strlen($hex)-1; $i+=2) {
    $string .= chr(hexdec($hex[$i].$hex[$i+1])); }
    return $string;
}

$message = file_get_contents("message.txt");` 
$encryptedstring = hex_to_str($message);
?>

ШАГ 5: Расшифруйте строку: (не работает)

<?php
openssl_private_decrypt($encryptedstring, $decrypteddata, $privateKey);
if (!$decrypteddata) {
    echo "........"; } else { echo $decrypteddata; }
?>

$ decrypteddata всегда пуст.

Я не могу понять, почему это не работает.Кто-нибудь заметил, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 19 октября 2010

phpseclib полностью совместим с OpenSSL и обычно считается гораздо более простым в использовании. Следующий URL-адрес содержит несколько примеров взаимодействия с OpenSSL:

RSA Шифрование на PHP для расшифровки в .NET

0 голосов
/ 19 октября 2010

Хорошо, я не знаю, в этом ли проблема, но я думаю, что на данный момент все полезно.

Я создал небольшой тестовый скрипт openssl / php и для тестирования предлагает 2 пары открытый-закрытый ключ.

openssl genrsa -des3 -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

openssl genrsa -out master.key 1024
openssl rsa -in master.key -pubout -out master.pub

первая пара использует фразу "фраза"

использовал обе пары с этим скриптом для проверки вывода

$source = "FAIL";
echo "<pre>Source: $source";
$fp=fopen("./keys/master.pub","r");
$pub_key=fread($fp,8192);
fclose($fp);
openssl_get_publickey($pub_key);
openssl_public_encrypt($source,$crypttext,$pub_key);
echo "\n\nString crypted: $crypttext";
flush();
$fp=fopen("./keys/master.key","r");
$priv_key=fread($fp,8192);
fclose($fp);
// phrase is required if your key is encoded (suggested)
$res = openssl_get_privatekey($priv_key, 'phrase');
openssl_private_decrypt($crypttext,$newsource,$res);
while($error = openssl_error_string()) {
    echo "\n" , $error;
}
echo "\n\nString decrypt : $newsource";

рядом с error:0906D06C:PEM routines:PEM_read_bio:no start line сообщением об ошибке все прошло нормально

НО, когда я смешиваю ключи (просто чтобы посмотреть, какое сообщение об ошибке будет создано), угадайте, какие ошибки openssl_error_string возвращает:

error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02
error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed

чтобы вы могли проверить, зашифровано ли ваше сообщение с правильным открытым ключом

...