#!/bin/bash echo a=? read a m=$(( $a % 2 )) n=$(( $a % 13 )) while [ $m = 0 ] || [ $n = 0 ] || [ $a -le 0 ] do echo "aは26と互いに素な正の数を入力してください。" echo a=? read a m=$(( $a % 2 )) n=$(( $a % 13 )) done echo b=? read b #暗号鍵であるaとbを読み込む。ただし、aが26と互いに素で、正の数でなければ繰り返し入力する。 (mはaを2で割った余り、nはaを13で割った余りとしてmかnが0のとき、もしくはaが0以下のとき繰り返しaを入力する) declare -a array for i in {a..z} do array+=( "$i" ) done #要素数が26個で、その各要素がa~zの配列を定義する。 echo ${array[@]} | sed "s/ /\n/g" > file1.txt #配列の0~25番目の各要素を1~26行目に反映した「file1.txt」を作成する。 echo f=? read f echo -n $f > word.txt w=`wc -c word.txt | cut -c 1-1` while [ $w -ne 6 ] do echo "fには6文字入力してください。" echo f=? read f echo -n $f > word.txt w=`wc -c word.txt | cut -c 1-1` done #暗号化された文字列を読み込む。ただし、fが6文字でなければ6文字になるまで繰り返し入力する。 for ((l=1;l<7;l++)) do echo $f | cut -c $l-$l > file.txt grep -f file.txt -n file1.txt | cut -f 1 -d ":" >> file2.txt done #読み込んだ文字列の文字を左側から順に「file.txt」に出力し、「file1.txt」の行番号として「file2.txt」に追記する。 for g in `cat file2.txt` #gに「file2.txt」の中の数字を代入する。 do for c in {1..25} do if [ 1 -eq $(( ($a * $c) % 26 )) ] then x=$(( ($c * ($g - 1) - $c * $b) % 26 )) if [ $x -lt 0 ] then y=$(( $x + 26 )) echo -n ${array[$y]} >> file3.txt else echo -n ${array[$x]} >> file3.txt fi fi done done #「file2.txt」の中の数字を「-1」した数字と、先程読み込んだ暗号鍵a、bを用いてアフィン暗号を復号し、結果を「file3.txt」に書き込む。(ただし、剰余算で負の数が出てきたときは+26し、正の数に変換する) echo z= `cat file3.txt` #「file3.txt」には各文字の復号結果が各行に書き込まれているため、echoコマンドで復号結果を1列に示す。(z= に続く文字列が復号結果) rm file.txt rm file1.txt rm file2.txt rm file3.txt rm word.txt #「file.txt」〜「file3.txt」と「word.txt」をディレクトリから削除する。