【Python】メモに出力するシーザー暗号を実装する

【Python】メモに出力するシーザー暗号を実装する

こんにちは、しゃねろんです。
今回はシーザー暗号を実装したのでそれを記事にしています。
勿論import等を用いればより短く、セキュリティの高い暗号化をできるとは思いますが今回は仕組み重視なのであっさりと。

今回作成したコードはGitHubにもあるので、よければそちらもご覧ください!

https://github.com/Unigmos/CaesarCipher

シーザー暗号とは

まず、シーザー暗号についてサクッと説明します。
シーザー暗号は文字列を特定の文字数シフトすることで暗号化する手法であり、シフトする文字数を「3」とすれば、「hi」という文字列も3文字分ずれて「kl」というように別の文字列に変換する方法のことを言います。

シーザー暗号の仕組み

実装手順とコード

シーザー暗号の実装手順ですが、「ファイルを読み取る」「文字をずらす」「ファイルに書き込む」の3ステップに分けて説明していきます。

今回用いたコードはこちら↓

inputpass = 'input.txt'     #入力ファイル名
outputname = 'output.txt'   #出力ファイル名
shift = 3                   #ずらす文字数

textdata = open(inputpass)
lines = textdata.readlines()
textdata.close()

encryption = ''
with open (outputname, 'x') as output:
    for data in lines:
        for f in data:
            encryption = chr(ord(f) + shift)
            output.write(encryption)

ファイルを読み取る

まずはファイルの読み取りです。
コードだと以下の部分に該当します。

textdata = open(inputpass)
lines = textdata.readlines()
textdata.close()

ここではinputpassに格納されているパスを指定し、open()によって開かれたデータをtextdataに格納しています。
その後、readlines()で1行ずつに分けてからcloseによってファイルを閉じています。

とりあえずこのステップでは、指定したファイルの中身を読み取る処理を行っています。

文字をシフトする

次に文字のシフトです。
コードだと以下の部分に該当します。

encryption = ''

    for data in lines:
        for f in data:
            encryption = chr(ord(f) + shift)

ここでは、先ほど1行ずつに分けた文字列をさらに細かく分け1文字ずつシフトしていきます。
ord()によって文字を数値に変換し、それにshiftの値を足すことで文字をずらしています。
そしてchr()によって加算された数値を文字列に変換することで文字の変換(シフト)を行っています。

とりあえずこのステップでは、文字のシフトを行う処理を行っています。

ファイルに書き込む

最後にファイルの書き込みです。
コードだと以下の部分に該当します。

with open (outputname, 'x') as output:

        output.write(encryption)

書き込みに関してはこの行だけになります。
先ほどの文字のシフトにて暗号化した文字列変数「encryption」をoutputnameに入っている名前のファイルを新規作成し、そこに格納しています。

とりあえずこのステップでは、ファイルに書き込む処理を行っています。

復号

復号するといってもシーザー暗号の復号はかなり簡単で暗号化でシフトした文字数と同じ文字数分逆にシフトすればいいので、「文字をシフトする」の中にある

encryption = chr(ord(f) + shift)

encryption = chr(ord(f) - shift)

にすれば実装可能になります。

まとめ

今回はシーザー暗号の実装について説明してきました。
shiftのところを乱数を用いたりすることで若干解読しにくいプログラムを作成できるのでぜひ試してみてください!

テーマ

現在使用中テーマは最新版

v.1.0v.2.0v.3.0v.3.1v.3.2v.3.3v.3.4v.3.5v.3.6v.3.7v.3.8v.shaneron選択しない(安定版)