読者です 読者をやめる 読者になる 読者になる

xorで簡単な暗号化

排他的論理和(xor)は次のような性質を持っています。
{ \displaystyle
a \oplus b = c \\
c \oplus b = a
}
この性質を使うことで手軽に暗号化することができます。

具体的には暗号化したいデータをバイト列として読み込みます。そして鍵にあたる任意の整数とそれぞれのバイトでxorを行います。復元する際は暗号化した時とまったく同じ処理をすることで復元できます。

pythonでの実装例
入力された鍵とそれぞれバイトでそのままxorを行っても問題ないですが、その場合容易に解読できてしまいます。例えばhomuhomuという文字列を適当な鍵で暗号化した際、(/-5(/-5という文字列になります。見てわかるとおり、ある文字に対しての暗号化結果が同じになっておりどのように暗号化したのか丸わかりです。この問題を解決するには暗号化する際に使う鍵を一つ前の暗号化結果を使用することで解決できます。ちなみにこの暗号化方法はcbc(Cipher Block Chaining)と呼ばれています。

def encryption(data, key):
    out = []
    prev = key
    for value in data:
        result = value ^ prev
        out.append(result)
        prev = result
    return bytes(out)

def decryption(data, key):
    out = []
    prev = key
    for value in data:
        result = value ^ prev
        out.append(result)
        prev = value
    return bytes(out)

print("open")
path = input()
with open(path, "rb") as f:
    data = f.read()

print("key")
key = sum(input().encode()) % 256
         
print("0 encryption")
print("1 decryption")
mode = input()
if mode == "0":
    out = encryption(data, key)
else:
    out = decryption(data, key)

print("save")
path = input()
with open(path, "wb") as f:
    f.write(out)

hello world

はじめまして。
python機械学習、数学やゲームプログラミング等さまざまなジャンルに興味があり、それに関するメモを残していきたいと思っています。また丁寧な文体で記事としてまとめることで、自分の低い文章力を少しでもあげることが出来たらいいなと思っています。
こんな私ですがよろしくお願いします。