代码之家  ›  专栏  ›  技术社区  ›  madlep

EzCrypto在JRuby中加密不一致(MRI可以)

  •  0
  • madlep  · 技术社区  · 15 年前

    我试图用ruby中的ezcrypto gem加密一些数据。在mri下运行时一切正常,但是在使用jruby运行相同的代码时,我得到了奇怪的结果。

    执行以下操作 应该 通过重复调用产生相同的输出。

    MRI输出:

    irb(main):007:0> Base64.encode64(EzCrypto::Key.encrypt_with_password "password", "salt","Top secret should not be revealed")
    => "6KNkObMUfXzyPey+TOGFHbozsmj5bGYqKql2Qava7++j5Moz0Zi2MwRp/FEC\nkpqw\n"
    irb(main):008:0> Base64.encode64(EzCrypto::Key.encrypt_with_password "password", "salt","Top secret should not be revealed")
    => "6KNkObMUfXzyPey+TOGFHbozsmj5bGYqKql2Qava7++j5Moz0Zi2MwRp/FEC\nkpqw\n"
    irb(main):009:0> Base64.encode64(EzCrypto::Key.encrypt_with_password "password", "salt","Top secret should not be revealed")
    => "6KNkObMUfXzyPey+TOGFHbozsmj5bGYqKql2Qava7++j5Moz0Zi2MwRp/FEC\nkpqw\n"
    

    这个输出可以很好地解密。

    不过,从jruby,每次调用都会得到不同的输出:

    irb(main):020:0> Base64.encode64(EzCrypto::Key.encrypt_with_password "password", "salt","Top secret should not be revealed")
    => "oX5JKZVkDbpbnrizI2bxkLVfQVfxayBAa0RbG+sfa9OUP1epzAyR7eDf92Bf\nVAiK\n"
    irb(main):021:0> Base64.encode64(EzCrypto::Key.encrypt_with_password "password", "salt","Top secret should not be revealed")
    => "mmyKTtn78Dv3eiH2AET1olTkHNPMhtbiXth68Lqoph1nKkYyQH6cSWws/KI5\nwza0\n"
    irb(main):022:0> Base64.encode64(EzCrypto::Key.encrypt_with_password "password", "salt","Top secret should not be revealed")
    => "pzDxS0p0CyDCkEY+QVyQKdgP1Of2ZeiNE06InS70ndkHnPwYOFmlH3h+xKXd\nmx54\n"
    

    没有一个可以成功解密。

    jruby中是否需要执行任何额外的配置步骤才能使其正常工作?

    2 回复  |  直到 15 年前
        1
  •  1
  •   madlep    15 年前

    最后直接使用openssl编写了相同的代码。梅西耶,但它起作用了。

    我有一个理论,jruby下的ezcrypto在每次调用encrypt时随机重新生成初始化向量,没有办法设置它,因此每次输出都不同。

    没有机会进一步调查

        2
  •  1
  •   Charles Oliver Nutter    15 年前

    看起来是个你应该归档的错误 http://jira.codehaus.org/browse/JRUBY .