2016-09-11 13 views
0

私は、公開された公開鍵を使用して暗号化されたメッセージを復号化するように頼んだこの挑戦に直面しました。暗号化されたメッセージ PyCryptoでエクスポートされたRSA公開鍵を使用してメッセージを復号化する方法は?

  • エクスポート公開鍵は、私は、公開鍵をインポートして解読しようとしたが、私は私だと思い

    1. 暗号Pythonスクリプト
    2. :私は3つのファイルで与えられていますメッセージを解読するために秘密鍵を把握しなければならない。

      暗号化コードは次のとおりです。256個のキーは非常に小さく、簡単に因数分解することができ、コメントで指摘

      import gmpy 
      from Crypto.Util.number import * 
      from Crypto.PublicKey import RSA 
      from Crypto.Cipher import PKCS1_v1_5 
      
      message = open('message', 'r').read() * 30 
      
      def ext_rsa_encrypt(p, q, e, msg): 
          m = bytes_to_long(msg) 
          while True: 
           n = p * q 
           try: 
            phi = (p - 1)*(q - 1) 
            d = gmpy.invert(e, phi) 
            pubkey = RSA.construct((long(n), long(e))) 
            key = PKCS1_v1_5.new(pubkey) 
            enc = key.encrypt(msg).encode('base64') 
            return enc 
           except: 
            p = gmpy.next_prime(p**2 + q**2) 
            q = gmpy.next_prime(2*p*q) 
            e = gmpy.next_prime(e**2) 
      
      p = getPrime(128) 
      q = getPrime(128) 
      n = p*q 
      e = getPrime(64) 
      pubkey = RSA.construct((long(n), long(e))) 
      f = open('pubkey.pem', 'w') 
      f.write(pubkey.exportKey()) 
      g = open('msg.enc', 'w') 
      g.write(ext_rsa_encrypt(p, q, e, message)) 
      
    +0

    256ビットキー(sic!)は非常に小さいです。モジュラスを(一般的な)数値フィールドシーブの実装で因数分解することができます。 @ArtjomB。 –

    +0

    ありがとう、私は秘密鍵を作成しましたが、 "key = PKCS1_v1_5.new(privatekey); key.decrypt(encmsg.decode( 'base64'))"を使用してメッセージをどのように復号化できますか? PKCS1_v1_5にはセンチネルが必要です。どのように私は暗号を解読するために警備員を知ることができますか? – RAHAB2

    +0

    センチネルは、復号化エラーがあった場合に返すオブジェクトです。あなたは、センチネルが何であるかを決める。 '-1'はセンチネルになる可能性があります。 ''鶏肉 ''はセンチネルである可能性があります。あなたはその考えを得る。 –

    答えて

    0

    通り。まず、鍵の生成に使用する素数を再構成する必要があります。これは

    Exponent: <decimal-value> (<hex-value>) 
    Modulus=<hex-value> 
    

    のような出力何か今、あなたはmsieveとモジュラスを因数分解やhttps://factordb.com/データベース内で検索することができなければならない

    $ openssl rsa -in <your-public-key> -pubin -text -modulus 
    

    :弾性係数と指数を見つけることのopensslで簡単に1つのライナーです。これはあなたにあなたの "p"と "q"を与えるでしょう。暗号化コードは非常にRSAではないので あなたは次のようになり、独自の復号化機能を、記述する必要があります。

    def ext_rsa_decrypt(p, q, e, msg): 
        m = bytes_to_long(msg) 
        while True: 
         n = p * q 
         try: 
          phi = (p - 1)*(q - 1) 
          d = gmpy.invert(e, phi) 
          privkey = RSA.construct((long(n), long(e), long(d))) 
          key = PKCS1_v1_5.new(privkey) 
          enc = key.decrypt(msg, "a") 
          return enc 
         except Exception, ex: 
          traceback.print_exc() 
          p = gmpy.next_prime(p**2 + q**2) 
          q = gmpy.next_prime(2*p*q) 
          e = gmpy.next_prime(e**2) 
    

    あなただけbase64ですることを忘れないでください、あなたがメッセージを解読するために必要なすべてを持っている必要があります暗号化されたメッセージを解読関数に渡す前にそれを解読する。

    関連する問題