GNU/Linux >> Linux の 問題 >  >> Linux

RSA を使用して暗号化された暗号文から復号化する

3 つの部分をそれぞれ pub.b64 に保存することから始めます。 、 priv.b64blob.b64 :

$ base64 -d < pub.b64 | openssl asn1parse -inform DER -i

    0:d=0  hl=3 l= 158 cons: SEQUENCE
    3:d=1  hl=2 l=  13 cons:  SEQUENCE
    5:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption
   16:d=2  hl=2 l=   0 prim:   NULL
   18:d=1  hl=3 l= 140 prim:  BIT STRING

明らかに X.509v3 証明書ではありません。とにかく、復号化する必要はありません。 openssl dumpasn1 ここでは重労働に耐えられないので、Peter Gutmann の dumpasn1 を試してください。 ビット文字列の中をのぞく:

$ base64 -d < pub.b64 > pub.der
$ dumpasn1 -al pub.der

   0  158: SEQUENCE {
   3   13:   SEQUENCE {
   5    9:     OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
         :       (PKCS #1)
  16    0:     NULL
         :     }
  18  140:   BIT STRING, encapsulates {
  22  136:     SEQUENCE {
  25  128:       INTEGER
         :         77 C8 9B 9A 58 AC 43 14 B8 95 1E BE 61 03 E9 B5
         :         05 C7 CA 7D 1B FE 6F 17 E8 9A F9 09 EB 9F C3 9E
         :         32 92 09 FC A4 B6 9E A0 CB C5 7C 7F 7B 33 4A 94
         :         50 2B 58 AD 56 7A BE 1D 8B 04 09 D9 C7 62 0A A3
         :         68 AE E6 C0 82 73 97 31 5F BF 16 C8 80 4D 08 CC
         :         4F 61 36 94 8F 71 51 6A AA 36 AF 8F 7E 0C 82 3C
         :         82 D1 96 23 47 4F F8 F6 A8 EB C0 38 79 9F DD AD
         :         5D 3F C9 5C A6 FC 37 C7 71 41 04 AA 6A B7 3A 89
 156    3:       INTEGER 65537
         :       }
         :     }
         :   }

1024 ビットのモジュラスのように見え、公開指数は 65537 と思われます。

キーは、DER (バイナリ) 形式の base64 でエンコードされた通常の RSA キーです:

$ base64 -d priv.b64 | openssl rsa -inform DER > out.key
writing RSA key
$ cat out.key
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgHfIm5pYrEMUuJUevmED6bUFx8p9G/5vF+ia+Qnrn8OeMpIJ/KS2
nqDLxXx/ezNKlFArWK1Wer4diwQJ2cdiCqNorubAgnOXMV+/FsiATQjMT2E2lI9x
UWqqNq+PfgyCPILRliNHT/j2qOvAOHmf3a1dP8lcpvw3x3FBBKpqtzqJAgMBAAEC
gYAJ1ykxXOeJ+0HOvl/ViITCol7ve6e5F1dXfKPI9NqDL5Pn+3oN7hLKEvN+btqo
NBBLJcR7OQeMZtDs3AJQJvXIqN4UJUBf6fUshhdf9Y5MSpSqAjlqLjted2uw8xuL
8gDmOYWV0yjeivvb4Qf7Vl7jAJSBwnlVsGCKmmBXDn+EoQJBAOtzJ4yl9ZFlW+OB
5l1/iA5oE0BOhM6as8W43+8kncWC2+Mn2UfouaBBPsbahDucUeL5BFebNTLl4zXS
R05HNl8CQQCCPQeysgYXDYODJYXZFzXDkFu1cfT4astM/r6Q64vDV4BlsONCCHNE
aaG12uXfxm1hkx2yvETYdcOKGx2OPagXAkEAl6470FQp+1z88XgB3EIIeJ97p3Xu
ANuQ7NPJD9ra+R7wYUqOo9C9pQvjUV/8yBpQdpRNw9JtVzjaQxYQcdFWqQJAALcl
G64uqmHAny/NlGu0N+bLGiwOFG9BvqKHmXQxyFjqs6RNG0fAmleaM82IBbqpTyfn
udue5TGAaXnMp8Ne8QJAKx/zf5AKPTkqZ7hBQ3IYfx7EbS2f6lelf8BNC+A/iz4d
xLgx7AupPtoaKZC0Z6FWpm2s0HNvYhleU3FcAfKRig==
-----END RSA PRIVATE KEY-----

そのキーをデコードした場合:

$ openssl asn1parse  < out.key
    0:d=0  hl=4 l= 600 cons: SEQUENCE          
    4:d=1  hl=2 l=   1 prim: INTEGER           :00
    7:d=1  hl=3 l= 128 prim: INTEGER           
                      :77C89B9A58AC4314B8951EBE6103E9B505C7CA7D1BFE6F17E89AF9
                       09EB9FC39E329209FCA4B69EA0CBC57C7F7B334A94502B58AD567A
                       BE1D8B0409D9C7620AA368AEE6C0827397315FBF16C8804D08CC4F
                       6136948F71516AAA36AF8F7E0C823C82D19623474FF8F6A8EBC038
                       799FDDAD5D3FC95CA6FC37C7714104AA6AB73A89
  138:d=1  hl=2 l=   3 prim: INTEGER           :010001
  [...snip...]

dumpasn1 と比較します 公開鍵をデコードすると、それらが 1024 ビットのモジュラスと指数を共有していることがわかるため、公開鍵と秘密鍵が一致しているように見えます。よかった。

それでは、暗号化されたデータをデコードしてください:

$ base64 -d blob.b64 > blob

復号化します:

$ openssl rsautl -decrypt -inkey out.key < blob > decrypted
$ hexdump decrypted
0000000 0355 1739 575b 5434 ccc5 bec7 e70a 0d44
0000010 a4a9 11d4 166c 3423 4e36 e657 2fea ef53

これは 32 バイト (256 ビット) であり、RSA では比較的少量のデータしか暗号化できないため、より多くのデータを暗号化するために対称暗号で使用される鍵である可能性が非常に高い

次のパートも頑張ってください;-)


文字列を base64 からバイナリにデコードした後、使用するアルゴリズムに応じて、次のことを試してください。

これは base64 からバイナリにエンコードします。おそらく、キーも使用する必要があります (または、手動でデコードするだけです)

$ openssl enc -in ciphertext -out binarytext -d -a

復号化を実行するには:

$ openssl rsautl -decrypt -in binarytext -out plaintext -inkey private.pem

Linux
  1. 公開鍵と秘密鍵のペアを使用したパスワードなしのSSH

  2. PHP-FFMpegを使用してビデオにオーバーレイテキストを追加する

  3. スクリプトからキーが押されたかどうかを検出しますか?

  1. Linux で GnuPG を使用してファイルを暗号化および復号化する方法

  2. Linux から Windows DLL を使用する

  3. sed を使用してテキスト ブロックを削除する

  1. LinuxでのGPGを使用したファイルの暗号化と復号化[初心者向けハンズオン]

  2. UnicodeテキストでUniqを使用していますか?

  3. B の秘密鍵を使用して、A から B を介して C に SSH 接続する