Ruby OpenSSL AES-128-CTR
Ruby OpenSSL AES-128-CTR
我无法弄清楚我在尝试使用 ruby 的 OpenSSL 密码 AES-128-CTR 使用给定密钥解密一串十六进制值时做错了什么。
我正在使用 gem hex_string 将我的十六进制转换为字节
ctrkey = "36f18357be4dbd77f050515c73fcf9f2"
ciphertext3 = "69dda8455c7dd4254bf353b773304eec0ec7702330098ce7f7520d1cbbb20fc3\
88d1b0adb5054dbd7370849dbf0b88d393f252e764f1f5f7ad97ef79d59ce29f5f51eeca32eabedd9afa9329"
cipher2 = OpenSSL::Cipher.new('AES-128-CTR')
cipher2.decrypt
ctrkey = ctrkey.to_byte_string
cipher2.key = ctrkey
iv = cipher2.random_iv
cipher2.iv = iv
ciphertext3 = ciphertext3.to_byte_string
plain = cipher2.update(ciphertext3) + cipher2.final
puts "plaintext of Q3: #{plain}"
我知道我遗漏了一些小东西,因为我有类似的代码实现 AES-128-CBC。我是否需要一个计数器来为密文中的每个 128 字节块递增 IV?
不,你不是错过了小事,而是错过了大事。
您没有使用与加密相同的 IV,而是生成了一个新的 IV。对于 CTR,如果 IV 是随机的,那么每个计数器值都是不同的,从而导致看起来随机的输出。
通常将 IV(或 CTR 中的随机数)作为密文的前缀。对于可能少于 16 个字节的点击率 - 虽然这仍然是最有可能尝试的大小。
我无法弄清楚我在尝试使用 ruby 的 OpenSSL 密码 AES-128-CTR 使用给定密钥解密一串十六进制值时做错了什么。
我正在使用 gem hex_string 将我的十六进制转换为字节
ctrkey = "36f18357be4dbd77f050515c73fcf9f2"
ciphertext3 = "69dda8455c7dd4254bf353b773304eec0ec7702330098ce7f7520d1cbbb20fc3\
88d1b0adb5054dbd7370849dbf0b88d393f252e764f1f5f7ad97ef79d59ce29f5f51eeca32eabedd9afa9329"
cipher2 = OpenSSL::Cipher.new('AES-128-CTR')
cipher2.decrypt
ctrkey = ctrkey.to_byte_string
cipher2.key = ctrkey
iv = cipher2.random_iv
cipher2.iv = iv
ciphertext3 = ciphertext3.to_byte_string
plain = cipher2.update(ciphertext3) + cipher2.final
puts "plaintext of Q3: #{plain}"
我知道我遗漏了一些小东西,因为我有类似的代码实现 AES-128-CBC。我是否需要一个计数器来为密文中的每个 128 字节块递增 IV?
不,你不是错过了小事,而是错过了大事。
您没有使用与加密相同的 IV,而是生成了一个新的 IV。对于 CTR,如果 IV 是随机的,那么每个计数器值都是不同的,从而导致看起来随机的输出。
通常将 IV(或 CTR 中的随机数)作为密文的前缀。对于可能少于 16 个字节的点击率 - 虽然这仍然是最有可能尝试的大小。