この記事で得られる知識
Rubyで、入力された文字列をシーザー暗号で暗号化し、暗号化された文字列を復号するプログラムを作ってみました。
① シーザー暗号とは
② splitメソッドの使い方。
③ ordメソッド、chrメソッドの使い方。
④ joinメソッドの使い方。
シーザー暗号とは
決まった文字数分のアルファベットをシフトさせて作られる暗号。
例えば"study"という文字列を、シーザー暗号で前方に3つシフトさせて
暗号化すると"pqrav"という暗号文ができる。
シーザー番号 wikipedia
splitメソッド、ordメソッド、chrメソッド、joinメソッドを使って書いてみる
実装の流れは
1、入力された文字列を各文字に分割して配列に入れる。(splitメソッド)
2、配列に入れた各文字を暗号化する。(ordメドッド、chrメソッド)
3、暗号化され配列に入っている各文字を再び文字列に変換する。(joinメソッド)
となります。
ポイントは各文字には、文字コードという数字が与えられていることです。
qiita.rb
# 暗号化するためのメソッド
def encode(input)
# ①入力された値を一文字ずつに分解して配列に入れるためにsplit("")を使用します。
# もし文字列"study"が入力されていれば配列chars_arrの中身は[s,t,u,d,y]になっています。
chars_arr = input.split("")
# ②new_charsで、each文で処理された値を受け取るための空の配列[]を準備します。
new_chars = []
chars_arr.each do |char|
# ③ordメソッドを使い、各文字を文字コードに変換し、-3をすることで3つ手前の文字コードに変更します。
# ④chrメソッドを使い、3つ手前の文字コードに変更された値を、再び文字に戻します。③④で暗号化しています。
new_char = (char.ord - 3).chr
# ⑤暗号化された文字列を②で準備した空の配列に入れます。
new_chars << new_char
end
# ⑥暗号化され配列に入った各文字をjoinメソッドを使い、一つの文字列にしています。joinメソッドを使う前の
# 配列new_charsの中身は[p,q,r,a,v]となっています
puts new_chars.join
end
# 復号するためのメソッド 暗号化するためのメソッドと比べて
# new_char = (char.ord - 3).chr が new_char = (char.ord + 3).chrとなっているだけでそのほかは同じです。
def decode(input)
chars_arr = input.split("")
new_chars = []
chars_arr.each do |char|
new_char = (char.ord + 3).chr
new_chars << new_char
end
puts new_chars.join
end
while true do
puts "番号を入力してください"
puts "0: 文字列をシーザー番号(-3)で暗号化する"
puts " ※使用できる文字列はa~zの小文字"
puts "1: シーザー暗号(-3)で暗号化された英字文字列を復号する"
puts " ※使用できる文字列はa~zの小文字"
puts "2: 終了する"
case gets.to_i
when 0
puts "シーザー暗号(+3)で暗号化したい文字列を入力してください"
input = gets.chomp
encode(input)
when 1
puts "復号したい文字列を入力してください"
input = gets.chomp
decode(input)
when 2
exit
else
puts '無効な値です'
end
end
ターミナルでの出力
番号を入力してください
0: 文字列をシーザー番号(-3)で暗号化する
※使用できる文字列はa~zの小文字
1: シーザー暗号(-3)で暗号化された英字文字列を復号する
※使用できる文字列はa~zの小文字
2: 終了する
0
シーザー暗号(-3)で暗号化したい文字列を入力してください
study
pqrav
番号を入力してください
0: 文字列をシーザー番号(-3)で暗号化する
※使用できる文字列はa~zの小文字
1: シーザー暗号(-3)で暗号化された英字文字列を復号する
※使用できる文字列はa~zの小文字
2: 終了する
1
復号したい文字列を入力してください
pqrav
study
無事、暗号化と復号ができるプログラムが出来上がりました。
読んでいただいてありがとうございました。