難問克服 解いてわかるガロア理論(藤田岳彦 著)という書籍に
アフィン暗号とその復号の問題が載っていたので、
コードを書いてみました。
Ruby
require 'OpenSSL' @ary = ('A'..'Z').to_a # y = a * x + b def affine(a, b, str) (0..str.size - 1).each{|i| str[i] = @ary[(a * @ary.index(str[i]) + b) % 26]} str end # y = a^(-1) * (x - b) def decode(a, b, str) (0..str.size - 1).each{|i| str[i] = @ary[OpenSSL::BN.new("#{a}").mod_inverse(26).to_i * (@ary.index(str[i]) - b) % 26]} str end p affine(5, 11, 'LIFEISGOOD') p decode(5, 11, 'OZKFZXPDDA') p decode(5, 11, 'CUFTDDY') p affine(5, 11, 'THEMOON')
シーザー暗号の場合は
trで置き換えるのも簡単に書けたのですが、
アフィン暗号の場合は
うまく置き換えができなかったので、上記のようになってしまいました。
アフィン暗号およびその復号をもっと簡単に書く方法はないのでしょうか?
まだ回答がついていません
会員登録して回答してみよう