【问题标题】:RSA Private and Public Keys have the same cipher text when encrypted with AES 256?使用 AES 256 加密时,RSA 私钥和公钥具有相同的密文吗?
【发布时间】:2013-08-19 21:34:30
【问题描述】:

当我使用 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");



?>

更新:我用 CBC 替换了 ECB,希望它是正确的...

【问题讨论】:

  • 那应该永远发生。你犯了多个错误。检查您的 IV 和您的操作模式,以及您的明文。
  • 特别是,向我们展示您的代码。
  • MCRYPT_MODE_ECB 这是你的第一个错误;欧洲央行并不安全。 (这不会解决你的问题)
  • 我认为您实际上根本没有获得公钥。
  • 哦,是的,我得到了一个公钥......但我用其他数据尝试过。只有密文相同的密钥对。

标签: encryption aes rsa private-key public-key


【解决方案1】:

您没有通过openssl_pkey_get_details() 获取公钥。该结构包含公共指数e 和私人指数d。私钥也包含公共指数是正常的。大多数时候是一个静态值(比如65537,费马的第四个数)。

根据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. 您正在使用字符串的 ASCII 表示而不是 AES 密钥;您应该改用基于密码的密钥派生函数,例如 PBKDF2、bcrypt 或 scrypt。 PHP mcrypt 对不安全的密钥过于宽容了。

请注意,通常我也会建议使用填充模式,例如 PKCS#7。然而,Mcrypt 没有实现任何合理的填充方法,因此您必须自己实现。

【讨论】:

  • 另一方面,您确实指定了一个健全的哈希方法、一个平衡良好的 RSA 密钥大小和密文的 base64 编码:)
  • 感谢您的回答,但请给我一个例子。
  • 一个例子究竟是什么?请尝试使用我给您的提示创建一个 CBC 加密私钥。如果遇到困难,请提出问题,但请注意 Stackoverflow(和其他网站)上已经有很多代码可用。
  • 请注意,CBC 容易受到填充攻击。认证模式是更好的选择。
  • 但是你对我说我之前显示的代码没有生成公钥。或者这不是真正的公钥。我该如何解决?
【解决方案2】:

已经有用于存储加密私钥的格式。例如。

-----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

您应该坚持使用已经标准化的格式,而不是尝试自己编造。

你为什么要加密公钥?顾名思义,公钥应该是公开的;)

【讨论】:

    猜你喜欢
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多