なむやんの電子工作

電子工作が好きで、その備忘録にブログをハジメマス
最近は仮想通貨にはまってます、http://namuyan.dip.jp『It works!yay!!!』の管理人
※このブログの記事をまねしたことで何かしらの損害を被りましても自己責任でお願いいたします。


テーマ:

今日はメモ書き

Pythonにはpycryptoという暗号モジュールが公開されている。

今回は使用方法について簡単なサンプルコードを置いておく。

新旧いろいろな使い方があるが最新はコレみたい。

 

 

#!/user/env python3
# -*- coding: utf-8 -*-

from Crypto.PublicKey import RSA
from Crypto import Random
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
import time

start = time.time()*1000
random_func = Random.new().read
rsa = RSA.generate(2048, random_func)

private_pem = rsa.exportKey(format='PEM')  # , passphrase='hogehoge')
print("秘密鍵作成", int(time.time()*1000-start), 'mSec', private_pem)

public_pem = rsa.publickey().exportKey()
print("公開鍵作成", int(time.time()*1000-start), 'mSec', public_pem)

message = b"original file"
cipher = PKCS1_OAEP.new(RSA.importKey(public_pem))
cipher_text = cipher.encrypt(message)
print("公開鍵による暗号化", int(time.time()*1000-start), 'mSec', cipher_text)

cipher = PKCS1_OAEP.new(RSA.importKey(private_pem))
print("秘密鍵による復号化", int(time.time()*1000-start), 'mSec', cipher.decrypt(cipher_text))

# 秘密鍵による電子署名の作成
message = b"hello world!"
key = RSA.importKey(private_pem)  # , passphrase='hogehoge')
h = SHA256.new(message)
signature = pkcs1_15.new(key).sign(h)
print("署名作成", signature, int(time.time()*1000-start), 'mSec')

# 公開鍵による電子署名の検証
try:
    key = RSA.importKey(public_pem)
    pkcs1_15.new(key).verify(h, signature)
    print("署名OK", int(time.time()*1000-start), 'mSec')
except (ValueError, TypeError):
    print("署名NG!", int(time.time()*1000-start), 'mSec')

コードを実行してもらえればわかるが秘密鍵の生成が一番時間かかる。

もしも署名機能だけを用いたいならばECDSAを使えばよい。
pycryptodomeというパッケージを用いるが、本家が潰れてコレが引き継いだ関係でpycryptoを入れると自動で入るらしい?

↑の事情は伝聞なので悪しからず。

 

#!/user/env python3
# -*- coding: utf-8 -*-

from Crypto.Hash import SHA256
from Crypto.PublicKey import ECC
from Crypto.Signature import DSS
import time

start = time.time()*1000
key = ECC.generate(curve='P-256')
private_pem = key.export_key(format='PEM')
print("秘密鍵作成", int(time.time()*1000-start), 'mSec\n', private_pem)

public_pem = key.public_key().export_key(format='PEM')
print("公開鍵作成", int(time.time()*1000-start), 'mSec\n', public_pem)


message = b'hello world pycryptodome'
key = ECC.import_key(private_pem)
h = SHA256.new(message)
signer = DSS.new(key, 'fips-186-3')
signature = signer.sign(h)
print("署名作成", int(time.time()*1000-start), 'mSec\n', signature)

key = ECC.import_key(public_pem)
h = SHA256.new(message)
try:
    verifier = DSS.new(key, 'fips-186-3')
    verifier.verify(h, signature)
    print("署名検証成功", int(time.time()*1000-start), 'mSec\n')
except ValueError:
    print("署名検証失敗", int(time.time() * 1000 - start), 'mSec\n')

キーペア作成に15mSec、全て終わらせるのに100mSecかからない。

しかも出力されるデータ容量がずっと少ない。

ちなみにBitcoinで使われる楕円のパラメータは secp256k1

P-256, prime256v1, secp256r1が選択できるが含まれていないのが残念。

AD
いいね!した人  |  コメント(0)  |  リブログ(0)

AD

ブログをはじめる

たくさんの芸能人・有名人が
書いているAmebaブログを
無料で簡単にはじめることができます。

公式トップブロガーへ応募

多くの方にご紹介したいブログを
執筆する方を「公式トップブロガー」
として認定しております。

芸能人・有名人ブログを開設

Amebaブログでは、芸能人・有名人ブログを
ご希望される著名人の方/事務所様を
随時募集しております。