4

こんにちは、みんな。

私はRSAの公開鍵と秘密鍵、およびPyCryptoでの暗号化/復号化を少し試してみましたが、私には奇妙なように見える問題に遭遇しました(おそらく、現在の動作方法は非常に理にかなっていますが、私は知りません. RSA 非対称暗号化についてよく知らないので、困惑しています)。私が遭遇したのは、公開鍵だけを持つものを解読できないことです。

これが問題です。サーバーとクライアントがあります。サーバーがクライアントを「認識」して登録し、「既知のデバイス」のリストに表示するようにします。クライアントはサーバーの公開鍵を持ち、サーバーはクライアントの公開鍵を持つため、クライアントがサーバーと通信するとき、クライアントの秘密鍵とサーバーの公開鍵でデータを暗号化します。これを行うことにより、適切なサーバーのみが (秘密鍵を使用して) データを開くことができ、送信者が実際にクライアントであると主張するクライアントであることを確認できます。私はこの非対称暗号化の初心者なので、どう思いますか。アイデアは、これらのクライアントの 1 つが起動すると、その公開鍵を送信するというものです (もちろん、サーバーの公開鍵で暗号化されていますが、それは 'ねえ、私は新しいクライアントで、これが私の公開鍵です。その鍵を私のUUIDに登録してください」とサーバーは従い、その公開鍵をクライアントのUUIDに関連付け、その鍵を使用してそのクライアントからのデータを復号化します。クライアントの公開鍵を送信し、その秘密鍵を秘密に保ちたいだけです、シークレット(プライベートですよね?)

私はopensslとPyCryptoを使用する非常に単純なPythonスクリプトを使用していくつかのテストを行っています(実際には、サーバー/クライアントアーキテクチャなどでも...秘密鍵で何かを暗号化し、公開鍵で復号化しようとしています)

まず、公開/秘密鍵セットを次のように作成しました。

openssl genrsa -out ~/myTestKey.pem -passout pass:"f00bar" -des3 2048

わかりました、最初に私を少し困惑させます...秘密鍵と公開鍵の両方を含むファイルを1つだけ生成します...まあ...わかりました...何でも。次の方法で公開鍵を抽出できます。

openssl rsa -pubout -in ~/myTestKey.pem -passin pass:"f00bar" -out ~/myTestKey.pub

だから私は、秘密鍵(実際には秘密鍵と公開鍵)のカップルと公開鍵~/myTestKey.pem~/myTestKey.pubそれぞれ と に持っていると思いました。ええと... PyCryptoはこのアセンブリが好きではないので、どうやら私は何か間違っているようです。理由はわかりません。

encryptor.py" " と " "という 2 つの非常に単純なテスト スクリプトがありdecryptor.pyます。" encryptor.py" は何かを秘密鍵で暗号化し、" decryptor.py" はそれを公開鍵で復号化する必要があります。私は知っています... 私はオリジナリティのパラゴンです...

そこで、文字列 " Loren ipsum " を " encryptor.py" (秘密鍵を使用) で暗号化します。

-----------encryptor.py ----------------

#!/usr/bin/python

from Crypto.PublicKey import RSA

def encrypt(message):
    externKey="/home/borrajax/myTestKey.pem"
    privatekey = open(externKey, "r")
    encryptor = RSA.importKey(privatekey, passphrase="f00bar")
    encriptedData=encryptor.encrypt(message, 0)
    file = open("/tmp/cryptThingy.txt", "wb")
    file.write(encriptedData[0])
    file.close()

if __name__ == "__main__":
    encryptedThingy=encrypt("Loren ipsum")

そして、それはうまくいきます。ええと...そう思うのですが、ファイル " /tmp/cryptThingy.txt" には意味不明なことがたくさんあります。本当に、本当に暗号化されているように見えます。

しかし、公開鍵だけを含むファイルだけを使用して復号化しようとすると...

-----------decryptor.py ---------------

#!/usr/bin/python

from Crypto.PublicKey import RSA

def decrypt():
    externKey="/home/borrajax/myTestKey.pub"
    publickey = open(externKey, "r")
    decryptor = RSA.importKey(publickey, passphrase="f00bar")
    retval=None

    file = open("/tmp/cryptThingy.txt", "rb")
    retval = decryptor.decrypt(file.read())
    file.close()
    return retval


if __name__ == "__main__":
    decryptedThingy=decrypt()   
    print "Decrypted: %s" % decryptedThingy

... PyCryptoは次のように叫びます。

  File "/usr/local/lib/python2.7/dist-packages/pycrypto-2.5-py2.7-linux-i686.egg/Crypto/PublicKey/RSA.py", line 107, in _decrypt
    mp = self.key._decrypt(cp)
TypeError: Private key not available in this object

はい、もちろん使えません!公開鍵を抽出しました!それを正しく行う方法を見つけるのに2時間かかりました!!

私は何が欠けていますか?私が言ったように、私はこの公開/秘密鍵の非対称キー暗号化ではかなり初心者なので、コアの「概念エラー」がある可能性があります...ヒントをいただければ幸いです。

前もって感謝します!

4

1 に答える 1

3

逆に、公開鍵で暗号化し、秘密鍵で復号化します。

公開されている暗号化キーは広く配布されていますが、秘密の復号化キーは受信者だけが知っています。メッセージは受信者の公開鍵で暗号化され、対応する秘密鍵でのみ復号化できます。 ソース

アイデアは、送信側に公開鍵(誰でも持つことができるため、公開して配布できる)を提供し、それを使用してデータを暗号化し、秘密鍵(あなただけが持っている)を使用してデータを復号化するというものです。 )。このようにして、データは安全に保たれます。

秘密鍵には公開鍵を作成するために必要な情報が含まれているため、秘密鍵を使用して何かを暗号化できますが、通常、データを暗号化する人は秘密鍵を持っていないため、そうするのは珍しいことです。

于 2012-03-27T15:59:02.887 に答える