一次性密码

时间:2014-06-21 19:28:27

标签: ruby encryption

在Ruby中,我正在为一个项目构建一个“One Time Pad”密码。虽然,我已经碰到了一些我不熟悉的事情。我需要将一个字符更改为一个整数,然后添加一个随机数。

对于随机数,我只使用rand然后将其添加到角色中。但是如何将角色变成与该角色的值匹配的整数(A = 1,B = 2,C = 3等)。那么如何将随机数的值添加到字符(已更改为整数),然后将这两者的总和更改为字符?

感谢。

2 个答案:

答案 0 :(得分:0)

试试这个:

h = {}
v = 0

('A'..'Z').each do |c|
  v+=1
  h[c] = v
end

h将导致您正在寻找的哈希:

{"Z"=>26, "Y"=>25, "X"=>24, "W"=>23, "V"=>22, "U"=>21, "T"=>20, "S"=>19, "R"=>18, "Q"=>17, "P"=>16, "O"=>15, "N"=>14, "M"=>13, "L"=>12, "K"=>11, "J"=>10, "I"=>9, "H"=>8, "G"=>7, "F"=>6, "E"=>5, "D"=>4, "C"=>3, "B"=>2, "A"=>1}

要获取字母的相应编号,请执行以下操作:

h[char]

EG。对于J,您可以:h["J"]获取10

从整数中获取字符

您可以使用hash #index从整数中获取char。 例如

h.index(22) # => "V"

答案 1 :(得分:0)

这是一种简单快捷的方式,使用String#bytesArray#pack

# Get a list of the byte values of each character in a String
b = "Answering".bytes
# => [65, 110, 115, 119, 101, 114, 105, 110, 103]

# Add a random number between 0 and 100 to each integer
r = b.map {|x| x + x.rand(100)}
# => [78, 170, 172, 194, 175, 187, 135, 140, 180]

# Convert it back to a String
scrambled = r.pack('c*')
# => "N\xAA\xAC\xC2\xAF\xBB\x87\x8C\xB4"

注意Array#pack可能遇到一些麻烦(因此\x...个字符)因为普通编码方法中没有足够的位来处理通过添加随机创建的高字节整数号。

有一种更“红宝石”的方法可以做到这一点,包括Array#each_byte#map和一个块,但我会留给你弄清楚。对于那些习惯于程序语言的人来说,这个(上面)可能更容易接受。