【问题标题】:AES 128 CTR Mode in RubyRuby 中的 AES 128 CTR 模式
【发布时间】:2016-10-07 05:00:39
【问题描述】:

我正在尝试在 CBC 和 CTR 模式下解密一些密文。 IV 被称为密文的前 16 个字节。我用 Ruby 编写了这个函数来解决它,使用CBC,我得到了正确的结果,但是一旦我将模式更改为CTR,我就会得到一个随机的字节串。

This postand this post 提出类似的问题,但都没有使用正确的 IV 文本,而且我已经多次检查过我的问题。

def decrypt(key, cipher, mode=:CBC)
  k = [key].pack('H*')
  iv = [cipher.scan(/../).first(16).join].pack('H*')
  c = [cipher].pack('H*')

  aes = OpenSSL::Cipher::AES.new(128, mode)
  aes.decrypt
  aes.iv = iv
  aes.key = k
  aes.update(c) + aes.final
end

使用 mode=CBC(正确忽略前几个字节):

decrypt('140b41b22a29beb4061bda66b6747e14', '4ca00ff4c898d61e1edbf1800618fb2828a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81')
=> "LQ\xFCXTr@\t\xC7\eb\x0Ex\xB3\nQBasic CBC mode encryption needs padding."

模式=点击率:

decrypt('36f18357be4dbd77f050515c73fcf9f2', '69dda8455c7dd4254bf353b773304eec0ec7702330098ce7f7520d1cbbb20fc388d1b0adb5054dbd7370849dbf0b88d393f252e764f1f5f7ad97ef79d59ce29f5f51eeca32eabedd9afa9329', :CTR)
=> "$N\x8AF\x01\e<\xA7\x9C\xCD;\xDF\xBB\xA28@\xF36\xA2\xFB\xEC`\xA5z\xE5\x02\xFA\xF5v\xDC\xE6};@\x8B:\xB9\x91\xCAj\xB8\x95\x04\x89J\xF6J.\xA0\xCC\xDFFvx\"Z_\b\x0E~[\x1F\x92+&U\xEB\x9E\xE0\xA7}\r\xC9Y?\xB2"

提前感谢您的帮助!

【问题讨论】:

  • 首先,您忘记在解密前剥离 IV。其次,您确定需要相同的密钥吗?而且 IV 不是 CTR 的 8 字节随机数?
  • 太棒了!太感谢了。只需从密文中去除 IV 即可
  • 不客气……如果你不介意我会不回答(所以你可以等别人,自己写答案或删除,随你的便)。

标签: ruby encryption cryptography aes


【解决方案1】:

感谢 Maarten 在上述 cmets 中的帮助,我能够改进我的方法,在解密时不将 IV 包含在密文中。

def decrypt(key, cipher, mode=:CBC)
  k = [key].pack('H*')
  bytes = cipher.scan(/../)
  iv = [bytes[0..15].join].pack('H*')
  c = [bytes[16..-1].join].pack('H*')

  aes = OpenSSL::Cipher::AES128.new(mode)
  aes.decrypt
  aes.iv = iv
  aes.key = k
  aes.update(c) + aes.final
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多