4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

💌 好きな人としか見れない!QRコード × AES暗号で秘密の手紙を送る

Posted at

こんにちは。株式会社LiemPiaのtampopo256です。
普段は教育系のWebサービス「clemy」を作ったりしています。

📌 この記事でできること

  • 秘密のメッセージをAES暗号化
  • 暗号文をQRコード画像に変換
  • 好きな人にだけ復号できるラブレターを送る

🧠 背景:暗号化されたラブレターってロマンじゃない?

「好き」という気持ちは誰にでも言えるものじゃない。
でも、言葉だけだとちょっと恥ずかしい…。

そんなときに便利なのが、「暗号化されたQRコード」です。

  • 見た目はただのQR
  • でも中身は暗号文
  • しかも復号するには、ふたりだけが知っているパスワードが必要

感情 × 技術 = ロマン、そう思いませんか?

💡 技術構成

要素 使用技術
暗号方式 AES(CBC)
パスワード管理 PBKDF2で鍵導出
QRコード生成 qrcode ライブラリ
使用言語 Python 3.x

⚙️ 準備:必要なパッケージのインストール

pip install pycryptodome qrcode pillow

✏️ ステップ1:AESでメッセージを暗号化する

from Crypto.Cipher import AES
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Random import get_random_bytes
import base64
import json

def encrypt_message(message, password):
    salt = get_random_bytes(16)
    key = PBKDF2(password, salt, dkLen=32, count=100000)
    cipher = AES.new(key, AES.MODE_CBC)
    ct_bytes = cipher.encrypt(pad(message.encode(), AES.block_size))
    data = {
        "salt": base64.b64encode(salt).decode(),
        "iv": base64.b64encode(cipher.iv).decode(),
        "ciphertext": base64.b64encode(ct_bytes).decode()
    }
    return json.dumps(data)

padfrom Crypto.Util.Padding import pad を使ってください。

📷 ステップ2:QRコードとして保存する

import qrcode

def save_qr_code(data, filename="loveletter.png"):
    qr = qrcode.make(data)
    qr.save(filename)
    print(f"QRコードを保存しました: {filename}")

💌 ステップ3:暗号文をQRに変換して送信

if __name__ == "__main__":
    secret_message = "君の笑顔が好きです。"
    password = "2人だけのヒミツ"

    encrypted = encrypt_message(secret_message, password)
    save_qr_code(encrypted, "secret_love.png")

LINEやSlackでこのQR画像だけ送信すればOK!

🔓 復号方法(相手側)

復号コード(相手に送ってもよい):

from Crypto.Cipher import AES
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Util.Padding import unpad
import base64
import json

def decrypt_message(data_json, password):
    data = json.loads(data_json)
    salt = base64.b64decode(data['salt'])
    iv = base64.b64decode(data['iv'])
    ciphertext = base64.b64decode(data['ciphertext'])

    key = PBKDF2(password, salt, dkLen=32, count=100000)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)
    return plaintext.decode()

🧪 ヒントの渡し方(恋愛演出)

  • QRだけ送って「ヒントは“最初に出会った日のカフェの名前”だよ」
  • デート中に耳元で「パスワードは"その時のBGM"」とだけ伝える
  • 解けたら「正解!じゃあ、今度また会おうか」

告白の演出にも、プロポーズにも、記念日サプライズにも使えます

✅ 注意点(マジで実用したい人向け)

  • 相手がエンジニアでなくても、復号ページを用意すると親切(Flaskなどで簡単に)
  • QRコードに入る文字数は制限あり(暗号文を長くしすぎない)
  • 画像の圧縮劣化で読み取れない場合あり → PNG推奨

🏁 まとめ

  • AES暗号でふたりだけのメッセージを安全に共有
  • QRコード化すれば恥ずかしさゼロでラブレターを送れる
  • 技術で演出する、ちょっと特別な気持ちの伝え方

💬 最後に

「ただ“好き”って言うのが恥ずかしい」
でも、相手だけには伝えたい
そんなとき、ちょっとだけ技術を使ってみると、言葉以上に伝わるものがあるかもしれません。

「ヒントは“あの日の空の色”だよ」
そうやって伝える愛も、なかなかいいと思いませんか?

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?