AES 128 CTR режим в Ruby

Я пытаюсь расшифровать какой-то зашифрованный текст в режиме CBC и CTR. IV, как говорят, первые 16 байт шифровального текста. Я написал эту функцию в Ruby, чтобы решить ее , и с CBC, я получил правильные результаты, но как только я изменил режимCTR, я получаю случайную строку байтов.

Этот пост и этот пост задают похожие вопросы, но ни один из них не использовал правильный текст 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')
=> "LQxFCXTr@txC7ebx0ExxB3nQBasic CBC mode encryption needs padding."

С mode=CTR:

decrypt('36f18357be4dbd77f050515c73fcf9f2', '69dda8455c7dd4254bf353b773304eec0ec7702330098ce7f7520d1cbbb20fc388d1b0adb5054dbd7370849dbf0b88d393f252e764f1f5f7ad97ef79d59ce29f5f51eeca32eabedd9afa9329', :CTR)
=> "$Nx8AFx01e<xA7x9CxCD;xDFxBBxA28@xF36xA2xFBxEC`xA5zxE5x02xFAxF5vxDCxE6};@x8B:xB9x91xCAjxB8x95x04x89JxF6J.xA0xCCxDFFvx"Z_bx0E~[x1Fx92+&UxEBx9ExE0xA7}rxC9Y?xB2"

Заранее спасибо за любую помощь!

1 ответ

  1. Благодаря помощи Мартена в комментариях выше, я смог усовершенствовать свой метод, чтобы не включать 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