当前位置: 首页 > 知识库问答 >
问题:

openssl aes加密bash命令!=ruby openssl aes加密

冷俊健
2023-03-14

我正在尝试使用带有相同密钥和 iv 的 AES 加密相同的文本。我使用 bash 方法和 ruby 的 openssl stdlib,并对加密结果进行 b64 编码。但结果不同!我试图理解为什么。这是我所做的:

红宝石(1.9.3-p448)

data = "foobar"
key = ["a8f9f5c5b4c42c75e255a73b6be311e1"].pack("H*")
cipher = OpenSSL::Cipher::AES.new(128, :CBC)
cipher.encrypt
cipher.key = key
iv = cipher.random_iv
enc = cipher.update(data) + cipher.final
Base64.strict_encode64(enc)

cipher_key_hex = key.each_byte.map { |b| b.to_s(16) }.join
iv_hex = iv.each_byte.map { |b| b.to_s(16) }.join

砰砰��

-iv参数设置为上面计算的iv_hex值。

$ echo -n 'foobar' > foobar.txt
$ openssl enc -aes-128-cbc -base64 -in foobar.txt -K a8f9f5c5b4c42c75e255a73b6be311e1 -iv 5dc7ff87987c5a25ae73433f11bd6fa

=========================================

我仔细检查了静脉注射在两种方法中是相同的。

Ruby输出:rbRIW7iTsNC6LttBQ Amzg==

Bash输出:CcSs1 ssEu8FYkcspLeCWw==

我错过了什么?这令人费解。

共有1个答案

郎吉星
2023-03-14

问题是< code>b.to_s不会每字节返回两个字符。这意味着任何小于16的字节值都将被转换为一个字节,如果这些字节被连接起来,那么不同字节的十六进制数字将被合并,从而导致无效的IV或密钥。加密API隐藏了这一事实,它可以将密钥和IV填充到正确的大小,而不是拒绝它们(这是应该的)。

您可以使用 unpack(“H*”) 来执行字节到十六进制的正确编码。这对于用于解码十六进制值的 pack(“H*”) 也非常对称。

 类似资料:
  • 基础常用命令 某个命令 --h,对这个命令进行解释 某个命令 --help,解释这个命令(更详细) man某个命令,文档式解释这个命令(更更详细)(执行该命令后,还可以按/+关键字进行查询结果的搜索) Ctrl + c,结束命令 TAB键,自动补全命令(按一次自动补全,连续按两次,提示所有以输入开头字母的所有命令) 键盘上下键,输入临近的历史命令 history,查看所有的历史命令 Ctrl +

  • 我试图通过向泰雷兹hsm发送命令,从加密组件中生成密钥;命令是:从加密组件(A4)中形成密钥,其中“HCONA42001UUF564A40B2E64C84233DFB1289B482496U30CDD5A92A3CACBA19496ECBD134C0E7”,我得到的响应是“HCONA510”,其中10表示组件奇偶校验错误<有什么想法吗?

  • 我们正在使用JWT Nuget来创建和验证令牌。下面是我们用来创建令牌的代码 我的理解是,这不会加密令牌,因为我能够通过访问jwt.io解析令牌,并且能够读取内容。我想加密令牌,这样它就不应该被解析。我在JWT Nuget中找不到任何可以加密令牌的方法。 那么如何使用JWT nuget对令牌进行签名和加密呢? 编辑: 我知道JWT不需要任何加密,因为只有经过身份验证的用户才能读取令牌,这意味着,我

  • 我正在使用php saml工具包https://github.com/onelogin/php-saml在web应用程序中实现SSO。身份验证本身可以工作,但当我与拦截代理进行检查时https://portswigger.net/burp/communitydownloadsaml标记以清晰的形式显示(作为xml,带有用户名以及为身份验证传递的所有信息)。在连接器和设置中https://githu

  • 加载命令load读出含有由早期MATLAB版本形成的矩阵的二进制文件,或者读出含有数值数据的文本文件。文本文件应该由一个数字的矩阵表格构成,由空格隔开,每一线排一行,而且每一行有相同数量的元素。例如,在MATLAB外部,创建一个含有这四行的文本文件。 16.0 3.0 2.0 13.0 5.0 10.0 11.0 8.0 9.0

  • 我有一个用例,其中我在bash脚本中使用命令,其中我以明文格式输入了Keystore密码。类似的东西: 测验嘘 现在需要在脚本中加密这个明文密码,这样就可能不知道实际的密钥库密码。我尝试使用OpenSSL加密默认密码,将其存储在另一个隐藏文件中,并在运行脚本时随时解密密码,但任何有权访问脚本的人都可以查看正在使用的算法,并使用相同的OpenSSL命令解密密码。 我知道keytool需要不惜任何代价