Python ファイル暗号化「画像ファイル/XOR演算/MACアドレス」の3つを利用した方法

 本記事では、ファイルを暗号化する方法と、それを復元する方法について記載しています。
 下図は、本プログラム実行前の状態です。ファイルが3つあって、一番左が暗号化に利用する画像ファイル「key.jpg」、中央の「secret_data.csv」が暗号化したいデータファイル、一番右の「zzz_encryption.py」が本プログラムです。

f:id:HK29:20200315194720p:plain

 下図は、「zzz_encryption.py」の実行後です。「secret_data.csv」が文字として読めず、暗号化したことがわかります。そして、右隣のファイル「secret_data.csv.bp」はバックアップしたファイルです。

f:id:HK29:20200315194604p:plain

もう一度、「zzz_encryption.py」を実行すると、「secret_data.csv」が復元します。

■本プログラム

#!/usr/bin/env python3
import sys
import shutil
import uuid
import re

import datetime
now = datetime.datetime.now()
now = now.strftime("%y%m%d")

# MACアドレスを取得する関数
def get_MAC_address():
    node = uuid.getnode()
    mac = uuid.UUID(int=node)
    
    return mac.hex[-12:]

# Xorshiftによる疑似乱数を生成する関数(ビットシフトとXORだけで高速)
# https://www.jstatsoft.org/index.php/jss/article/view/v008i14/xorshift.pdf
def keygen_Xorshift(key1):
    tx, ty, tz, tw = [123456789, 362436069, 521288629, key1] #88675123]

    tt = (tx ^ (tx << 11))
    tx, ty, tz = ty, tz, tw
    tw = (tw ^ (tw >> 19)) ^ (tt ^ (tt >> 8))
    
    return tw % 256
    
def main():
    shutil.copy2(target_file, backup_file) # ファイルをバックアップする
    
    if mac_address:
        str = mac_address
    else:
        str = get_MAC_address()
    print(str)
    pattern = r'[0-9]+' # 抽出したいパターンが数字の場合
    str_list = re.findall(pattern, str)
    
    key1 = int(''.join(str_list)) # MACアドレスから、数値データだけのkey1を生成する
    print(key1)
    key2 = keygen_Xorshift(key1) # key1を用いて、Xorshiftによる疑似乱数からkey2を生成する
    
    with open(target_file, "wb") as f: # 新規作成する暗号化ファイルを書き込みバイナリモードで開く
        target_binary = open(backup_file, "rb").read() # 暗号化したいファイルを一括で読む
        key_binary = open(key_file, "rb").read() # 暗号化に利用する画像ファイルを一括で読む

        buf = bytearray() # 組み込み関数のバイトアレイオブジェクトを作成
        for i, row in enumerate(target_binary): # 暗号化したいファイルをバイト毎に処理する
            key3 = key_binary[i % len(key_binary)] # 
            key4 = row ^ key2 ^ key3 # XOR演算(排他的論理和)
            buf.append(key4)
        f.write(buf)

if __name__ == '__main__':
    target_file = 'secret_data.csv'
    key_file = 'key.jpg'
    backup_file = target_file + '.bp'

    # 画像以外のキー。例えば、MACアドレス(物理アドレス)
    #mac_address = '11-11-A1-0A-AA-11'
    mac_address = ''
    
    # call function
    main()
    print('finished')

以上

<広告>