RUBYを使ってOpenSSLで発行したオレオレ証明書をデコードしました。次は,RSA暗号/復号処理を実行してみます。
概要
RSAの暗号化は公開鍵を利用して実行します。そして復号は秘密鍵を利用します。例えば,Bさんが暗号文をAさんに送ろうとした場合,BさんはAさんの証明書を入手して証明書に格納されている公開鍵を利用して暗号文を作成します。この暗号文はAさんの秘密鍵じゃないと,解読することができないので,第三者が内容を知ることができません。Aさんは自分の秘密鍵で復号します。
RUBYのサンプルソース
サンプルソースはこんな感じです。
# OpenSSLのでRSA暗号/復号を実行するサンプル
require 'openssl'
# util class
# バイナリと16進文字列の変換
class String
def hex2bin
s = self
raise "Not a valid hex string" unless(s = ~ /^[\da-fA-F]+$/)
s = '0' + s if((s.length & 1) != 0)
s.scan(/../).map{ |b| b.to_i(16) }.pack('C*')
end
def bin2hex
self.unpack('C*').map{ |b| "%02x" % b }.join('')
end
end
# PKCS#12ファイルをデコードする
def decode_pkcs12(p12_file, pw = '1111')
# PKCS#12ファイルを開く
f = File.new(p12_file)
p12 = OpenSSL::PKCS12.new(f, pw)
f.close
# 証明書、鍵ペアを取り出す
cer = p12.certificate.to_der
priv_key = p12.key
pub_key = priv_key.public_key # 公開鍵を取得
return priv_key, pub_key
end
# 平文を暗号化する
def enc_data(pub_key, plaintext)
public_key = OpenSSL::PKey::RSA.new(pub_key)
puts 'Public Exponent : '
puts public_key.e.to_s(16)
puts 'モジュラス : '
puts public_key.n.to_s(16)
enc_data = public_key.public_encrypt(plaintext)
return enc_data
end
# 暗号文を復号する
def dec_data(priv_key, enc_data)
private_key = OpenSSL::PKey::RSA.new(priv_key)
plain_data = private_key.private_decrypt(enc_data)
return plain_data
end
# 呼び出し
text = "Enc Dec test"
puts 'OpenSSLで暗号/復号処理を実行する。'
puts '平文 : '
puts text
priv_key, pub_key = decode_pkcs12('newcert.p12', '1111')
enc_data = enc_data(pub_key, text)
puts '暗号文 : '
puts enc_data.bin2hex
puts ''
plain_data = dec_data(priv_key, enc_data)
puts '復号した平文 : '
puts plain_data
enc_dataメソッドでは公開鍵を設定して,平文を暗号化しています。43行目で公開鍵による暗号化を実行しています。パディングを指定することもできますが,何も指定しないとPKCS#1パディングになります。
dec_dataメソッドでは秘密鍵を指定して,暗号文を復号しています。暗号と全く逆の処理を実行しているわけです。
実行結果
暗号/復号が正しく実行できていることが分かります。
OpenSSLで暗号/復号処理を実行する。 平文 : Enc Dec test Public Exponent : 010001 モジュラス : C0359274D641F2C068D83129C15B00E3F28ADFE23EFC55E4146FE23328A21CFFB70A917AB2F6F5CC51F4D16703054C64229107E069A2CBEE240F006DB3468C81D67AC060E26C6640406055FBD9CF9C1ED1588D0B349FA209439FF28DC46197D5345A2137E34EE72E7BCE1DCB4BF8D549E53A044142FBA48721F7EDD0E01BA0B78DF95C578E5A2CDB18ED3A84B2599B0E9FFE8281A73A4C391B17F74580412B1729F99829C065374D63045D6C094DE6908BA7EC52E5377AD01CB9272A5758E8CE90BC72694E1B7E55B6E0D0188A053EF075ED3D562E9C30435EBA2C8641B23625DC5E86DD443D2F66545C8739DD1DD3EE1647607ACBB5EF627A7B567E666AD525 暗号文 : 85e39e069aa30d979d87e21c02cc960be2169da4058d322fbfc7eacc836c44f1cd798d4cd68de59b0f973c2eb5d27a7162018ee3623544067aabdfc1c7694ec1601193dabea94a1e24bb566c1a23e8be9687be5e5514f2025b01c7b597f2d0bfa134c727263b49a5c48d063093ee6756cd15e16e3c11c64afe08d79b7e3c3885ba7e8135d3ea708c0b748565a4c5e5cb5673ed56ad067a271f70a3dd0aa978e2ce5901c4f414fdb4b879463c5a86884aff7eaecf91cc3e4f7693e0c2a8f0d6ae6bbfd2e65752040323bea1fad9998546216ea48d734907e5c72aba214db4cd8e93ded54abeab302ad676e9de76c66596bc7566b9da731ee22218ea324e450825 復号した平文 : Enc Dec test
