opensslとpycryptoで3DES


pythonとopensslで3DES暗号化処理のメモ


opensslでコマンドラインから処理

#3DESで暗号化
# plain.txtファイルの内容を3DESのCBCモードで暗号化し、出力した暗号文をcipher.binに格納する
openssl enc -des3 -e -salt -in plain.txt -out cipher.bin -pass pass:hogehogehogehoge

#3DESで復号
cipher.binの内容を3DESのCBCモードで復号し、出力した平文をplain_decoded.txtに格納する
openssl enc -des3 -d -in cipher.bin -out plain_decoded.txt -pass pass:hogehogehogehoge


pycryptoを使ってpythonスクリプトで処理

# coding=utf-8
from Crypto.Cipher import DES3
from Crypto import Random


def encrypt_file(in_filename, out_filename, chunk_size, key, iv):
    des3 = DES3.new(key, DES3.MODE_CBC, iv)

    with open(in_filename, 'r') as in_file:
        with open(out_filename, 'w') as out_file:
            while True:
                chunk = in_file.read(chunk_size)
                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                    chunk += ' ' * (16 - len(chunk) % 16)
                out_file.write(des3.encrypt(chunk))


def decrypt_file(in_filename, out_filename, chunk_size, key, iv):
    des3 = DES3.new(key, DES3.MODE_CBC, iv)

    with open(in_filename, 'r') as in_file:
        with open(out_filename, 'w') as out_file:
            while True:
                chunk = in_file.read(chunk_size)
                if len(chunk) == 0:
                    break
                out_file.write(des3.decrypt(chunk))


key = 'hogehogehogehoge'
iv = Random.get_random_bytes(8)

#3DESで暗号化
encrypt_file('plain.txt', 'cipher.bin', 8192, key, iv)

#3DESで復号
decrypt_file('cipher.bin', 'plain_decoded.txt', 8192, key, iv)

メモ

opensslのコマンドではモードは特に指定していないがdes3はデフォルトでCBCらしい。
pythonのコードは参考リンクのものとほぼ同じだがモードをopensslに合わせてCBCにしてある。
pythonのコードにある「iv」は初期化ベクトル (initialization vector)の略。
モードについては新版暗号技術入門 秘密の国のアリスがとてもわかりやすい。古い版しかもってないけど。

OpenSSL―暗号・PKI・SSL/TLSライブラリの詳細―

OpenSSL―暗号・PKI・SSL/TLSライブラリの詳細―

新版暗号技術入門 秘密の国のアリス

新版暗号技術入門 秘密の国のアリス

参考 : Python and cryptography with pycrypto | Laurent Luce's Blog