当前位置: 首页 > 知识库问答 >
问题:

简单密码-Ruby

蒋招
2023-03-14

我目前正在学习Ruby,并尝试过简单密码挑战。我现在正在研究下面的解决方案,并试图通过逆向工程来理解这个解决方案背后的思维过程。以下是解决方案的链接。我将详细说明我对每个代码段的理解。如果他们不对,你能纠正我吗?谢了!https://extrym.io/tracks/ruby/extryes/simple-cipher/solutions/B200C3D9F10E497BBE2CA0D826DF2661

class Cipher
  ALPHABET = [*'a'..'z']

  attr_reader :key

  def initialize(key = nil)
    @key = key || 100.times.map { ALPHABET.sample }.join
    fail ArgumentError, 'invalid chars in key' unless valid?(@key)
  end

  def encode(text)
    a = 'a'.ord
    text.chars.zip(@key.chars).map do |char, key|
      ALPHABET[(char.ord - a + key.ord - a) % ALPHABET.length]
    end.join
  end

  def decode(code)
    code.chars.zip(@key.chars).map do |char, key|
      ALPHABET[char.ord - key.ord]
    end.join
  end

private

  def valid?(key)
    !key.empty? && key !~ /[^a-z]/
  end

end

第1部分

@key=key是如果key匹配。字母表被随机化(用.sample方法)并联接。然后,随机连接的字母表被迭代100次,并返回一个新的数组(使用map方法)。

若要处理无效键错误,请使用fail ArgumentError。

  def initialize(key = nil)
    @key = key || 100.times.map { ALPHABET.sample }.join
    fail ArgumentError, 'invalid chars in key' unless valid?(@key)
  end

第2部分我明白这段代码的目的是将纯文本转换为加密文本。然而,我正在努力实现以下代码的某些部分。

def encode(text)
    a = 'a'.ord
    text.chars.zip(@key.chars).map do |char, key|
      ALPHABET[(char.ord - a + key.ord - a) % ALPHABET.length]
    end.join
  end
def decode(code)
    code.chars.zip(@key.chars).map do |char, key|
      ALPHABET[char.ord - key.ord]
    end.join
end

第4部分private方法用于将此代码块与其他类分开。有效的方法是验证密钥。有两个条件:键不能为空或必须是小写字母。

private

  def valid?(key)
    !key.empty? && key !~ /[^a-z]/
  end

共有1个答案

邵兴怀
2023-03-14

@key=key是如果key匹配。字母表被随机化(用.sample方法)并联接。然后,随机连接的字母表被迭代100次,并返回一个新的数组(使用map方法)。

@key=key,如果key不是falsy(nilfalse);否则,迭代100次并从Alphabet中收集一个随机字符;然后将得到的100个元素数组连接到一个字符串中,并将该字符串分配给@key。什么都不返回

ord方法-将字符转换为其ASCII值。a='a'.ord。为什么选择这个角色?不是z或其他字符?

不,它只是通过将text.chars中的每个元素与@key.chars中的相应元素配对来创建一个新数组。没有比较。

我很难理解这个字母表[(char.ord-a+key.ord-a)%alphabet.length]部分。使用。ord方法将字母表原始纯文本和加密密钥文本字符转换为ASCII值。为什么要从这些值中减去一个值?为什么要使用%运算符和alphabet.length?

关于为什么请参见上面。

第3部分,在这一部分,解码方法,代码使用。代码是双方(发送方和接收方)共享的秘密密钥。但为什么是字母表[char.ord-key.ord]?字符ascii-key ascii值将提供解密的纯文本。我不明白它是怎么工作的?

移位的可以不移位;这就是解码的样子。在此之前,我们将两个字符的位置相加--(char.ord-a)+(key.ord-a)-现在我们将它们相减:(char.ord-a)-(key.ord-a)。做一些数学运算,您会看到两个a将在减法中相互抵消,因此(char.ord-a)-(key.ord-a)等效于char.ord-key.ord

之前,我们担心加法可能会超过字母表的大小。在这里,人们可能会担心减法可能会变成负数。但是Ruby现在支持我们:Alphabet[-3]在Ruby中表示“从末尾开始的第三个元素”,因此等同于Alphabet[23];不需要%

 类似资料:
  • 假设我有一个IP地址,192.168.1.1 我想让我的程序基于这个IP地址创建一个随机的单字字符串,它可以很容易地解密,而无需密钥或密码或额外的安全措施。 例如。 我进入192.168.1.1 程序将其转换为AzlQrEHCSD或其他一些随机字符串 我在程序中输入这个字符串 它被转换回192.168.1.1 有没有简单的算法可以在不生成密钥或其他密码的情况下做到这一点?我知道密钥和密码是加密和解

  • 下面是我的Bean类 当我运行代码时,我得到了下面的错误,字段passwordEncoder在com.naveen.controller.UserController需要一个类型为'PasswordEncoder'的beancom.naveen.entity.找不到。注入点有以下注释:-@org.springframework.beans.factory.annotation.自动加载(必需=tr

  • 简单替换密码是最常用的密码,包括为每个密文文本字符替换每个纯文本字符的算法。 在这个过程中,与凯撒密码算法相比,字母表是混乱的。 例子 (Example) 简单替换密码的密钥通常由26个字母组成。 一个示例关键是 - plain alphabet : abcdefghijklmnopqrstuvwxyz cipher alphabet: phqgiumeaylnofdxjkrcvstzwb 使用

  • 在本章中,您可以了解替换密码的简单实现,它根据简单替换密码技术中使用的逻辑显示加密和解密的消息。 这可以被视为编码的替代方法。 Code 您可以使用以下代码使用简单替换密码执行解密 - import random chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + \ 'abcdefghijklmnopqrstuvwxyz' + \ '0123456789'

  • 本文向大家介绍JavaScript登录记住密码操作(超简单代码),包括了JavaScript登录记住密码操作(超简单代码)的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴代码了,具体代码如下所示: 以上所述是小编给大家介绍的JavaScript登录记住密码操作(超简单代码),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站

  • 我正在寻找比ROT13更复杂的东西,但它不需要库(最好甚至不需要单元,只需要一个插入函数)。 我想使用用户提供的密码对称加密/解密给定的字符串。但是,结果必须是一个字符串,从某种意义上说,我必须能够将其存储在 .INI 文件。 有没有人有一个简单的函数可以做到这一点(delphi XE2)?谷歌今天不是我的朋友。 先谢谢了 [Update]/[Bounty]只是为了澄清(如果最初不是这样,请重复)