Pythonの文字列を暗号化・復号化する方法!基本的な文字コード変換を解説
生徒
「Pythonで文字列を暗号化するってどういうことですか?よく聞くけど、意味が分からなくて……」
先生
「暗号化とは、簡単に言えば読める文字を読めないように変えることです。そして、復号化というのはその逆で、元の文字に戻すことです。」
生徒
「なるほど!それってPythonでもできるんですか?」
先生
「もちろんできますよ!まずは文字列の暗号化と復号化の基本から順番に見ていきましょう。」
1. Pythonで文字列を暗号化・復号化するとは?
暗号化(あんごうか)とは、読める文章を読めないようにわざと変えることです。たとえば、「Hello」という文字列をそのまま画面に表示すると、誰にでも読めますよね。でも、これを別の文字に変えると意味が分からなくなります。これが暗号化です。
そして、復号化(ふくごうか)は、暗号化された文字列を元の「Hello」のように戻すことです。
Pythonでは、文字コードというしくみを使って、文字列を数字に変換したり、また文字に戻したりできます。このしくみを使うことで、簡単な暗号化・復号化ができます。
2. 文字コードとは?暗号化の基本を理解しよう
文字コードとは、パソコンが文字を数字で表すためのルールです。たとえば、「A」は数字の「65」で、「a」は「97」という番号になります。
この数字は「Unicode(ユニコード)」という共通ルールで決められています。Pythonでは、ord()という関数を使うと文字を数字に変換できます。そして、chr()を使えば数字を文字に戻せます。
この2つの関数を使えば、暗号のように文字をずらして別の文字に変えられるのです。
3. 文字列を暗号化してみよう(シーザー暗号)
「シーザー暗号」というのは、文字を一定の数だけずらして別の文字にする方法です。たとえば、「A」を3つ後の「D」に変える、という具合です。
それでは、Pythonでこの暗号を作ってみましょう。
def encrypt(text, shift):
result = ""
for char in text:
if char.isalpha():
base = ord('A') if char.isupper() else ord('a')
result += chr((ord(char) - base + shift) % 26 + base)
else:
result += char
return result
message = "Hello, World!"
shift_value = 3
encrypted = encrypt(message, shift_value)
print(encrypted)
このコードでは、「Hello, World!」という文字列を3文字ずらして暗号化しています。
Khoor, Zruog!
4. 暗号化された文字列を復号化してみよう
次は、暗号化された文字列を元に戻してみましょう。復号化とは、シフトさせた分だけ逆に戻すだけです。
def decrypt(text, shift):
return encrypt(text, -shift)
decrypted = decrypt(encrypted, shift_value)
print(decrypted)
Hello, World!
このようにして、暗号化した文字を元に戻すことができます。
5. 日本語や記号はどうなるの?
ここまで英語のアルファベットで説明しましたが、日本語(ひらがな・カタカナ・漢字)や記号などは少し特殊です。シーザー暗号はアルファベットにしか使えません。
日本語などを暗号化したいときは、もっと高度な方法が必要になりますが、まずは英語の文字で練習するのが基本です。
6. Base64での暗号化も体験しよう(簡易な方法)
base64という仕組みを使うと、文字列を別の形に変換して読めないようにすることができます。これは、完全なセキュリティ目的ではありませんが、簡単な隠し方として便利です。
import base64
text = "Hello, World!"
encoded = base64.b64encode(text.encode("utf-8"))
print(encoded)
b'SGVsbG8sIFdvcmxkIQ=='
これは「Hello, World!」がbase64で変換されたものです。次に元に戻してみましょう。
decoded = base64.b64decode(encoded).decode("utf-8")
print(decoded)
Hello, World!
このようにして、base64を使えば簡単に文字列を変換・復元することができます。
7. なぜ暗号化するの?
暗号化は、パスワードや個人情報を守るために使われます。インターネットでデータを送るとき、内容がそのままだと他の人に見られてしまいます。暗号化しておけば、安全にやりとりができるのです。
今回のような簡単な暗号化は学習用ですが、実際のシステムではもっと強力な方法が使われています。
まとめ
Pythonで文字列を暗号化したり、復号化したりするしくみは、一見むずかしそうに感じられますが、実は仕組みをひとつずつ理解していけば、とても身近で応用の幅が広い技術です。今回の記事では、文字コードの基本、暗号化の考え方、シーザー暗号の仕組み、さらにBase64のような手軽な文字列変換の例まで、一連の流れをていねいに追いながら学んできました。
暗号化とは、読める文字を人に読めないように変えることでした。そして復号化は、その変えた文字を元の姿に戻す作業です。Pythonでは、ひとつひとつの文字に対応する番号を持つ「文字コード」が基礎となり、ord()で文字を数字にし、chr()で数字を文字に戻すという作業を組み合わせることで、さまざまな仕組みを自分でつくり上げることができます。
さらに記事では、アルファベットを決められた数だけずらして暗号化する「シーザー暗号」を例にしましたが、この仕組みは古くから使われてきたもっとも基本的な暗号のひとつです。Pythonで書くと数行のコードでも、暗号化の本質である「規則にもとづいて別の形にする」という考え方を体験することができます。条件分岐やループなどの基本構文も自然に使えるため、プログラミングの練習としても最適です。
また、文字列を別の表記に変換するBase64も登場しました。これはセキュリティ目的の強固な暗号というより、「読めない形に変えておく」ための簡易的な変換方式で、データを扱ったりファイルを扱ったりするときによく使われます。Pythonではbase64モジュールを読み込むだけで使えるため、初心者の学習にも最適な機能です。
ここでは、まとめとして今回学んだ内容を振り返りつつ、小さな追加サンプルも紹介します。実際に書いてみることで暗号化と復号化の流れがより理解しやすくなるでしょう。
追加サンプル:文字列の暗号化と復号化の練習コード
# 文字をひとつずつ任意の数だけずらす簡単な暗号化
def simple_encrypt(text, shift):
encrypted = ""
for char in text:
code = ord(char)
encrypted += chr(code + shift)
return encrypted
# 逆方向にずらして復号化する
def simple_decrypt(text, shift):
decrypted = ""
for char in text:
code = ord(char)
decrypted += chr(code - shift)
return decrypted
message = "SecretMessage"
shift_value = 2
enc = simple_encrypt(message, shift_value)
dec = simple_decrypt(enc, shift_value)
print(enc)
print(dec)
暗号化された文字例:UgeetvOguucig
復号化された文字例:SecretMessage
このサンプルは非常にシンプルですが、「文字コードをずらして別の文字をつくる」という暗号化の本質に触れることができ、理解を深めるのに役立ちます。アルファベットだけでなく、記号や数字が混ざった文字列でも動くため、実験しながら挙動を確かめていくことで、Pythonでの文字列处理に対する理解が自然と深まります。
暗号化という言葉を聞くと難解な技術のように思われがちですが、Pythonでは基本的な道具がそろっているため、仕組みそのものを感覚的に学びやすいのが大きな魅力です。実際のシステムではより複雑で高度な暗号化方式が使われますが、今回のように仕組みを知り、小さなサンプルを動かしながら理解を深めることが、今後の学習の大きな力になります。
文字列を安全に扱うことは、Pythonに限らず現代のプログラミングすべてで重要な要素になります。特に、パスワード、メッセージ、個人データなどを安全に扱う必要がある場面では、「暗号化して送る」「復号化して読む」という考え方は欠かせません。今回の記事で基本的な部分をしっかり理解できれば、これから学ぶより高度な暗号化技術にも自然とつながっていくでしょう。
生徒
「先生、文字コードのしくみが分かったおかげで、暗号化って思ったより身近な技術なんだと感じました!」
先生
「その気づきはとても大切ですね。文字を数字として扱えるようになると、Pythonでの表現の幅が一気に広がりますよ。」
生徒
「シーザー暗号みたいに、ずらすだけで別の文字になるのは面白かったです。復号化の考え方も分かりやすかったです。」
先生
「暗号化と復号化は表裏一体ですから、仕組みを理解すると一気に理解が深まりますね。練習すれば必ず身につきますよ。」
生徒
「Base64の変換も意外と簡単で驚きました!ログやデータを扱うときにも役に立ちそうですね。」
先生
「ええ、その通りです。用途に合わせて仕組みを使い分けられるようになると、Pythonでできることがどんどん増えていきますよ。」