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

使用40个字符的密钥在PHP中加密到AES256 CBC,php,ruby,encryption,cryptography,aes,Php,Ruby,Encryption,Cryptography,Aes,我在想办法让我的头绕着mcrypt_cbc有点困难。我有一个40个字符的密钥(OAuth密钥-手动执行加密/签名,而不是使用OAuth库),但我不确定应该如何使用它 最终的结果需要是一个加密到SHA256 CBC的json对,以及用base64编码的json对。我所拥有的是 $key = '123456789012345678901234567890123456789012345678901234567890'; $pair = 'user:pass'; $encrypted = base64_

我在想办法让我的头绕着mcrypt_cbc有点困难。我有一个40个字符的密钥(OAuth密钥-手动执行加密/签名,而不是使用OAuth库),但我不确定应该如何使用它

最终的结果需要是一个加密到SHA256 CBC的json对,以及用base64编码的json对。我所拥有的是

$key = '123456789012345678901234567890123456789012345678901234567890';
$pair = 'user:pass';
$encrypted = base64_encode(mcrypt_cbc(MCRYPT_RIJNDAEL_128,$key,$pair,MCRYPT_ENCRYPT,""));
我肯定这是不对的,但我有以下问题:

如果我正确阅读了PHP文档,RIJNDAEL_128可以用于SHA256-这正确吗

对于密钥和IV。。我也看到了以下情况:

$encrypted = base64_encode(mcrypt_cbc(MCRYPT_RIJNDAEL_128,substr($key,0,32),$pair,MCRYPT_ENCRYPT,substr($key,32,16)));
我有点困惑——前32个字符是用来做钥匙的,剩下的16个字符是用来做静脉注射的?静脉注射总是钥匙的一部分吗?40个字符怎么办?使用静脉注射

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库,而这仅仅是由于修改了各种代码片段。p> 对于其他从事这项工作的人来说,我是这样做的:

$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中添加一个“credentials”参数,以及其他必要的参数,通过base64 sha256生成签名,然后将签名和参数一起发送到api服务器。

如果您不懂ruby,请使用任何php oauth库,比如说
Zend_Oauth
@zerkms我本来希望不使用Oauth库,而只是自己管理所有的签名,但从长远来看,我在争论这个问题。我的意思是——找到有效的库,看看他们是如何准备签名的。PS:避开图书馆的真正原因是什么?@zerkms-Hah,我很聪明。。好主意,谢谢。我试图尽可能少地保持开销——最终,C++应用程序也将接触到这些PHP脚本,以从API中提取信息。我还没有找到一个轻量级的跨平台的OAuthC++库。由于从mysql数据库读取数据需要一个固定的互联网连接,我想我也可以使用同一台主机来处理API调用。“开销尽可能小”——现在开发人员的时间比计算时间要昂贵得多。但是,这是另一个故事;-)