質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

アフィン暗号とその復号について

manman
manman

総合スコア233

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1回答

0グッド

1クリップ

2517閲覧

投稿2015/08/29 08:47

編集2015/08/29 08:51

難問克服 解いてわかるガロア理論(藤田岳彦 著)という書籍に
アフィン暗号とその復号の問題が載っていたので、
コードを書いてみました。

Ruby

1require 'OpenSSL' 2 3@ary = ('A'..'Z').to_a 4 5# y = a * x + b 6def affine(a, b, str) 7 (0..str.size - 1).each{|i| str[i] = @ary[(a * @ary.index(str[i]) + b) % 26]} 8 str 9end 10 11# y = a^(-1) * (x - b) 12def decode(a, b, str) 13 (0..str.size - 1).each{|i| str[i] = @ary[OpenSSL::BN.new("#{a}").mod_inverse(26).to_i * (@ary.index(str[i]) - b) % 26]} 14 str 15end 16 17p affine(5, 11, 'LIFEISGOOD') 18p decode(5, 11, 'OZKFZXPDDA') 19 20p decode(5, 11, 'CUFTDDY') 21p affine(5, 11, 'THEMOON')

シーザー暗号の場合は
trで置き換えるのも簡単に書けたのですが、
アフィン暗号の場合は
うまく置き換えができなかったので、上記のようになってしまいました。
アフィン暗号およびその復号をもっと簡単に書く方法はないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

自己解決

次のコードの方が簡単だし、strの文字数が増えても逐一計算しなくても良さそう。

Ruby

1@ary = ('A'..'Z').to_a 2 3# y = a * x + b 4def affine(a, b, str) 5 h = {} 6 (0..25).each{|i| h[@ary[i]] = @ary[(a * i + b) % 26]} 7 (0..str.size - 1).each{|i| str[i] = h[str[i]]} 8 str 9end 10 11def decode(a, b, str) 12 g = {} 13 (0..25).each{|i| g[@ary[(a * i + b) % 26]] = @ary[i]} 14 (0..str.size - 1).each{|i| str[i] = g[str[i]]} 15 str 16end 17 18p affine(5, 11, 'LIFEISGOOD') 19p decode(5, 11, 'OZKFZXPDDA') 20 21p decode(5, 11, 'CUFTDDY') 22p affine(5, 11, 'THEMOON')

投稿2015/08/30 00:40

manman

総合スコア233

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。