オタクを二度死なせないように頑張るツール

自分のスキルがクソな理由の一端を担っているのが勉強が続かないってことにあるんすよね。
ちょっとやったらすぐ別のことに手を出しちゃうっていう
ホントこれがいけない

そして回り道に回り道を重ねて下らないものが出来ました。
参考に下のが以下の記事↓
https://qiita.com/magiclib/items/fe2c4b2c4a07e039b905

色々考えていたのですがリンク先のコードがとてもすっきりしていたので使わせていただきました。
感謝です。

暗号化についての本を読んだときにまぁまだ理解できていたのではないかなぁ？
と思われるものがXORによる暗号化。
またの名を「使い捨てパッドの暗号化」というらしい。
仕組み自体はとても簡単なのに絶対に解読できないとかいうコスパ最強の暗号化方式。

じゃあこれだけでいいじゃん、という話なんですが、
この方式だと暗号化するための「使い捨てパッド」有体にいうならパスワードが必要で、
パスワードがなければ解読は不可能だが、逆にパスワードが手に入れば簡単に解けてしまうという話らしい。

で、問題が、暗号化は何故するの？というもの。
暗号化を使うシチュエーションは大体誰かとやり取りをする際に第三者に見られないようにするため、
というのがほとんどで、ITの世界なら尚更という話。

暗号化したパスワードはどうやって第三者に渡すの？という問題に直面しちゃうらしい。
会社で添付ファイルを送るときに、別に「添付ファイルのパスワードは...」というメールを送る場合があるけれど、
そもそもメールを監視されてることを疑うなら意味ないじゃん、という話。
逆に、監視されてない環境が用意できるのであれば、暗号化の必要もなくない？というわけで普通は使われないらしい。
悲しい。

というわけで、使い勝手のあまりよろしくないと言われている方式ですが、
これも勉強だからと自分をだましつつ何か使い道を探して作ってみたのが
「黒歴史まもる君」
になります。

使い道はその名の通り、
あなたの黒歴史、お守りします。
というもの。
ただし、テキストファイルのみ。
なので痛々しい身の丈をメモ帳にガシガシ書いて、じゃんじゃん暗号化していって下さい。

流れとしては
①暗号化するファイルを読み込む
②暗号化するか複合化するか選択する
③各種処理を行う
④出力
とてもシンプル

というわけでコード全文

```python:黒歴史まもる君.py
import tkinter,time
from tkinter import filedialog

def main():
    print('ファイルを選択してください')

    typ=[('テキストファイル','*.txt')]
    dir = '__file__'

    root = tkinter.Tk()
    root.withdraw()
    txt=''
    path = filedialog.askopenfilename(filetypes=typ,initialdir=dir)

    if path == '' :
        print('キャンセルされちゃー')
        time.sleep(3)
        quit()

    with open(path,'r') as file:
        txt=file.read()

    if choice():
        encryption(txt,path)
    else:
        decryption(txt,path)

    print('完了しましちゃー')
    time.sleep(3)
    quit()


#暗号化(複合化)するか確認するだけ
def choice():
    #ユーザー入力
    dic = {'e':True,'encryption':True,'暗号化':True,'d':False,'decryption':False,'複合化':False}
    while True:
        try:
            ch = dic[input('ファイルを変換します[暗号化(e)/(d)複合化] >>>').lower()]
            return ch
        except:
            pass
            nic = {'y':True,'yes':True,'はい':True,'n':False,'no':False,'いいえ':False}
            q = nic[input('規定値以外が入力されました。\n終了しますか？(y/n)>>> ').lower()]
            if q:
                print('終了します')
                time.sleep(3)
                quit()
            else:
                pass

#暗号化でも複合化でもここを経由する
#XOR
def xor_convertion(txt,key):
    cry=''
    for i,c in enumerate(txt):
        cry+=''.join(chr(ord(c)^ord(key[i%len(key)])))
        
    return cry

#暗号化
def encryption(txt,path):
    #鍵の設定
    while True:
        key = input('複合化のためのパスワードを入力してください。\n ==>')
        again = input('確認のためもう一度入力してください。\n ==> ')

        if key==again:
            break
        else:
            print('\n入力されたパスワードが異なっています。\n')
        

    #ファイルの保存
    with open(path,mode='w') as file:
        file.write(xor_convertion(txt,key).encode().hex())

#複合化
def decryption(txt,path):
    #鍵の設定
    key = input('key? ==>')

    print('結果を表示します。\n')
    print(xor_convertion(bytes.fromhex(txt).decode(),key))
    print('\n')

    ans = input('以上の内容を上書きしますか？(y/n)>>> ')
    if ans:
        with open(path,mode='w') as file:
            file.write(xor_convertion(bytes.fromhex(txt).decode(),key))


main()
```

もうちょいきれいに出来たんじゃないか？と思ったりしないでもない。
まぁ要勉強ということで

暗号化前のtxtファイル↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520795/999fbb6a-3471-16f7-70db-9b56e8b7a0f6.png)


作業中の様子
パスワードは目隠し出来るようにすればよかったかなぁ？
と今更ながらに思っている↓
![1_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520795/53263199-26e5-a126-a3ba-b8f397c053df.jpeg)


暗号化後のファイルの中身↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520795/fc996e6b-3b58-2a00-9dee-439ea6a564bf.png)

複合化後↓
この状態だとファイルは暗号化されたまま
![2_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520795/a5b97840-6e1c-7f64-f64f-e61511382da5.jpeg)

無意味にexe化されていますが特に意味はなし。
友達に使えるか試してもらうにあたってわざわざpythonインストールしてもらうのもな...ってなった関係です。

exe化するにあたって参考にした記事↓
https://techacademy.jp/magazine/18963

以上です。
ありがとうございました。