#!/bin/bash echo a=? read a l=$(( $a % 2 )) m=$(( $a % 13 )) while [ $l = 0 ] || [$n = 0 ] || [ $a -le 0 ] do echo "aは26と素数である必要がある" echo a=? read a l=$(( $a % 2 )) m=$(( $a % 13 )) done #aを入力し、それが26と素でないときにエラーを表示する echo b=? read b #aとbを入力させる angou=() A=() A=("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z") #angouという箱とAという箱を作る echo F=? read F echo -n $F > word.txt Fc=`wc -c word.txt` while [ $Fc -ne 6 ] do echo "6文字を入力" echo F=? read F echo -n $F > word.txt Fc=`wc -c word.txt` done #Fに暗号解読したい文字を入力し、その文字数が6文字でないときには6文字入力するように命令 k=0 while [ $k -lt 10 ] do angou[$k]=${F:$k:1} k=$(($k+1)) done #入力した6つの文字列を1つずつの文字列に分ける i=0 j=0 tr=() #echo $F while [ $j -lt 10 ] do while [ $i -lt 26 ] do if [ "${angou[$j]}" = "${A[$i]}" ] ; then #echo "入ったよ" tr[$j]=$i fi i=$(($i+1)) done j=$(($j+1)) i=0 done #分けた文字をaを0番目として何番目か数える。先ほど作ったA箱と一致するかで順番を計算し、出している。 B=() B=( "2" "5" "8" "11" "14" "17" "20" "23" ) C=() C=( "0" "3" "6" "9" "12" "15" "18" "21" "24" ) c=0 d=0 mod=() while [ "${tr[$c]}" -lt 26 ] do if [ ${tr[$c]} = ${B} ] ; then mod[$d]=$((("${tr[$c]}"-"$b")/"$a")) elif [ ${tr[$c]} = ${C} ] ; then mod[$d]=$((("${tr[$c]}"-"$b"+26)/"$a")) else mod[$d]=$((("${tr[$c]}"-"$b"+52)/"$a")) fi c=$(($c+1)) d=$(($d+1)) done #アフィン暗号の暗号化のときの計算の仕方と逆のことをしている。 echo "${A[mod[0]]}" >> answer.txt echo "${A[mod[1]]}" >> answer.txt echo "${A[mod[2]]}" >> answer.txt echo "${A[mod[3]]}" >> answer.txt echo "${A[mod[4]]}" >> answer.txt echo "${A[mod[5]]}" >> answer.txt echo z = `cat answer.txt` rm answer.txt rm word.txt