我以为我理解了这一点,但我的程序不会解密并且说密钥错了,所以我意识到我需要帮助。我以为算法去了:
加密:
解密:
这不正确吗? (编辑:事实证明是这样,但是这个级别太高了 - 我的问题更具体。)
编辑:这是我的代码:
sudo ~/torch/install/bin/luarocks install nn
答案 0 :(得分:3)
问题在于功能:
function generate_key_from_password($password)
行:
$salt = openssl_random_pseudo_bytes($GLOBALS['key_size'], $strong);
需要使用相同的盐才能获得相同的密钥。
需要在generate_key_from_password
函数之外创建一个salt并传入,并且它需要与加密和解密相同的salt。这通常通过在加密函数中创建salt,将其传递到PBKDF2函数并以与iv相同的方式将salt预先加到加密输出中来完成。然后,相同的盐可用于解密功能。
这样的小事使安全使用加密变得困难。有关包含身份验证,迭代计数和版本的示例,请参阅RNCryptor-php和RNCryptor-Spec。
答案 1 :(得分:1)
跳过第3步,没有必要。
确保键和iv的长度正确。确保您使用的是CBC模式和PKCS#7(或PKCS#5)。
答案 2 :(得分:1)
对hash_pbkdf2()
使用可选的第五个参数$length
:
var_dump(hash_pbkdf2("sha256", "foobar", "salty", 100));
// string(64) "5d808ee6539c7d0437e857a586c844900bf0969d1af70aea4c3848550d9038ab"
var_dump(hash_pbkdf2("sha256", "foobar", "salty", 100, 32));
// string(32) "5d808ee6539c7d0437e857a586c84490"
var_dump(hash_pbkdf2("sha256", "foobar", "salty", 100, 128));
// string(128) "5d808ee6539c7d0437e857a586c844900bf0969d1af70aea4c3848550d9038abb2853bf0cf24c9d010555394f958fa647a04b232f993c35916977b4ef5a57dcc"
您可能还需要原始输出,因此请阅读上面链接的方法文档页面,并注意这一点。