2

編集:コメントで言ったように、キーが問題ではないことがわかりました。それらを問​​題なく使用して、OpenSSL でデータを暗号化および復号化できます。

しかし、Crypto++ を介して以前に暗号化された OpenSSL 上の文字列を復号化する必要があり、それは機能していません。

後で追加の詳細を投稿します。

こんにちは、Crypto++ で生成された RSA 公開鍵を使用して文字列を暗号化しましたが、PHP と OpenSSL を介して復号化しようとしています (まだ失敗しています)。

それが私がやっていることです:

  • base64 または 16 進数でエンコードされていない秘密鍵は、「rsa-private.key」というファイルに保存されます。
  • 暗号化されたメッセージは「message.txt」に保存されます (16 進数でエンコード)

ステップ 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 は常に空です。

なぜ機能しないのかわかりません。私が間違っていることに気づいた人はいますか?

4

2 に答える 2

1

phpseclib は OpenSSL と完全に相互運用可能であり、一般的にはるかに使いやすいと見なされています。次の URL は、OpenSSL と相互運用する方法の例をいくつか示しています。

PHP で RSA 暗号化して .NET で復号化する

于 2010-10-19T18:55:51.230 に答える
0

わかりました、これが問題かどうかはわかりませんが、この時点で何か役立つと思います.

小さな 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

最初のペアはフレーズ「phrase」を使用しています

このスクリプトで両方のペアを使用して出力をテストしました

$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

メッセージが正しい公開鍵で暗号化されているかどうかを確認できます

于 2010-10-19T14:39:14.707 に答える