ホーム>source

こんにちは、なぜRSAがphpseclibの1つの公開鍵だけで実行(暗号化/復号化)できるのか知りたいですか?

$rsaはphpseclib/Crypt/RSA.phpのインスタンスです(リンク:https://github.com/phpseclib/phpseclib/blob/master/phpseclib/Crypt/RSA.php) ここでの$publicKeyキーは同じです。

function encryptData($data, $publicKey) {
    $rsa = new Crypt_RSA();
    $rsa->loadKey($publicKey); // public key
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $output = $rsa->encrypt($data);
    return base64_encode($output);
}
function decryptData($data, $publicKey) {
    $rsa = new Crypt_RSA();
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $ciphertext = base64_decode($data);
    $rsa->loadKey($publicKey); // public key
    $output = $rsa->decrypt($ciphertext);
    // $output = $rsa->decrypt($data);

上記のコードが機能する理由がわかりません。 また、同じ理由で、このような操作にキーペアを必要とするRubyで実装することはできません。助けていただければ幸いです。

あなたの答え
  • 解決した方法 # 1

    RSAキーに必要なのは、パブリックまたはプライベートにかかわらず、最も基本的な形式の指数とモジュロです。実際には、秘密鍵には多くの場合、中国剰余定理を介して計算を高速化するための追加のパラメーターがありますが、実際にはそれは必要ありません。

    したがって、RSAの最も基本的な形式では、公開鍵と秘密鍵は互いに区別できません。

    とは言っても、暗号化/復号化する場合は、両方を保持する必要があります。

    I don't understand why the above code works.

    機能しません。期待しているようではありません。

    さて、今のところ、実際には何もしていません。暗号化と復号化の機能がありますが、パラメーターを渡さず、両方で同じキーで機能することを前提としています。ただし、次のようにはなりません。

    <?php
    include('Crypt/RSA.php');
    
    function encryptData($data, $publicKey) {
        $rsa = new Crypt_RSA();
        $rsa->loadKey($publicKey); // public key
        $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
        $output = $rsa->encrypt($data);
        return base64_encode($output);
    }
    function decryptData($data, $publicKey) {
        $rsa = new Crypt_RSA();
        $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
        $ciphertext = base64_decode($data);
        $rsa->loadKey($publicKey); // public key
        $output = $rsa->decrypt($ciphertext);
        // $output = $rsa->decrypt($data);
        return $output;
    }
    $rsa = new Crypt_RSA();
    extract($rsa->createKey());
    $ciphertext = encryptData('zzz', $publickey);
    echo decryptData($ciphertext, $publickey);
    
    

    これにより、復号化エラーが発生します。

    最後の行を次のように置き換えた場合:

    echo decryptData($ciphertext, $privatekey);
    
    

    それを行うと、元のテキストが返されます。ただし、そのテキストを取得するには、公開キーではなく秘密キーを使用する必要があります。

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ python - bigtableから最近のデータを取得する方法は?