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

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型)をずらしていき、暗号文を表示します。但し、句の区切り文字として、半角スペースとカンマはそのままにしています。

実行結果

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

Nia-TN-SDfs-panic.png
「ずゅ」とか、どう読めと・・・

※「初」(文字コード:0x521D)を3文字分ずらした文字は「删」(文字コード:0x5220)でした。

こちらに、paiza.IOで作成したプログラムのブログパーツを埋め込みました。

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

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

[END]

コメント

タイトルとURLをコピーしました