OpenSSL Ruby与Elixir中的随机字节

时间:2016-02-07 01:08:31

标签: ruby encryption openssl cryptography elixir

通过阅读我附带的要点:https://gist.github.com/KazW/e77e5c7603d7700d86c1

,可以最容易地理解这个问题

我在Ruby中有一个简单的加密/解密函数。每次运行加密函数时,都会使用<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="description" content="Playing with ReactJS"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Playing with ReactJS</title> </head> <body> <!-- container node --> <div id="app"></div> <script src="bower_components/react/react.js"></script> <script src="bower_components/react/react-dom.js"></script> <script type="text/jsx"> /** @jsx React.DOM */ var MessageBox = React.createClass({ render: function() { return ( <h1>Hello, World</h1> ); } }); ReactDOM.render( <MessageBox/>, document.getElementById('app'), function () { console.log('after render'); } ); </script> </body> </html> 创建一个新的初始化向量。当我尝试使用OpenSSL::Random.random_bytes(12)在Elixir中执行相同的步骤时,它会生成一个可用于加密的IV,但会导致解密失败。

奇怪的是,如果我使用Ruby中生成的IV,并将其用于Elixir中的加密。当传递密文以在Elixir中解密时,解密函数返回明文而没有错误。我已经研究过使用的算法,IV应该是随机字节,重要因素是它中的字节数(12)。

我最初的想法是,我可能正在调用错误的OpenSSL方法来生成IV。但是,我无法找到有关正确方法的信息。

1 个答案:

答案 0 :(得分:6)

这里的问题是您使用String函数来读取数据,这些数据仅适用于Unicode,UTF8字符是可变宽度的。您应该使用模式匹配,它使用单字节宽度。

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