在密码学中,凯撒密码Ruby

时间:2014-09-28 23:44:24

标签: ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.1

在密码学中,有一个凯撒密码。我正在尝试在Ruby中构建一个,但我不知道如何在我的范围('a'..'z').to_a.join中使用大写字母。我如何使用大写字母?

class Caesar

def initialize(shift)
  alphabet = ('a'..'z').to_a.join


  i = shift % alphabet.size


  @decrypt = alphabet
  @encrypt = alphabet[i..-1] + alphabet[0...i]
end

def encrypt(string)
  string.tr(@decrypt, @encrypt)
end

def decrypt(string)
  string.tr(@encrypt, @decrypt)
end
end

cipher_1 = Caesar.new(1)
s = 'A man, a plan, a canal: Panama!'
puts s
s_encoded = cipher_1.encrypt(s)
puts s_encoded
pudaats = cipher_1.decrypt(s_encoded)
puts pudaats

输出

  

一个男人,一个计划,一个运河:巴拿马!

     

nbo,b qmbo,b dbobm:Pbobnb!

     

一个男人,一个计划,一个运河:巴拿马!

但我需要Out Put

  

一个男人,一个计划,一个运河:巴拿马!

     

B nbo,b qmbo,b dbobm:Qbobnb!

     

一个男人,一个计划,一个运河:巴拿马!

2 个答案:

答案 0 :(得分:3)

这里的问题在于你所定义的字母表。

a..z # ["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"]

请注意,这里没有大写字母。被转置的唯一字母是小写字母。因此,您需要更改范围以包含大写字符:

alphabet = (("A".."Z").to_a + ("a".."z").to_a).join

然后你会得到正确的结果。

答案 1 :(得分:1)

   LOWER_CASE = ('a'.ord .. 'z'.ord)
    UPPER_CASE = ('A'.ord .. 'Z'.ord)

  def shift(c, by)
        byte = c.ord
        if LOWER_CASE.include?(byte) then
            ((((byte - LOWER_CASE.min) + by) % 26) + LOWER_CASE.min).chr
        elsif UPPER_CASE.include?(byte) then
            ((((byte - UPPER_CASE.min) + by) % 26) + UPPER_CASE.min).chr
        else
            c
        end