〜 卓越した品質へ 〜

OpenSSLでPKCS#12ファイルをデコードしましたので,次は,そのカギを使って署名/署名検定を実行してみましょう。

概要

PKCS#12ファイルをデコードし,証明書と秘密鍵ペアを取り出します。秘密鍵で署名を実行して,証明書で署名検定を実行します。

サンプルソース

OepnSSL.crypto.verify関数は,署名検定に失敗すると例外を発生します。署名検定に成功すると,何も返しません(戻り値がNoneになります)。

# -*- coding: utf-8 -*-
# RSAの暗復号署名/署名検定を実行する

import OpenSSL
import binascii

# PKCS#12ファイルをデコードする
# PKCS#12ファイルを入力すると,鍵ペアが返る
def decodeP12(p12File, pwd='1111'):
	# PKCS#12ファイルをオープンする
	p12_input = open(p12File, 'rb')
	try:
		buffer = p12_input.read()
	finally:
		p12_input.close()

	# PKCS#12ファイルをデコードする
	p12 = OpenSSL.crypto.load_pkcs12(buffer, pwd)

	# 証明書と秘密鍵を取得する
	userCert = p12.get_certificate()
	caCert = p12.get_ca_certificates()
	priKey = p12.get_privatekey()

	return priKey, userCert, caCert

# データを署名する
# 秘密鍵と平文を入力すると,署名データが返る
def sign(priKey, plainText, userCert):
	return OpenSSL.crypto.sign(priKey, plainText, 'sha256')


# 署名検定する
# 証明書と署名データと平文を入力,署名が不一致だと例外が発生する。
def verify(userCert, signedText, plainText):
	OpenSSL.crypto.verify(userCert, signedText, plainText, 'sha256')


# 呼び出し
if __name__ == '__main__':
	text = 'This is a plain text.'
	print('plaintext\n%s' % text)
	priKey, userCert, caCert = decodeP12('user2.p12', '1111')
	signedText = sign(priKey, text, userCert)
	print('signedText\n%s' % binascii.hexlify(signedText))
	verify(userCert, signedText, text)
	print('verify success.')

実行結果

実行結果はこの通りです。

plaintext
This is a plain text.
signedText
b'42972e9d9aeff9fb602c9e967976cb36099ace80960f9b8a3820a3f7e0ccc980ed68bfa54d88aee007da2b833db7b96fcf51457455c1a287e6a6ec493c5171386f8abe794b1d4ef0547ef21612eb58b19b2a6cc0180965b3f5095dcb57c39138801f017d0eef880dc0c204ea7a0320706df56d1f8730e0c84b874ba358a9337b9bf397739d61be8c6e4b0c12fcbbe31f3082f8265f92db8092d9e119de111c161db59e2e8cea861fcbee1d489a229ead29b2e85e9991d50a2c342f8e9d40b728b6e000c1fefeffaca3a658d19274f1a85bddebe73fede70866839e59ff0fe0f6feb730f7e66ce4fa84f81b511f2a506b3d0925c09b5103a86bc0bbddb6e0633b'
verify success.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.