あちこちから写経しつつpycryptodomeのcryptoを使って暗号化複合化処理をするコードを書きました。
(開発が終わってしまったpycryptoがインストール出来ないマシンがありpycryptodomeにアップデートせざるを得なかったので……。Simple-AES-Cipherはpycryptodomeだとうまく動かないのでそれっぽいのを作ろうかと。Simple-AES-Cipher がpycryptodomeで動けば良かったのですが)
python
1#Cipher.py 2from Crypto.Cipher import AES 3from Crypto import Random 4import base64 5 6 7class Cipher: 8 """注意・暗号化するテキストの末尾にスペースがあるとそのスペースは削除される""" 9 def __init__(self): 10 # iv = "L3f4mlTJtCIPV9af".encode('utf-8') # 初期化ベクトル(16文字で適当な値を設定) 11 n = 16 12 self.iv = bytes(Random.get_random_bytes(n)) 13 self.mode = AES.MODE_CBC # 暗号化モードを指定 14 15 def mkpad(self, s, size): 16 size=48 17 s = s.encode("utf-8") # UTF-8文字列をバイト列に変換する 18 pad = b' ' * (size - len(s) % size) # 特定の長さの倍数にするための空白を生成 19 return s + pad 20 21 # 暗号化する 22 def encrypt(self, password, data): 23 # 特定の長さに調節する 24 password = self.mkpad(password, 16) # 16の倍数にそろえる 25 data = self.mkpad(data, 16) # バイト列に変換し16の倍数に揃える 26 password = password[:16] # ちょうど16文字に揃える 27 28 # 暗号化 29 aes = AES.new(password, self.mode, self.iv) 30 data_cipher = aes.encrypt(data) 31 return base64.b64encode(data_cipher).decode("utf-8") 32 33 # 複合化する 34 35 def decrypt(self, password, encdata): 36 # パスワードの文字数を調整 37 password = self.mkpad(password, 16) # 16の倍数に揃える 38 password = password[:16] # ちょうど16文字に揃える 39 40 # 複合化 41 aes = AES.new(password, self.mode, self.iv) 42 encdata = base64.b64decode(encdata) # 暗号化データをBASE64でデコードしてバイト列に 43 data = aes.decrypt(encdata) # 複合化 44 data = data.strip() 45 return data.decode("utf-8")
これを使うために、下のようにすると問題なく動きます。しかしながら、
python
1#ciphertest0 2from module import Cipher 3Cipher = Cipher() 4 5with open(r"x:\xxxxx\xxx\AEKey.txt", 'r', encoding='utf-8') as file: 6 temp0 = file.read() 7 8message = "testtext" 9password = temp0 10# 暗号化する 11enc = Cipher.encrypt(password, message) 12 13# 複合化する 14dec = Cipher.decrypt(password, enc) 15 16print(enc) 17print(dec) 18 19if message == dec: 20 print("一致確認")
このencという暗号化されたテキストをファイルに保存し、同じように下に書いたコードでデコードしようとすると、
Traceback (most recent call last):
File "ciphertest1.py", line 20, in <module>
dec = Cipher.decrypt(password, temp1)
File "Cipher.py", line 49, in decrypt
return data.decode("utf-8")
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 1: invalid continuation byte
言われてしまいます。utf-8で許されない文字列がある?
上のコードでencをtype(enc)とやって調べるとclass 'str'と出るのでただの文字列だと思うんですが、上のコードは問題なく通るのに下のコードは通りません。
エラーが出る復号化コードは以下の通りです。
python
1#ciphertest1 2from module import Cipher 3 4Cipher = Cipher() 5 6with open(r"x:\xxxxx\xxx\AEKey.txt", 'r', encoding='utf-8') as file: 7 temp0 = file.read() 8with open(r"x:\xxx\xxx\messagetext.txt", 'r', encoding='utf-8') as file: 9 temp1 = file.read() 10 11message = temp1 12password = temp0 13 14# 復号化する 15dec = Cipher.decrypt(password, temp1) 16print(dec) 17
試しに、messagetext.txtをファイルからの読み込みではなく、上のプログラム中で
dec = Cipher.decrypt(password, "g4Dj/kZ6z4w4Ia/ApBrw7OeBEHjB7k95XM1eNP6jXSGzcN/IiSITsVndLfvtv2Ks")
とやっても、同じです。
なぜ、上のciphertest0は問題なく動いて、下のciphertest1が動かないのかわかりません。
どうやったら動くようになるでしょう?
回答2件
あなたの回答
tips
プレビュー