2016-10-14 63 views
0

我想在PHP,Ruby(使用SymmetricEncryption)和Javascript(使用CryptoJS)中进行AES-256 CBC加密。作为第一2:如何生成可以共享为字符串的AES-256 CBC密钥/ iv?

<?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==' 

但根据this answer上述键/仅iv提供128位的安全性。

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

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

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

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

+1

请勿将字符串用作关键字。使用32字节长度的随机生成密钥。然后你得到所有256位的随机性。 –

+0

如果密钥大于32个字节,任何好的API都会引发异常。因为该方法只接收到一个指向内存位置的指针,所以C可以稍微宽恕一些。 Ruby的唯一借口是它依赖于本地库 - 但这并不意味着它无法检查输入的大小。任何良好的语言都可以区分字符串和二进制。这种代码是一个等待发生的错误(如果它还没有发生)。 –

回答

1

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

当然,解密(或重新加密),你首先必须解码解析十六进制字符串回到实际的二进制密钥。

基本上你会使用十六进制的代表的字节或八位字节,但是你从不直接使用十六进制。


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

+0

因此,在Ruby [SecureRandom.random_bytes(32)和SecureRandom.random_bytes(16)]的情况下(https://ruby-doc.org/stdlib-2.1.2/libdoc/securerandom/rdoc/SecureRandom.html#method -c-random_bytes)会生成一个有效的32字节密钥和16字节的iv? – ChristofferJoergensen

+0

如果我没有记错的话Ruby一般直接使用字节数组是的,所以上面应该生成正确的键/ IV,是的。 –

+0

这很奇怪,因为我用Ruby使用这种方法加密的东西,我无法用js解密。例如加密'“你好!“''''键''m \ xD4 \ x90 \ x85 \ xF9 \ xCD \ x13 \ x98 \ xAB \ v \ xBB \ xCD \ x0E \ x17 \ xFAA \ xF9 \ x99 \ xAF \ e \ x8A \ xB5 \ x8Ate \ x93 [m \ xAas \ xC7 \ xCB“'和iv'”\ xDF \ x95 [\ xD5 \ xDD(\ x0F \ xB8SE \ xFCZr \ xF1 \ xB1W“'outputs'”qAnTLy7jyiLRkUqBnME8sw ==“',用CryptoJS解密它 – ChristofferJoergensen

相关问题