OpenSSLでRSA秘密鍵・公開鍵を作成し、署名したり署名を検証したりしてみました。
> openssl version OpenSSL 0.9.8h 28 May 2008
古い・・・。大分前に以下のURLからインストールしたOpenSSL使ってます。
genrsaコマンドでRSAに使う秘密鍵を生成する。
> openssl genrsa Loading 'screen' into random state - done Generating RSA private key, 512 bit long modulus ........++++++++++++ ..++++++++++++ unable to write 'random state' e is 65537 (0x10001) -----BEGIN RSA PRIVATE KEY----- MIIBOwIBAAJBAOCBzlG9MrPdUXWgGIMN8LooK4UAiT28aEZ69flortYuzzwXb47q WTeQkrTVnbJzopYRRLDswWbfNukAA9hwSbcCAwEAAQJAGpcFKqUv5iGmTjoh7ROv mTy8usnvd0JjT0Ws8Fc3reIwlrNX4ahsL9GqgFY7YMbZIeaXqAagXopZvpg5fuwo cQIhAPXu0MKxH4nZYTBDeF4Dx2Iec8JcD8HOly7hZpWnWY29AiEA6bJ28MZMsfDT BtIsP4RiLddV9Fws/2yoEC2HWpAm6oMCIQCoRPuvipNitUqLRE7SPNGqL93SiTz6 xUip+e0/zh43HQIgHT9Sl2uZ6aMkJfRjyUc+KlKK1Vw73XOxzOSFzhXAaRUCIQDy lMdy/X4wxbDD6wfA0RCgqGGYiGooblFJucQREIhATA== -----END RSA PRIVATE KEY-----
ビット数を指定する場合は最後に引数で指定:
> openssl genrsa 1024
ファイルに出力する:
> openssl genrsa -out testrsa01_sec.pem
AES256(CBC)で暗号化する:
> openssl genrsa -aes256 -out testrsa01_sec_aes256.pem Loading 'screen' into random state - done Generating RSA private key, 512 bit long modulus .......++++++++++++ ..++++++++++++ unable to write 'random state' e is 65537 (0x10001) Enter pass phrase for testrsa01_sec_aes256.pem:(パスフレーズ入力) Verifying - Enter pass phrase for testrsa01_sec_aes256.pem:(パスフレーズ入力)
暗号化すると"Proc-Type"と"DEK-Info"が追加されました:
-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-256-CBC,189... c7f5hYcyY6c95ay73R8udIaPOBWGmukmYI46glvFOtUA2pnS2LYpiIAuvrk9obZP ... -----END RSA PRIVATE KEY-----
RSAの暗号鍵から公開鍵を生成するのに使う。署名や暗号化処理にはrsautlコマンドを使う。
暗号化していない秘密鍵から:
> openssl rsa -pubout < testrsa01_sec.pem > testrsa01_pub.pem writing RSA key
暗号化した秘密鍵から:
> openssl rsa -pubout < testrsa01_sec_aes256.pem > testrsa01_pub_aes256.pem Enter pass phrase: writing RSA key
デフォルトの出力形式はPEM形式となっている。
秘密鍵の暗号化を解除する:
> openssl rsa < testrsa01_sec_aes256.pem > testrsa01_sec_aes256_nopass.pem
暗号化されていない秘密鍵を暗号化する:
> openssl rsa -aes256 < testrsa01_sec.pem writing RSA key Enter PEM pass phrase:(パスフレーズ入力) Verifying - Enter PEM pass phrase:(パスフレーズ入力) -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-256-CBC,6EDEE202C1D95242C7541CB66448CE74 vUPpCqLnGrrardKlcfRZVCIgRBw1bCnxchozP1A19Zr0bt9IhvmkYch3Cec7xSbO jwMGF/ACeYtVHCdppuEcf6wKlpSiZivyfy04fvDZ4KWZltkNN6YsKtbUEJ0A7uwJ iqUEccD6/sZelxylDzjkPsxoXO7xVWk/rW8EUFcI3l/Zf6uk9L3E1CRR3M8DUY1U zqVfCWFrLo6sP6xJ6cMIh6w8b6EPMS/3ITMdF3ek+x77Cip4KZgAX0CcmdZpkjwy EmSf9LWyAbDOVIjqJTAeOAG+JJgjZ8WDueCLbSzgBTUBFnA4qVwqTboMcSxYjgTF ZI2vefASaV32lMMqE9Gv6HdibTlprqdgDVdy/GoPpxsShMKsOQKKgY2aumZb1pfL 13Meo2yhuGxpQm1Zim3+vjU5AJr86M8lBzzomiESwGQ= -----END RSA PRIVATE KEY-----
署名や暗号化処理を行う。暗号化された秘密鍵を使っている場合、秘密鍵を使う"-sign", "-encrypt"で暗号化を解くためのパスフレーズの入力を求められる。"rsaコマンド"の項で作成した testrsa01_sec.pem, testrsa01_pub.pem を使って以下のファイルに対して練習してみる。
plain.txt:
abcdefghijklmn
なお、"-keyform"を指定しない場合の鍵ファイルのフォーマットはPEM形式。
署名:"-sign" + "-inkey 秘密鍵ファイル"
> openssl rsautl -sign -in plain.txt -inkey testrsa01_sec.pem -out sign.bin Loading 'screen' into random state - done
sign.binはバイナリファイル。
秘密鍵による署名の検証:"-verify" + "-inkey 秘密鍵ファイル"
> openssl rsautl -verify -in sign.bin -inkey testrsa01_sec.pem Loading 'screen' into random state - done abcdefghijklmn
※元のファイル内容についてファイルに保存したい場合は "-out 出力ファイル名" を追加。
公開鍵による署名の検証:"-verify" + "-inkey 公開鍵ファイル" + "-pubin"
> openssl rsautl -verify -in sign.bin -inkey testrsa01_pub.pem -pubin Loading 'screen' into random state - done abcdefghijklmn
公開鍵ファイルを"-inkey"で指定しつつ、"-pubin"を指定しない場合、"-inkey"が秘密鍵として扱われエラーとなる。
> openssl rsautl -verify -in sign.bin -inkey testrsa01_pub.pem Loading 'screen' into random state - done unable to load Private Key
公開鍵で暗号化:"-encrypt" + "-inkey 公開鍵ファイル" + "-pubin"
> openssl rsautl -encrypt -in plain.txt -inkey testrsa01_pub.pem -pubin -out plain_enc.txt
暗号化されたデータはバイナリ形式。"-pubin"を指定しない場合は秘密鍵として扱われエラーとなる。
秘密鍵で暗号化:"-encrypt" + "-inkey 秘密鍵ファイル"
> openssl rsautl -encrypt -in plain.txt -inkey testrsa01_sec.pem -out plain_enc2.txt
秘密鍵でも暗号化できるが、復号化には公開鍵ではなく秘密鍵が必要となる。
秘密鍵で復号化:"-decrypt" + "-inkey 秘密鍵ファイル"
> openssl rsautl -decrypt -in plain_enc.txt -inkey testrsa01_sec.pem Loading 'screen' into random state - done abcdefghijklmn