1
1

More than 3 years have passed since last update.

シーザー暗号を噛み砕く

Last updated at Posted at 2020-05-22

近況報告

 最近は就活(企業にひたすらESを送るだけの作業)ばっかで空いている時間にテックキャンプのドリルをしこしこ解いています。githubの草は生やし続ける。今日受けた企業さん,無事通っているといいな。

本題 シーザー暗号

 辞書順に3文字分シフトして暗号文を作る暗号
  ex. abc ⇨ cde

 シーザーというのは高校世界史を履修していたら知らない人はいないあのシーザー,カエサルさんのことを指します。ガリア戦記とか,「ブルートゥスお前もか」とかかなりの人が認知しているのではないのでしょうか。

 昔はパソコンもケータイもないアナログの時代,かろうじてエジプト文明がパピルスとか発明していたので文字を記録する文明はあったでしょう。ただ,文書の輸送手段は人の足です。となれば機密文書が道中で奪われてそれが原因で亡国の危機に晒されることは度々あったでしょう。

 カエサルは重要な情報の漏洩を防ぐためにこのような暗号を用いました。ちなみに甥のアウグストゥスも用いていたとか。なお,現代におけるシーザー暗号はセキュリティの観点からは非常に脆弱であることは認識しておきましょう。

パソコン上でのおおまかな方法

1.文字列を文字コードに変える
2.文字コードに任意の数を足す(引く)
3.文字コードを文字列に変更する

サンプル シーザー暗号の生成解読メソッド

前後させる数の大きさは任意です。

def cipherAction
  result = [] ←配列の箱用意
  puts "暗号化したい文字は?"
  x = gets.to_s ←str型で定義
  x.chars.each do |i| ←文字列を1文字単位で分解
    code = (i.ord + 3) ←ordは文字コードに変換するメソッド
    result << code.chr ←継承
  end
    puts result.join("") ←1文字単位で格納されているのを文字列に整える
end

def deciperAction
  result = []
  puts "元に戻したい文字は?"
  y = gets.to_s
  y.chars.each do |j|
    code = (j.ord - 3)
    result << code.chr
  end
  puts result.join("")
end

puts "Select Action"
puts "1:暗号化"
puts "2:元に戻す"
input = gets.to_i
if input == 1
  cipherAction
elsif input == 2
  deciperAction
else
  puts "不正な入力です"
  exit
end

おわりに

安直ではありますが,暗号化された分は何文字前後しているか分からないので解読は手間(まあパソコン使えばサクッとできますが)ですので日常レベルではまあつかえますね。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1