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

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

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

Я опубликую дополнительную информацию позже.

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

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

  • Закрытый ключ, НЕ закодированный в формате base64 или шестнадцатеричный, хранится в файле с именем "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 всегда пуст.

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


person Jane Kolitz    schedule 19.10.2010    source источник
comment
используйте openssl_error_string, чтобы увидеть, есть ли ошибки. ваш сценарий Step 4 получил `(но я думаю, это единственная ошибка форматирования SO)   -  person teemitzitrone    schedule 19.10.2010
comment
О, я совсем забыл об этом. Вот что у меня получилось:   -  person Jane Kolitz    schedule 19.10.2010
comment
ошибка: 0407106B: процедуры rsa: RSA_padding_check_PKCS1_type_2: тип блока не 02   -  person Jane Kolitz    schedule 19.10.2010
comment
ошибка: 04065072: процедуры rsa: RSA_EAY_PRIVATE_DECRYPT: проверка заполнения не удалась   -  person Jane Kolitz    schedule 19.10.2010
comment
меняет ли что-нибудь изменение параметра padding на openssl_private_decrypt? php.net/manual/en/function.openssl-private- decrypt.php   -  person teemitzitrone    schedule 19.10.2010
comment
Я попробовал их, единственное изменение произошло, когда я изменил его на OPENSSL_NO_PADDING, что вызвало какой-то странный результат. Я также попытался зашифровать некоторый текст, используя открытый ключ, который я сгенерировал с помощью Crypto ++ на OpenSSL, и он работает, расшифровка тоже. Я еще раз посмотрю на Crypto ++. Может быть, он занимается какими-то причудливыми вещами, которых я еще не заметил. И вот еще одна ошибка, которую я получил: ошибка: 0406506C: процедуры rsa: RSA_EAY_PRIVATE_DECRYPT: данные больше, чем mod len   -  person Jane Kolitz    schedule 19.10.2010


Ответы (2)


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

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

person Community    schedule 19.10.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

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

person teemitzitrone    schedule 19.10.2010