#!/bin/bash echo 任意の暗号鍵a=? #aに代入する値を入力するように求める文章を出力する read a #キーボードで入力した値をaとして読み込む if [[ $a = 2 || $a = 13 || $a = 26 ]] then #暗号鍵α(ここでは入力したaのこと)が26と素でないときについて echo 異なる値を入力せよ. exit #"異なる値を入力せよ."と出力し、処理を終了させる fi #if文を閉じる echo 任意の暗号鍵b=? #同様にしてbについても行う read b echo 6文字の暗号を1文字ずつ入力せよ echo {a..z} | sed "s/ /\n/g" > alpha_2.csv #a~zを縦1列に並べたものを"alpha_2.csv"として保存する for ((i=0;i<6;i++)) #暗号6文字分の繰り返しを行う do echo F=? read F #暗号1文字ずつに対する質問の出力とキーボードによる入力をする echo $F > alpha_3_$i.csv #入力した1文字だけが入ったファイルを6文字分作成する grep -f alpha_3_$i.csv -n alpha_2.csv | cut -d ':' -f1 > alpha_4_$i.csv #このファイル内のアルファベットが先に作成した"alpha_2.csv"内のアルファベットと一致した時、それが何行目にあたるか行番号のみを出力し、保存する. if [[ $F = "" ]] #Fへ何も入力せず文字数不足となったときについて then echo 文字を入力せよ.やり直し. exit #"文字を入力せよ.やり直し."と出力し、処理を終了させる fi #if文を閉じる done gawk '{print $1 - 1;}' alpha_4_*.csv > alpha_5_*.csv #"a"=>0,"b"=>1と変換されるように実際の行番号から1を引き、保存する. cat alpha_5_*.csv > array.csv #6文字分のファイルを1つにまとめる. #以上で入力した6文字のアルファベットが数値に変換される VAR=`cat array.csv` array=($VAR) #数値へ変換されたものを配列とする echo {a..z} | sed "s/ //g" > alpha.csv #a~zをスペースを無くして並べ、"alpha.csv"として保存する for i in "${array[@]}" #配列の要素において繰り返し処理を開始する do for c in {0..25} #変数cが0~25の範囲で繰り返し処理を行う do j=$((($a*$c+$b) % 26)) #入力した任意の暗号鍵a,bをF(c)=j=(a*c+b)mod 26に代入する。このときjは0≦c≦25で繰り返したときの(a*c+b)を26で割った余りである。 if [ $i = $j ] #配列の要素と、(a*c+b)を26で割ったときの余りが等しいときについて then d=`expr $c + 1` #0=>"a"であるが、"alpha.csv"ファイルでは1列目にa、すなはち1=>aとなっているので1つずらすためにcに1を足し、それを変数dとおく。 cut -c"$d" alpha.csv | tr '\n' ' ' | sed "s/ //g" #そのときのcの数字を出力し、"tr"で改行をスペースに変換、"sed"で文字間のスペースを無くし、結果を1行で出力する.以上で複号することができた. fi #if文を閉じる done #変数cの繰り返しを閉じる done #配列の繰り返しを閉じる echo \ #最後に改行する rm alpha_*.csv #スクリプトの実行によって生成されたファイルを削除する.プログラムは以上である.