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

Encryption 如何生成可作为字符串共享的AES-256 CBC密钥/iv?,encryption,hex,aes,encryption-symmetric,Encryption,Hex,Aes,Encryption Symmetric,我试图使AES-256 CBC加密在PHP、Ruby(使用)和Javascript(使用)中工作。至于前两项: 使用密钥生成器,如果不可用,则使用随机数生成器生成正确大小的密钥,在本例中为32字节。您可以将其提供给密码实现。然后,如果您需要十六进制,那么您可以在之后将它们显式转换或编码为十六进制 当然,要解密(或再次加密),首先必须将十六进制字符串解码或解析回实际的二进制密钥 基本上,您会使用十六进制来表示字节或八位字节,但您从不直接使用十六进制 请注意,通常不使用十六进制字符串。我只会用它们

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


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

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

基本上,您会使用十六进制来表示字节或八位字节,但您从不直接使用十六进制



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

不要将字符串用作键。使用随机生成的32字节长的密钥。然后得到所有256位的随机性。如果密钥大于32字节,任何好的API都应该抛出异常。C是可以原谅的,因为该方法只接收指向内存位置的指针。Ruby的唯一借口是它依赖于本机库,但这并不意味着它不能检查输入的大小。任何好的语言都能区分字符串和二进制。这类代码是一个等待发生的bug(如果它还没有发生的话)。所以在Ruby的情况下,会生成一个有效的32字节密钥和16字节iv?如果我记得正确,Ruby通常直接使用字节数组是的,那么上面应该生成正确的密钥/iv,是的。这很奇怪,因为我用Ruby使用这种方法加密的东西,我不能用js解密。例如,使用密钥加密
“Hello!”
“m\xD4\x90\x85\xF9\xCD\x13\x98\xAB\v\xBB\xCD\x0E\x17\xFAA\xF9\x99\xAF\e\x8A\xB5\x8Ate\x93[m\x9As\xC7\xCB”
和iv
“\xDF\xD5\xdb\xD95[\xDD(\x0F\xB8SE\xFCZr\xF1\xB1W”
Q7xDYI8SW=”输出,但我无法用CryptoJS解密它。CryptoJS不知道您正在使用的
\x
转义。如果您想使用字符串(希望是非生产代码)传输密钥,我建议您使用显式方法转换为/从十六进制数。