Ruby 与 Elixir 中的 OpenSSL 随机字节

OpenSSL Random bytes in Ruby vs Elixir

阅读我所附的 Gist 最容易理解这个问题:https://gist.github.com/KazW/e77e5c7603d7700d86c1

我在 Ruby 中有一个简单的 encrypt/decrypt 函数可以使用。每次加密函数为 运行 时,都会使用 OpenSSL::Random.random_bytes(12) 创建一个新的初始化向量。当我尝试在 Elixir 中执行相同的步骤时,使用 :crypto.strong_rand_bytes(12),它会生成一个可用于加密的 IV,但会导致解密失败。

还是陌生人,如果我使用在 Ruby 中生成的 IV,并用它在 Elixir 中加密。在 Elixir 中将密文传递给解密时,解密函数 returns 明文没有错误。我研究了使用中的算法,IV应该是随机字节,重要因素是其中的字节数(12)。

我最初的想法是,也许我调用了错误的 OpenSSL 方法来生成 IV。但是,我找不到任何关于正确方法的信息。

这里的问题是您正在使用字符串函数读取数据,它只适用于 Unicode,而 UTF8 字符是可变宽度的。您应该改用模式匹配,它使用单字节宽度。

https://gist.github.com/asonge/4f035a38a9b31339d8f5