楽しんだ者勝ち~就活を終えて伝えたいこと~

MENU

【Python】AESによる文字列の暗号化プログラム

【スポンサーリンク】

はじめに

 

 ここでは、AESによる文字列の暗号化プログラムを紹介しています。入力した文字列を暗号化→復号化→テキストに保存の流れでプログラムを書きました。

 

AESとは

 

Advanced Encryption Standard は、DESに代わる新しいブロック暗号となる共通鍵暗号アルゴリズムである。
出典:現代暗号入門-神永正博より

  詳しい原理等は他のサイトや書籍でご確認下さい。私自身、まだまだ勉強中ですので、ご了承下さい。

 

コード

 

from Crypto.Cipher import AES # ---- (*1)
import base64
import sys

# 暗号化したい文字列入力とパスワードを指定 --- (*2)
message_text = input()
message = message_text
password = "xxxxxxxxxx" # 適当なパスワードを指定
iv = "L6f7mlTJuCIpV9af" # 初期化ベクトル(16文字で適当な値を指定)
mode = AES.MODE_CBC # 暗号化モードを指定

# 特定の長さの倍数にするため空白でデータを埋める関数 --- (*3)
def mkpad(s, size):
    s = s.encode("utf-8") # UTF-8文字列をバイト列に変換する
    pad = b' ' * (size - len(s) % size)
    return s + pad

# 暗号化する --- (*4)
def encrypt(password, data):
    # 特定の長さに調節する
    password = mkpad(password, 16) # 16の倍数に揃える
    data = mkpad(data, 16)         # 16の倍数に揃える
    password = password[:16]       # ちょうど16文字に揃える
    # 暗号化
    aes = AES.new(password, mode, iv)
    data_cipher = aes.encrypt(data)
    return base64.b64encode(data_cipher).decode("utf-8")

# 復号化する --- (*5)
def decrypt(password, encdata):
    # パスワードの文字数を調節
    password = mkpad(password, 16) # 16の倍数に揃える
    password = password[:16]       # ちょうど16文字に揃える
    # 復号化
    aes = AES.new(password, mode, iv)
    encdata = base64.b64decode(encdata)
    data = aes.decrypt(encdata)
    return data.decode("utf-8")

# 暗号化する
enc = encrypt(password, message)
# 復号化する
dec = decrypt(password, enc)
#文字列の大きさを計算
sys.getsizeof(enc)
# 結果を表示する
print("平文:", message)
print("暗号化:", enc,"*文字数:",len(enc),"*文字サイズ:",sys.getsizeof(enc))
print("復号化:", dec)
#表示結果を保存
#ファイルを開く
with open("text.txt",mode="a",encoding="utf-8") as f:#modo a=追加記述
#ファイルに書き込む
f.write("平文:"+ str(message))
f.write("\n暗号化:"+ str(enc) + "\n文字数:" + str(len(enc)) + "\n文字サイズ:" + str(sys.getsizeof(enc)))
f.write("\n復号化:"+ str(dec))
#書き込み終了
print("**********プログラム終了**********")

 

結果

 

f:id:mottobungaku:20191130164257p:plain

出力結果

 出力結果に文字サイズと文字数を入れているのは、ちゃんと16の倍数で指定できているのか確認するためです。

 

 

最後に

 AES以外の暗号化方式も利用できるようになりたいなと感じました。拙いコードをより高度に書けるように日々勉強ですね。
 ゆくゆくはRSAなどのコードを書けるように原理から勉強したいなと思っています。

 

参照元