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

如何生成可作为字符串共享的AES-256 CBC密钥/iv?

齐夕
2023-03-14

我试图让AES-256 CBC加密在PHP、Ruby(使用SymmetricEncryption)和Javascript(使用CryptoJS)中工作。至于前两个:

<?php
openssl_encrypt(
  'Hello!', 'aes-256-cbc',
  '1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF',
  0,
  '1234567890ABCDEF1234567890ABCDEF'
); // => 'BAd5fmmMTvRE4Ohvf3GpCw=='
ruby_cipher = SymmetricEncryption::Cipher.new(
  key: "1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF",
  iv: "1234567890ABCDEF1234567890ABCDEF",
  cipher_name: 'aes-256-cbc'
)
ruby_cipher.encrypt("Hello!") # => 'BAd5fmmMTvRE4Ohvf3GpCw=='

但是根据这个答案上面的键/iv只提供128位的安全性。

PHP和Ruby将密钥和IV作为二进制字符串。他们不假设它是十六进制编码的。所以,尽管这个密钥中有256位,但安全性实际上只有128位,因为每个字符在十六进制编码的字符串中只有4位。

因此,在CryptoJS中,只使用一半的密钥/iv可以提供相同的加密结果。

CryptoJS.AES.encrypt(
    "Hello!",
    CryptoJS.enc.Utf8.parse('1234567890ABCDEF1234567890ABCDEF'),
    iv: CryptoJS.enc.Utf8.parse('1234567890ABCDEF')
).toString() // 'BAd5fmmMTvRE4Ohvf3GpCw=='

如何生成提供256位安全性的字符串密钥和iv?

共有1个答案

糜单弓
2023-03-14

您使用密钥生成器,如果不可用,使用随机数生成器来生成正确大小的密钥,在本例中是32字节。您可以将其提供给密码实现。然后,如果您需要十六进制,您可以在之后将它们显式转换或编码为十六进制。

当然,要解密(或再次加密),首先必须将十六进制字符串解码或解析回实际的二进制密钥。

基本上,你会使用十六进制来表示字节或八位字节,但你永远不会直接使用十六进制。

请注意,通常不使用十六进制字符串。我只会用它们来测试代码。通常,密钥被放入(PKCS#12)密钥存储中,或者通过密钥派生方法生成。六位小数通常仅用于人类消费,而这通常不是必需的。不编码为十六进制的一个原因是,字符串有时很难从内存中删除,因此十六进制键很可能在使用后仍保留在内存中。

 类似资料:
  • 我正在尝试用Java编写一个简单的密码管理器。我想用AES 256位加密用存储的密码加密文件。此外,我希望用户能够解密的文件与密码。当阅读其他在线帖子时,他们几乎都强调简单地使用密码作为密钥是不安全的,他们提到使用随机盐来增加安全性。但我不明白如何在生成密钥时使用随机盐。如果我从用户的密码和随机的salt创建密钥,那么当他们试图解密他们的文件时,我怎么知道salt是什么呢?这让我完全糊涂了。 目前

  • 我需要从NSData值生成对称AES密钥,该值创建如下: (initKey是base64字符串值。) 问题是如何从“解码数据”中生成密钥?(类似于Android秘书KeySpec) (我使用的是Swift 2.2) 这里是场景(在Android): 1-我有一个bas64字符串。 2-我将其解码为字节数组。 3-然后根据字节数组长度和AES类型创建secretkey。 4-最后定义一个基于secr

  • 如何使用PHP安全地生成适用于AES 256哈希数据的密钥? 我尝试过谷歌搜索,找到了大量关于如何使用PHP使用AES 256加密数据的信息,但是所有这些示例都使用了现有的预生成密钥,而我需要在PHP中生成密钥。

  • 尝试将数据解密为用AES-128加密的字节数组,使用字符串密钥"keykeykeykey1" 代码: 给我BadPaddingExc0019。我错过了什么?

  • 我得到的输出是: 有人能解释一下是怎么回事吗?我在互联网上看到了很多这样的例子,它们看起来都很好。但在这里,文本没有被解密。 ps:我使用的版本是

  • 我使用Laravel 5.7,并在不同的服务器上运行两个应用程序。我想通过加密进行通信。所以两端都需要有一定的键。默认的 laravel加密设置为 AES-256-CBC。 所以我想,我需要一个32字节的密钥,就像这样: $ key = bin 2 hex(OpenSSL _ random _ pseudo _ bytes(32,$ c strong)); 我得到一个64长的十六进制字符串,我想保