エニグマ暗号機シミュレーター - マルチ言語実装で学ぶ暗号技術

こんにちは!MixedNutsのtukasaです!

エニグマ暗号機シミュレーター - マルチ言語実装で学ぶ暗号技術

第二次世界大戦で使用されたドイツの暗号機「エニグマ」のシミュレーターを、PythonJavaC++の3言語で実装しました。Alan Turingが開発した暗号解読機「Bombe」の攻撃機能も含んでいます。

プロジェクト概要

このプロジェクトは、歴史的に重要な暗号機エニグマの動作原理を理解し、プログラミング学習に活用することを目的としています。

1. エニグマ暗号機シミュレーション
  • 8種類のローター(I-VIII)
  • 2種類のリフレクター(B, C)
  • プラグボード設定(最大10ペア)
  • リング設定(Ringstellung)
  • 歴史的に正確な暗号化アルゴリズム
2. Bombe攻撃ツール
  • 既知平文攻撃(クリブアタック)
  • 並列処理による高速総当たり攻撃
  • 全ローター順序の探索
  • 設定のエクスポート機能

言語別実装の特徴

特徴 Python Java C++
GUI Tkinter JavaFX ✅ Qt6/td
並列処理 multiprocessing ExecutorService OpenMP
配布形式 .exe (PyInstaller) .msi (Installer) Source code
用途 GUI アプリ クロスプラットフォーム 高速処理

クイックスタート

Python
cd python
python main.py
Java
cd java
mvn clean package
java -jar target/enigma-simulator-1.0.jar
C++
cd cpp
mkdir build && cd build
cmake .. && make
./EnigmaSimulatorCpp

技術的な実装詳細

エニグマの暗号化プロセス
  1. キー入力 → プラグボード → ローター(右→左) → リフレクター
  2. リフレクター → ローター(左→右) → プラグボード → 出力
  3. キー入力ごとにローターが回転(ダブルステッピング機構)
Bombe攻撃の原理

Bombeは既知の平文(クリブ)を使用して、可能なローター設定を総当たりで試行し、矛盾のない設定を見つけ出します。並列処理により、現代のコンピュータでは数秒〜数分で解読可能です。

学習ポイント

📝 使用例

暗号化の例:

  • 平文: HELLO WORLD
  • ローター: I, II, III
  • 初期位置: A, A, A
  • リフレクター: B
  • 結果: MFNCZBBFZM

今後の展望(気力次第)

  • 4ローター版(海軍仕様)の実装
  • Enigma M4モデルの追加
  • WebAssembly版の開発
  • 暗号解読の可視化機能

貢献について

プルリクエストを歓迎します!バグ報告や機能提案はIssuesまでお願いします。

参考文献


⚠️ 注意: このソフトウェアは教育や学習目的のみに使用してください。実際の機密情報の暗号化には使用しないでください。

GitHubで見る

Windows環境でのSSH接続

通常、業務レベルであればサーバはLinux系のOSを使用する事が多いですが、私が趣味で構築しているサーバはWindows 10であるため、SSH接続の際に少しハマった点があったので備忘録として残しておきます。

概要

Windows機のサーバに対して開発を行っている際、RDP接続が面倒くさいからSSH接続してVSCode上で開発したり、WinSCPでファイルのやり取りをしたい!

というのが動機です。

SSH用のキーペア作成

Windowsの場合、OpenSSH機能を使ってキーペアを作成できます。

ここでは「id_rsa」という秘密鍵と、「id_rsa.pub」という公開鍵を作成する例を記載します。

まず、cmdPowerShell で以下のコマンドを実行します。パラメータは全て空のままで構いません。

ssh-keygen

実行すると以下のような出力が表示され、キーペアが C:\Users\YourUser\.ssh に作成されます:

Generating public/private rsa key pair.
Enter file in which to save the key (//.ssh/id_rsa): c:/Users/YourUser/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in c:/Users/YourUser/.ssh/id_rsa.
Your public key has been saved in c:/Users/YourUser/.ssh/id_rsa.pub.

生成された id_rsa秘密鍵)はクライアント側に保管し、id_rsa.pub(公開鍵)はサーバ機に登録します。
秘密鍵は絶対に他人に渡さないよう注意してください。

クライアント側の登録(ssh-agentへの追加)

以下の手順でssh-agentに秘密鍵を登録します:

  1. PowerShell もしくは cmd を「管理者として実行」します
  2. ssh-agentサービスを起動します
# サービスの起動
Start-Service ssh-agent
  1. 秘密鍵ssh-agentに追加します
ssh-add $env:USERPROFILE\.ssh\id_rsa

エラーが出なければ登録成功です。これにより、VSCodeWinSCPなどのツールで秘密鍵が自動的に使用されるようになります。

ホスト側の登録

まずRDPなどでWindowsサーバにログインし、以下の手順でOpenSSHサーバをインストールします。

  1. [設定] → [アプリと機能] → [オプション機能の管理] を開く
  2. 「OpenSSH サーバ」を探してインストールする

インストール後、以下の手順でサービスを起動します:

# PowerShell(管理者権限)で実行
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'

これで、Windows起動時にOpenSSHサーバが自動起動するようになります。

次に、C:\Users\YourUser\.ssh フォルダを作成し、その中にクライアント側で作成した id_rsa.pub をコピーしてください。
コピー後、ファイル名を authorized_keys に変更します。

ハマりポイント:sshd_configの設定とauthorized_keysの認識

上記操作でSSH接続できるものと思いきや、実は追加の設定が必要です。

  1. C:\ProgramData\ssh\sshd_config をエディタ(メモ帳など)で開く
  2. 以下の項目を変更または追記
PubkeyAuthentication yes
PasswordAuthentication no

保存後、以下の操作を行います:

  1. C:\Users\YourUser\.ssh\authorized_keys
  2. C:\ProgramData\ssh\administrators_authorized_keys にコピーまたはリネーム

この操作が必要になるのは、接続対象ユーザーがAdministratorsグループに所属している場合です。通常ユーザーの場合は、.ssh/authorized_keys のみで認識されることもあります。

これで、正常にSSH接続できるようになるはずです。

INFINITASのライトニングモデル対応立ち環境ガイド

概要とか

全にでらーが思う事。それはできるだけライトニングモデルに合わせた環境を作り、ゲーセンとの差異を少なくしたい。
今回は私が構築した立ち環境について解説していきたい思います。

あることが前提の物

  • INFINITASが動くPC
  • 専コン
  • 電動工具
  • 手回し工具
  • 下地チェッカー
  • 水平器
  • できれば友達や家族など手伝ってくれる人(一人)
  • 気合

今回使用した製品

位置決め・下穴あけ

まず穴あけの位置決めをしなければなりません。
うちの場合在来工法ですので、455mm間隔で間柱が立っています。下地チェッカーで間柱の位置を特定してください。

間柱にビスを打ち込まないと全く強度が足りず落下の危険があります。
特定出来たら、私と全く同じ製品を使う場合、大体床から1450mmの位置に上の下穴をあければちょうどいい感じになるかとは思いますが、ここは現物合わせで行ったほうが無難です。

モニターの下部が地面から112.5cmくらいになるようにすると、判定ラインが地面から131cm前後になるかと思われます。
また、水平器で水平を取ってください。

私の場合、ビス4本止めでは不安だったのでツーバイ材を挟んでいます。

モニター設置前の壁面

本止め・テレビ設置

下穴の位置が決まったら壁掛け金具を設置します。
これが8kg以上あり、一人だとかなり厳しいので二人で作業する事をおすすめします。

この時も水平が出ているかしっかり確認してください。

金具が取り付けられたらテレビを取り付けます。REGZA 43Z570Kは裏面に突起があるため、付属の黒いスペーサーを使用して取り付けてください。

壁掛け金具とスペーサー

突き出し・左右調整

テレビを取り付けたら左右を環境に合わせて調整してください。
レールが長いので自由度は高いです。

また、突き出し位置も調整できますので、コントローラの白鍵の上面がモニターから56cmの距離になるようにセッティングするとACに近いと思います。

完成設置画像

おまけ・INFINITASで4枚目のモニターに出力する方法

グラボを使用していて既に3つのポートが埋まっている場合、4つ目のポートにモニターをつなぐかと思いますが、INFINITASは標準で4つ目のモニターを指定できません。

しかし、4つ目のモニターを指定する裏技があります。

  1. INFINITASをインストールしたディレクトリを開きます。
  2. Resource\config フォルダ内の 1001_cf.xml をメモ帳などで開きます。
  3. 以下の箇所を探します。
<Parameters>
  <KeyValuePair>
    <Key>
      <string>DisplaySettings</string>
    </Key>
    <Value>
      <string>0</string>
    </Value>
  </KeyValuePair>
</Parameters>

この中の <string>0</string> の数字を「3」に変更して保存してください。

(公式OPで1枚目を指定している場合は0、2枚目は1、3枚目は2となります)

これだけで4つ目のモニターにINFINITASが起動するようになります。

Vue + Flask + SQliteを使用したWebベースのファイル共有システム構築

こんにちは!MixedNutsのつかさです!

本日は、タイトルの通りユーザー登録制ファイル共有システムを構築した際の備忘録として、主にWebシステム構築初心者の方向けに紹介します。

📌 システム概要

このシステムは、Webブラウザ上からログインし、登録ユーザー同士でファイルをアップロード・ダウンロード・プレビューできるアプリケーションです。

  • 使用OS:Windows 10(サーバ側)
  • フロントエンド:Vue.js
  • バックエンド:Flask(Python
  • データベース:SQLite

主な機能は以下のとおりです:

  1. ユーザー登録・認証機能(今回は簡易的に管理者がDBを直接流し込む事とし、登録フォームなどを設けない)
  2. フォルダ作成 / ファイルアップロード・ダウンロード機能
  3. 画像・音声・動画・PDF・Excel・テキスト・Markdown のプレビュー表示
  4. ファイル/フォルダの移動・削除・リネーム
  5. 管理者によるお知らせ(アップデート情報)の管理

🔧 準備編

1. Python のインストール

以下のURLから Python の最新版をダウンロード・インストールしてください:

https://www.python.org/downloads/

2. Node.js と npm のインストール

以下のURLから Node.js の最新版をインストールしてください:

https://nodejs.org/ja/

インストール後、コマンドプロンプトで次のコマンドを実行し、バージョンが表示されれば成功です:

node --version
npm --version

3. Git のインストール(任意)

Git を使ってソースコードをクローンする場合は、以下からインストールします:

https://git-scm.com/downloads

📌 セットアップ手順

1. リポジトリをクローン

以下のGitHubリポジトリにて、ソースコードを公開しています:

https://github.com/MixedNuts-Dev/File-Sharing-System-MixedNuts

クローンコマンド:

git clone https://github.com/MixedNuts-Dev/File-Sharing-System-MixedNuts.git

2. Python側のセットアップ

cd File-Sharing-System-MixedNuts/backend pip install -r requirements.txt python app.py

※ 仮想環境を使用せず、システムにインストールされた Python 環境で直接実行しています。
もし `pip` や `python` のコマンドでエラーが出る場合は、pip3python3 をお試しください。

3. フロントエンド(Vue.js)側のセットアップ

cd ../frontend
npm install
npm run build

4. SQLiteとDBの準備

必要に応じて以下のSQLでユーザーを追加してください。以下はユーザ追加用のクエリサンプルです。:

INSERT INTO user (username, password, role) 
VALUES ('admin', 'admin_password', 'admin');

DBカラムの意味

User テーブル

  • id: ユーザー識別用の自動採番整数
  • username: ログイン名
  • password: ハッシュ化済パスワード
  • role: 権限(user または admin)

SystemUpdate テーブル

  • id: ID
  • content: アップデート内容
  • created_at: 作成日(自動設定)

5. アップロードフォルダの指定

ファイル保存先は UPLOAD_FOLDER に指定します:

UPLOAD_DIR = r"/path/to/upload"
os.makedirs(UPLOAD_DIR, exist_ok=True)

6. SSL証明書の設定

HTTPS通信のためにSSL証明書(Let's Encryptなど)を取得し、Flask実行時に指定します:

app.run(..., ssl_context=(
  '/path/to/fullchain.pem',
  '/path/to/privkey.pem'
))

※パスは各自の環境に合わせて変更してください。

7. アプリ起動

python app.py

上記コマンドで 起動します。

🛡️ セキュリティと補足技術

パスワードのハッシュ化

ユーザーのパスワードは generate_password_hash() でハッシュ化されて保存されます。

from werkzeug.security import generate_password_hash, check_password_hash

ログイン時は check_password_hash() を使って照合します。

入力値のサニタイズ

フォルダ名やファイル名に不正な文字が含まれないように次のような関数で保護しています:

def sanitize_input(input_string):
    allowed_pattern = r'[^\w\s\-/ぁ-んァ-ヶ一-龠々ー]'
    sanitized = re.sub(allowed_pattern, '', input_string)
    if re.search(r'[<>:"\\|?*]', input_string):
        raise ValueError("Invalid characters in input")
    return sanitized.strip()

📌 完成イメージ

ログイン後、ファイル一覧・アップロード・プレビュー機能などが使えるようになります。以下は簡易的な完成画面の例です:

💬 最後に

このシステムはあくまで自己学習目的で構築したもので、セキュリティ面については基本的な制御はしていますが、利用の際に発生した問題については一切の責任を負いません。十分にご留意ください。

githubに挙げているソースコードは、煮るなり焼くなり好きにしていただいて結構です。

こういう機能あれば便利じゃね?みたいなアイデアあれば是非適宜ブランチ切ってPR出していただければ確認させていただきます!

私自身は、このシステムをかなりカスタムして仲間内で使用していますので、機会があればカスタム内容も紹介したいと思います。

次回は証明書の自動更新とかの記事でも書こうかな?