#navi_header|技術| OpenSSLでRSA秘密鍵・公開鍵を作成し、署名したり署名を検証したりしてみました。 > openssl version OpenSSL 0.9.8h 28 May 2008 古い・・・。大分前に以下のURLからインストールしたOpenSSL使ってます。 - OpenSSL for Windows -- http://gnuwin32.sourceforge.net/packages/openssl.htm ---- #outline|| * genrsaコマンド genrsaコマンドでRSAに使う秘密鍵を生成する。 #pre||> > 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)で暗号化する: #pre||> > 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"が追加されました: #pre||> -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-256-CBC,189... c7f5hYcyY6c95ay73R8udIaPOBWGmukmYI46glvFOtUA2pnS2LYpiIAuvrk9obZP ... -----END RSA PRIVATE KEY----- ||< * rsaコマンド 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 ''暗号化されていない秘密鍵を暗号化する:'' #pre||> > 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----- ||< * rsautlコマンド 署名や暗号化処理を行う。暗号化された秘密鍵を使っている場合、秘密鍵を使う"-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 #navi_footer|技術|