使用40个字符的密钥加密到PHP中的AES256 CBC

时间:2012-08-31 00:14:28

标签: php ruby encryption cryptography aes

我在尝试围绕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库,而这一切都归功于修改各种片段。

1 个答案:

答案 0 :(得分: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生成签名,然后将签名w /参数发送到api服务器。