首页 文章

使用Cipher和Ruby

提问于
浏览
0

我想尝试以下方法:

使用带有128位密钥的AES算法加密字符串 . 我被告知使用的密码模式是带有PKCS5填充的CBC . 初始化向量是00字节的16个字节 .

以下是我给出的说明:

  • 使用密钥我需要使用前16个字节生成128位密钥 .

  • 读取要在“UTF-8”中编码的字符串的字节 .

  • 使用AES算法和128位密钥加密字符串 . 一定要使用CBC模式和PKCS5填充 .

  • 将加密的字节转换为十六进制字符串 .

这是我到目前为止:

message = "string to be encoded"
secret = "mysecretkey".encode('UTF-8')
key = secret[0..15]
iv = "/0" * 16
cipher = OpenSSL::Cipher.new('aes-128-cbc')
cipher.encrypt
cipher.key = aes_key = key
cipher.iv = aes_iv = iv
encrypted = cipher.update(message)
encrypted << cipher.final()

我的输出是胡言乱语 . 我假设是因为我没有正确转换为十六进制?另外我如何设置PKCS5填充?我正确地做了iv吗?或者我完全偏离了这一点?

任何帮助将不胜感激!

1 回答

  • 3

    我的输出是胡言乱语 . 我'm assuming it'因为我没有正确转换为十六进制?

    那是正确的 .

    将二进制字符串转换为十六进制是相对简单的(这是使用 String#unpack 的Ruby中的标准"trick"):

    ciphertext_hex = encrypted.unpack('H*').first
    

    另外我如何设置PKCS5填充?

    Ruby / OpenSSL将使用PKCS7,但这应该与PKCS5兼容(PKCS7是PKCS5的扩展,但您不应该在所选的AES-128-CBC模式中看到任何扩展行为) .

    我正确地做了iv吗?

    不,您使用错误的字符来转义字符代码0,因此您的字符串是 "/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0" ,您可以通过打印来确认 . 你想要的实际上是:

    iv = "\0" * 16
    

    虽然通常您会为每封邮件设置一个随机的新 iv ,因为它可以降低使用重复内容的邮件攻击您的加密的风险 .

    或者我完全偏离了这一点?

    不太远,只有几个未命中/差距 . 我希望以上有所帮助 .

相关问题