Закрытый и открытый ключи RSA имеют одинаковый зашифрованный текст при шифровании с помощью AES 256?

Нормально ли, что пара ключей RSA (частный и открытый) имеют один и тот же зашифрованный текст, когда я шифрую их с помощью AES 256?

На самом деле я использую 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 и надеюсь, что это правильно...


person Lithilion    schedule 19.08.2013    source источник
comment
Это никогда не должно происходить. Вы делаете несколько ошибок. Проверьте свои IV, свой режим работы и свои открытые тексты.   -  person SLaks    schedule 20.08.2013
comment
В частности, покажите нам свой код.   -  person SLaks    schedule 20.08.2013
comment
MCRYPT_MODE_ECB Вот ваша первая ошибка; ЕЦБ небезопасен. (это не решит вашу проблему)   -  person SLaks    schedule 20.08.2013
comment
Я не думаю, что вы вообще получаете открытый ключ.   -  person SLaks    schedule 20.08.2013
comment
О да, я получаю открытый ключ... Но я пробовал его с другими данными. Только пара ключей имеет одинаковый зашифрованный текст.   -  person Lithilion    schedule 20.08.2013
comment
Какой метод следует использовать? В учебнике по PHP указано одно из следующих: ecb, cbc, cfb, ofb, nofb или stream.   -  person Lithilion    schedule 20.08.2013


Ответы (2)


Вы не получаете открытый ключ с помощью openssl_pkey_get_details(). Эта структура содержит как открытый показатель e, так и частный показатель d. Это нормально, что закрытый ключ также содержит открытый показатель. В большинстве случаев это статическое значение (например, 65537, четвертое число Ферма).

Согласно документации openssl_pkey_new получить публичный ключ можно с помощью метода openssl_pkey_new():

openssl_pkey_new() создает новую пару закрытого и открытого ключей. Публичный компонент ключа можно получить с помощью openssl_pkey_get_public().

Однако это не единственное, что идет не так:

  1. Вы не используете AES. Rijndael с размером блока 256 не является AES. AES имеет размер блока 128 бит.
  2. Хотя mcrypt всегда ожидает IV, режим ECB этого не делает, но читайте дальше.
  3. Режим ECB небезопасен ни для чего, кроме случайных данных, вам следует использовать режим CBC для шифрования асимметричных ключей (поскольку они почти всегда содержат структуру, которая может привести к утечке информации); Режим CBC требует случайного IV.
  4. Вы используете ASCII-представление строки вместо ключа AES; вместо этого вам следует использовать функцию получения ключа на основе пароля, такую ​​как PBKDF2, bcrypt или scrypt. PHP mcrypt слишком снисходителен к незащищенным ключам.

Обратите внимание, что в целом я бы также посоветовал режим заполнения, такой как PKCS # 7. Однако Mcrypt не реализует какой-либо разумный метод заполнения, поэтому вам придется реализовать его самостоятельно.

person Maarten Bodewes    schedule 19.08.2013
comment
С другой стороны, вы указали разумный метод хеширования, хорошо сбалансированный размер ключа RSA и кодировку base64 для зашифрованного текста :) - person Maarten Bodewes; 20.08.2013
comment
Спасибо за ответ, но не могли бы вы привести пример. - person Lithilion; 20.08.2013
comment
Пример чего именно? Пожалуйста, попробуйте создать зашифрованный закрытый ключ CBC с помощью подсказок, которые я вам дал. Задавайте вопросы, если вы застряли, но обратите внимание, что на Stackoverflow (и других сайтах) уже доступно много кода. - person Maarten Bodewes; 20.08.2013
comment
Обратите внимание, что CBC уязвим для атак заполнения. Аутентифицированные режимы являются лучшим выбором. - person SLaks; 20.08.2013
comment
Но вы сказали мне, что код, который я показывал ранее, не генерирует открытый ключ. Или это не настоящий открытый ключ. Как я могу это исправить? - person Lithilion; 20.08.2013
comment
@SLaks верно, но это зависит от того, как используется зашифрованный текст. Mcrypt, похоже, не поддерживает аутентифицированные сообщения. И поскольку основные библиотеки не поддерживались около 6 лет, они, вероятно, никогда не будут... - person Maarten Bodewes; 20.08.2013

Уже существуют форматы для хранения закрытых ключей в зашифрованном виде. например.

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,E3B1C06E0D0C2633

gvmXzl6W7eV1a3N5rQNwBWKY9on3IgxZudS33cip5f88FotsPSDJMvqj6LVw2RxobDjhlOOzqmTb
VrlTnoQ6CogXFZSfiPmixiyyptCUEKJkSiEhYGM5GQm0OoGcLeLbgBb9tRpWh5IlXulKD6XFhx8q
/eGg5a+mSkX1i7kv2+Ih3jHmEKwrnfzhcA29pBF3OQJo+Ks9IYneuk676pHtsIs7CpFKq1tDvD8Q
O7URxnVnHLltaFvIxshqyZu92xbUYZR7YzjXl5+3w4TVgeAHUogEV+H9iZTosD/copUsbQO+78w2
E1D3iDS94wRgx0Tjv4xlwrTpOV38FS5rdL32492DcCRlCYM4VtuwjYeWi5shJg69jCb0EwGRqfAo
xko+lbKWELTuFKwD7n1rc/2fTarbGuf8S2AEggBLZyfXHC/9N84mXLFO2XKq+0WdiEFhQj2Cze+a
9qcSK6tPSrjK1LPlnOOppFgDElZaZ0rxsgjtiWSIAEw/Ad+SIM5u+vqwzF8J317JlsdKoBFDw8mS
MxCMuMksKJ23mgvY+THRIVgH3E7lEDZQzCi1Uy6ldLJcran/6wHwP88pVM2odiHkpnrJGcEBbbIk
qsxJZhFT8aUt/cUEBj3fnP7cxoNLQfTHMPqUTqKBWaVufFzGU9YB1R+XWFULLddwJHnV7gPheBlk
MDapowb+Is77+a9Y2VDsOXEvNpqTY0giiSrckG05IZnrhJ24JnSCwyNd99lm7XKdEGGrjBCMqIyI
Fqox8Ahkv3KWAJPYK1eOCc5d/KwZHlnlFJq7ZYy9u3fEnxQCjOEmeXLkLangKA==
-----END RSA PRIVATE KEY-----

...или еще сильнее...

PuTTY-User-Key-File-2: ssh-rsa
Encryption: aes256-cbc
Comment: phpseclib-generated-key
Public-Lines: 3
AAAAB3NzaC1yc2EAAAADAQABAAAAgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4
eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RK
NUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDy
R4e9T04ZZw==
Private-Lines: 7
llx04QMegql0/nE5RvcJSrGrodxt6ytuv/JX2caeZBUyQwQc2WBNYagLHyHPM9jI
9OUWz59FLhjFXZMDNMoUXxVmjwQpOAaVPYNxxFM9AF6/NXFji64K7huD9n4A+kLn
sHwMLWPR5a/tZA0r05DZNz9ULA3mQu7Hz4EQ8ifu3uTPJuTmL51x6RmudYKysb20
fM8VzC3ukvzzRh0pujUVTr/yQdmciASVFnZlt4xQy+ZEOVUAOfwjd//AFfXTvk6x
7A45rNlU/uicHwLgoY1APvRHCFxw7F+uVW5L4mSX7NNzqBKkZ+1qpQTAfQvIfEIb
444+CXsgIyOpqt6VxJH2u6elAtE1wau3YaFR8Alm8m97rFYzRi3oDP5NZYkTCWSV
EOpSeghXSs7IilJu8I6/sB1w5dakdeBSFkIynrlFXkO0uUw+QJJWjxY8SypzgIuP
DzduF6XsQrCyo6dnIpGQCQ==
Private-MAC: 35134b7434bf828b21404099861d455e660e8740

Вы должны придерживаться уже стандартизированного формата, а не пытаться придумать свой собственный.

И почему вы шифруете открытый ключ? Как следует из названия, открытый ключ должен быть общедоступным;)

person neubert    schedule 22.08.2013