gpt4 book ai didi

ruby - 为什么我不能使 "OpenSSL with Ruby"和 "Command line OpenSSL"互操作?

转载 作者:数据小太阳 更新时间:2023-10-29 07:30:32 25 4
gpt4 key购买 nike

在尝试设置可互操作的加密系统时,我在简单的“概念验证”期间遇到了一个奇怪的情况。

我用 Ruby 编写了以下代码:

  • 从我的文件系统上的虚拟文本文件创建一个加密文件
  • 解密加密文件
  • 与原文件对比,是否相同

代码如下:

require 'openssl'
require 'base64'

# Read the dummy file
data = File.read("test.txt")

# Create an encrypter
cipher = OpenSSL::Cipher::AES.new(256, :CBC)
cipher.encrypt
key = "somethingreallyreallycomplicated"
cipher.key = key

# Encrypt and save to a file
encrypted = cipher.update(data) + cipher.final
open "encrypted.txt", "w" do |io| io.write Base64.encode64(encrypted) end

# Create a decrypter
decipher = OpenSSL::Cipher::AES.new(256, :CBC)
decipher.decrypt
decipher.key = key

# Decrypt and save to a file
encrypted_data = Base64.decode64(File.read("encrypted.txt"))
plain = decipher.update(encrypted_data) + decipher.final
open "decrypted.txt", "w" do |io| io.write plain end

# Compare original message and decrypted message
puts data == plain #=> true

一切正常,此脚本输出“true”

然后我尝试使用 openssl 命令行通过以下命令解密我的文件:

openssl aes-256-cbc -d -a -in encrypted.txt -k somethingreallyreallycomplicated

但我得到:错误的魔数(Magic Number)

怎么会?

最佳答案

您需要在命令行上使用 -K(大写)和 -iv 选项将 key 和 IV 明确指定为十六进制数字字符串。如果您使用 -k(小写),OpenSSL 将使用 key 导出函数从密码中导出 key 和 IV。当 OpenSSL 派生 key 时,它还将使用与您期望的普通 block CBC 不兼容的“加盐”密文格式。

请注意,在您的 Ruby 代码中,您直接使用 ASCII 字符串的前 256 位(32 字节)作为 key ,对于安全性有问题的现实应用程序,这几乎肯定不是您想要的。您应该使用(随机生成的)二进制 key ,或使用 key 派生函数(例如 PBKDF2)从密码派生 key 。 , bcryptscrypt .

关于ruby - 为什么我不能使 "OpenSSL with Ruby"和 "Command line OpenSSL"互操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14602069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com