我在尝试围绕 mcrypt_cbc 时遇到了一些麻烦。我有一个 40 个字符的密钥(OAuth 密钥 - 手动进行加密/签名而不是使用 OAuth 库)要使用,但我不确定我应该如何使用它。
最终结果需要是加密为 SHA256 CBC 的 json 对,并以 base64 编码。我有的是..
$key = '123456789012345678901234567890123456789012345678901234567890';
$pair = 'user:pass';
$encrypted = base64_encode(mcrypt_cbc(MCRYPT_RIJNDAEL_128,$key,$pair,MCRYPT_ENCRYPT,""));
我确定这是不对的,但我有以下问题:
如果我正确阅读了 PHP 文档,RIJNDAEL_128 可用于 SHA256 - 这是正确的吗?
对于 Key 和 IV .. 我也看到了以下内容:
$encrypted = base64_encode(mcrypt_cbc(MCRYPT_RIJNDAEL_128,substr($key,0,32),$pair,MCRYPT_ENCRYPT,substr($key,32,16)));
我有点疑惑——前 32 个字符用于密钥,其余 16 个字符用于 IV?IV总是只是钥匙的一部分吗?这将如何为 40 个字符完成?使用 IV ...
substr($key,32,8)
结果是
The IV parameter must be as long as the blocksize
下面的 Ruby 代码是我引用的 API 的一个示例,但我对 Ruby 的了解为零
def encrypt_aes(data)
sha_key = Digest::SHA2.digest(@secret_key)
aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.encrypt
aes.key = sha_key
aes.iv = "\x00" * 16
encrypted = aes.update(data) + aes.final
Base64.encode64(encrypted)
end
任何指导将不胜感激。过去我在 PHP 方面相当有经验,但总的来说,密码学一直是我最薄弱的领域。我在这方面的最大经验是在 c++ 中使用 Botan 库,仅此一项就归功于修改了各种片段。