0

AES 256 で暗号化すると、RSA (プライベートとパブリック) のキーペアが同じ暗号文を持つのは正常ですか?

実際、私はPHPを使用しています:

<?php


$key="abc";

$config = array(
    "digest_alg" => "sha512",
    "private_key_bits" => 4096,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);

// Create the private and public key
$res = openssl_pkey_new($config);

// Extract the private key from $res to $privKey
openssl_pkey_export($res, $privKey);

// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey= $pubKey["key"];


   aes256Key = hash("SHA256", $password, true);

// for good entropy (for MCRYPT_RAND)
srand((double) microtime() * 1000000);
// generate random iv
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_RAND);






   $crypted_priv= rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $privKey, MCRYPT_MODE_CBC, $iv)), "\0\3");
   $crypted_pub= rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $pubKey, MCRYPT_MODE_CBC, $iv)), "\0\3");



?>

更新: ECB を CBC に置き換えましたが、正しいことを願っています...

4

2 に答える 2

1

で公開鍵を取得していませんopenssl_pkey_get_details()。その構造には、公開指数eと非公開指数の両方が含まれていdます。秘密鍵に公開指数も含まれているのは正常です。ほとんどの場合、これは静的な値です (65537、フェルマーの 4 番目の数値など)。

ドキュメントによると、openssl_pkey_new次のメソッドを使用して公開鍵を取得できますopenssl_pkey_new()

openssl_pkey_new() は、新しい秘密鍵と公開鍵のペアを生成します。鍵の公開コンポーネントは、openssl_pkey_get_public() を使用して取得できます。

ただし、これだけが間違っているわけではありません。

  1. AES を使用していません。ブロック サイズが 256の Rijndaelは AES ではありません。AES のブロック サイズは 128 ビットです。
  2. mcrypt常に IV を期待しますが、ECB モードはそうではありませんが、読み続けます。
  3. ECB モードは、ランダム データ以外には安全ではありません。非対称キーの暗号化には CBC モードを使用する必要があります (ほとんどの場合、情報が漏洩する可能性のある構造が含まれているため)。CBC モードではランダム IV が必要です。
  4. AES キーの代わりに文字列の ASCII 表現を使用しています。代わりに、PBKDF2、bcrypt、または scrypt などのパスワード ベースのキー派生関数を使用する必要があります。PHPmcryptは、安全でないキーに関して寛大すぎます。

一般に、PKCS#7 などのパディング モードもお勧めします。ただし、Mcrypt は適切なパディング メソッドを実装していないため、自分で実装する必要があります。

于 2013-08-19T23:08:31.047 に答える