【问题标题】:Using Cipher with Ruby在 Ruby 中使用密码
【发布时间】:2014-07-17 00:09:01
【问题描述】:

我正在尝试以下操作:

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

这是给我的指示:

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

  2. 读取要以“UTF-8”编码的字符串字节。

  3. 使用 AES 算法和您的 128 位密钥加密字符串。请务必使用 CBC 模式和 PKCS5 填充。

  4. 将加密字节转换为十六进制字符串。

这是我目前所拥有的:

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填充?我做的静脉注射正确吗?还是我完全偏离了轨道?

任何帮助将不胜感激!

【问题讨论】:

    标签: ruby-on-rails ruby encryption cryptography


    【解决方案1】:

    我的输出是乱码。我假设这是因为我没有正确转换为十六进制?

    没错。

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

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

    另外我该如何设置 PKCS5 填充?

    Ruby/OpenSSL 将使用 PKCS7,但为了您的目的,它应该与 PKCS5 兼容(PKCS7 是 PKCS5 的扩展,但在您选择的 AES-128-CBC 模式下您不应该看到任何扩展行为)。

    我做的静脉注射正确吗?

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

    iv = "\0" * 16
    

    虽然通常您会为每条消息设置一个随机的新iv,因为它可以降低具有重复内容的消息可被用于攻击您的加密的风险。

    或者我完全偏离了轨道?

    不是太远,只是一些失误/差距。我希望以上内容有所帮助。

    【讨论】:

    • 惊人的 - 非常感谢!不敢相信我的转义字符被颠倒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多