Ruby OpenSSL AES 生成随机密钥

3

我有一个初级问题,似乎无法解决。我正在尝试生成一个随机密钥,在AES-256-CBC中可用于加密/解密数据。

以下是我的操作步骤:

require 'openssl'
cipher = OpenSSL::Cipher::AES256.new(:CBC)
cipher.encrypt
puts cipher.random_key
>> "\xACOM:\xCF\xB3@o)<&y!\x16A\xA1\xB5m?\xF1 \xC9\x1F>\xDB[Uhz)\v0"

那给我了上面的字符串,看起来与我过去使用的密钥完全不同。正如您可能已经注意到的那样,我非常新于加密,但我试图理解是否需要进一步准备该字符串。我在Rails中创建了一个快速视图,以便我可以转到/generate并呈现一个带有随机密钥的简单HTML页面。它甚至无法呈现页面,并且抱怨无效的UTF8。我能让页面显示的唯一方法是先对密钥进行Base64编码。

我知道我错过了一些愚蠢的东西。任何想法都很好。

编辑: 如果我进行Base64编码,它看起来像这样。我应该去掉=符号或其他东西吗?

AES-128-CBC
Random Key: 0xdq+IZdmYHHbLC9Uv8jgQ== 
Random IV: vp08d/nFGE3R8HsmOzYzOA==

AES-256-CBC
Random Key: BW0wY5fUkcwszV5GIczI+D45eFOz/Ehvw5XdZIavVOQ= 
Random IV: D0pXdwQAqu+XSOv8E/dqBw==

感谢您的帮助!

你为什么要在网页上显示加密密钥呢?如果需要安全地往返传递密钥,Base64是可以的。 - user507577
这不是一个永久解决方案,页面仅处于开发中,尚未发布。此外,每次渲染页面时都会生成一个随机密钥,除了可能查看我使用的加密库之外,没人能做任何事情。我只是想生成一个密钥!Base64会在密钥末尾添加两个等号。我在使用的密钥中是否应该包含它们?还是应该去掉它们?其他我使用过的密钥(由系统生成)从未在末尾包含等号。感谢回复! - Sean
1
关键是您的初始原始字节序列。您需要对其进行base64编码以避免传输中出现问题。不要触摸“=”。它是字符串的一部分。要使用该密钥,您将需要反转编码,即解码base64。 - user507577
谢谢您的解释。我开始有点明白了。我遇到的问题是由第三方合作伙伴生成的密钥只需要使用即可。我不必先解码或执行任何操作。我该如何生成这样的密钥,只需将其发送给合作伙伴,他们就可以将其插入其AES方法中,并且它将直接起作用?再次感谢。 - Sean
我遇到了同样的问题,当我试图将随机密钥存储在AES-256-EBC中时。感谢您的建议,我找到了解决方案-使用Base64对其进行编码,然后将其存储在数据库中并在需要时解码。 谢谢! - 18augst
1个回答

0

回答你的问题(摘自维基百科):

'=='序列表示最后一组仅包含一个字节,而'='表示它包含两个字节。

理论上,解码不需要填充字符,因为缺失的字节数可以从Base64数字的数量计算出来。在某些实现中,填充字符是强制性的,而对于其他实现则不使用。

对于Ruby和您的用例,答案是:去掉=没有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接