0

mcrypt_cbcに頭を巻こうとして少し問題があります。使用する40文字のキー(OAuthキー-OAuthライブラリを使用する代わりに手動で暗号化/署名を行う)がありますが、これをどのように使用すべきかわかりません。

最終結果は、SHA256 CBCに暗号化され、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文字は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に「credentials」パラメーターを他の必要なパラメーターとともに追加し、base64 sha256を介して署名を生成し、パラメーター付きの署名をAPIサーバーに送信することができました。

于 2012-09-03T16:33:13.580 に答える