0

我在尝试围绕 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 库,仅此一项就归功于修改了各种片段。

4

1 回答 1

0

为了供其他从事此工作的人将来参考,这就是我的工作方式:

$CREDENTIALS = 'user:pass';
$SECRET_KEY = 'xxxx'; //40 character secret key

$key256 = @pack("H*" , @hash('sha256', $SECRET_KEY));
$encrypted_string = @base64_encode( openssl_encrypt( $CREDENTIALS, "aes-256-cbc", $key256, true) );

完成后,我可以将“凭据”参数以及其他必要参数添加到 URL 中,通过 base64 sha256 生成签名,然后将带有参数的签名发送到 api 服务器。

于 2012-09-03T16:33:13.580 回答