【问题标题】:One Time Pad Cipher [duplicate]一次性密码[重复]
【发布时间】:2014-06-21 19:28:26
【问题描述】:

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

对于随机数,我将使用 rand 然后将其添加到字符中。但是如何将字符转换为与该字符的值匹配的整数(A = 1、B = 2、C = 3 等)。那怎么把随机数的值加到字符上(已经改成整数了),然后把这两者的和改回字符呢?

谢谢。

【问题讨论】:

  • @sawa 投票结束时发生了什么 - 欺骗?
  • 不是真的,这是为了解决不同的问题。在这我需要添加一个随机数,这是一个“一次性”密码,而另一个更像是凯撒密码。
  • 如果您已完成第一个问题,以下内容将帮助那些试图帮助您的人: 1) 选择第一个问题的正确答案。 2)使用您从第一个问题中获得的知识在第二个问题的基础上进行构建。重复“如何将字符变成整数”是这个问题看起来像重复的原因。显示您在此处尝试的一些代码也很有用,因此更清楚您卡在哪里,以及问题之间的区别是什么。如果您还没有准备好编写第二段代码,那么请放慢速度,从第一段开始学习。
  • 好的,谢谢老兄。下次我在网站上提问时,我将按照上述说明使用您的说明。

标签: ruby encryption


【解决方案1】:

试试这个:

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]

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

从整数中获取字符:

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

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

【讨论】:

  • 感谢您的回答。我向该整数添加了一个随机数,但是如何将这两个值的总和转换回一个字符?谢谢
  • @DaniyartheKhan 您可以为此目的使用#index。查看我的编辑
【解决方案2】:

这是一种简单快捷的方法,使用String#bytes 和Array#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... 字符),因为在正常编码方法中没有足够的位来处理通过添加随机数创建的高字节整数。

还有一种更“Ruby”的方法可以做到这一点,其中涉及Array#each_byte、#map 和一个块,但我会让你自己弄清楚。对于那些习惯于程序语言的人来说,这个(上图)可能更容易上手。

【讨论】:

  • 去掉“x”后得到了更好的结果。并使用: r = b.map {|x| x + 兰德(100)}
猜你喜欢
  • 2013-10-06
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 2018-01-28
  • 2013-10-15
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多