俳句をシーザー暗号化するプログラムを作ってみました

Nia-TN-SDF-A2

こんにちはー!ニアです。

今まで、ミョウガさんとともに俳句を縦書きに表示するプログラムをいくつか作りましたが、

今回は私が所属している研究室の研究分野に関連して、俳句をシーザー暗号化してしまうプログラムを作成してみました。

1. シーザー暗号とは

暗号といってもいろいろ種類がありますが、ここでは古代ローマの軍事的指導者ガイウス・ユリエル・カエサルさんが使用していたシーザー暗号(Caesar cipher)を使用していきます。

シーザー暗号とは換字式暗号の1つであり、平文の各文字を辞書順(コンピューター上では、文字コードの順)に3文字ずつずらしていく暗号方式です。ずらす文字数は3以外でもよく、例えば13文字ずつずらすROT13などがあります。

暗号文から平文へ復号するには、ずらした文字数分だけ逆方向にずらせばOKです。

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

int _tmain( int argc, _TCHAR* argv[] ) {

	string p, e, d;

	cout << "平文 :";
	cin >> p;

	// 平文をシーザー暗号化します。
	for( string::iterator i = p.begin(); i != p.end(); i++ )
		e += *i + 3;
	cout << "暗号文:" << e << endl;

	// 暗号文から平文に復号します。
	for( string::iterator i = e.begin(); i != e.end(); i++ )
		d += *i - 3;
	cout << "復号文:" << d << endl;

	return 0;
}

プログラムの動作としては 、文字列をイテレーターで1文字ずつ取り出して(取り出した文字はchar型です)、暗号化・復号しています。

実行結果

実行結果

2. F#で俳句をシーザー暗号化してみました

お次は、F#で俳句を暗号化するプログラムを作っていきます(C++の標準入力では半角スペースの扱いがちょっと煩わしいので・・・)。

[<EntryPoint>]
let main argv = 

    // 入力した俳句をシーザー暗号化します。
    // 但し、区切り文字として、半角スペースとカンマはそのままにします。
    printf "平文 :"
    System.Console.ReadLine()
    |> String.map( fun c -> if c = ',' || c = ' ' then c else c + char( 3 ) )
    |> printfn "暗号文:%s"

    0

※GitHubではこちらです →  https://gist.github.com/Nia-TN1012/3892f08bb0641bcb09d4

動作としては、コンソール画面から入力した俳句をString.map関数で各文字(char型)をずらしていき、暗号文を表示します。但し、句の区切り文字として、半角スペースとカンマはそのままにしています。

実行結果

松尾芭蕉さんの「初桜折しも今日はよき日なり」をシーザー暗号化すると、「删桟抛ず・・・ゅ・・・」

「ずゅ」とか、どう読めと・・・w

※「初」(文字コード:0x521D)を3文字分ずらした文字は「删」(文字コード:0x5220)であることが分かりました。

こちらに、paiza.IOで作成したプログラムのブログパーツを埋め込みましたので、実際に実行したい方は試してみましょう。

入力欄に俳句(カンマ区切り)を入力して実行ボタンをクリックすると、暗号化した文字列が出力されます。

色々な俳句をシーザー暗号化したら、面白い文字列が出てくるかも。

それでは、See you next!

更新履歴

  • 2015/03/12:実行結果の俳句にミスがありましたので、正しい俳句に修正しました。
  • 2015/05/20:paiza.IOのブログパーツ機能を使って、プログラムを記事に埋め込みました。
この記事をシェアする
Chronoir.netのRSSフィードを購読する

ニア(Nia)

サーバー・フロント・DB・インフラ(クラウド)エンジニア(目指すはフルスタック)。主にC#/PHPを使っています。最近はDockerやWebアプリ、モバイルアプリ開発(Xamarin)を探求中。好物は紅茶とコーヒー、シラス丼、趣味は写真撮影と音ゲーです

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください