Encryption 当使用AES 256加密时,RSA私钥和公钥具有相同的密码文本?

Encryption 当使用AES 256加密时,RSA私钥和公钥具有相同的密码文本?,encryption,aes,rsa,private-key,public-key,Encryption,Aes,Rsa,Private Key,Public Key,当我用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 publ

当我用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,希望它是正确的…

您没有使用
openssl\u pkey\u get\u details()获取公钥。
。该结构包含公共指数
e
和私有指数
d
。私钥也包含公共指数是正常的。大多数情况下,这是一个静态值(如65537,费马的第四个数字)

根据
openssl\u pkey\u new
的文档,您可以使用
openssl\u pkey\u new()
方法获取公钥:

openssl_pkey_new()生成新的私钥和公钥对。可以使用openssl_pkey_get_public()获取密钥的公共组件

但这并不是唯一的问题:

  • 您没有使用AES。块大小为256的Rijndael不是AES。AES的块大小为128位
  • 尽管mcrypt始终需要静脉注射,但ECB模式不需要,但请继续阅读
  • ECB模式对于随机数据以外的任何数据都不安全,您应该使用CBC模式加密非对称密钥(因为它们几乎总是包含可能泄漏信息的结构);CBC模式确实需要随机IV
  • 您使用的是字符串的ASCII表示形式,而不是AES键;您应该使用基于密码的密钥派生函数,例如PBKDF2、bcrypt或scrypt。PHP
    mcrypt
    对于不安全的密钥过于宽容

  • 请注意,一般来说,我还建议使用填充模式,例如PKCS#7。但是,Mcrypt没有实现任何sane padding方法,因此您必须自己实现。

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

    -----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
    
    你应该坚持一个已经标准化的格式,而不是试图自己编造


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

    这永远不应该发生。你犯了很多错误。检查您的IVs和操作模式,以及您的明文。特别是,向我们展示您的代码。
    MCRYPT\u mode\u ECB
    这是您的第一个错误;欧洲央行并不安全。(这不会解决你的问题)我认为你根本没有得到公钥。哦,是的,我得到了公钥。。。但我试着用其他数据来解释。只有密钥对具有相同的密文。另一方面,您确实为密文指定了一个合理的哈希方法、一个平衡良好的RSA密钥大小和base64编码:)谢谢您的回答,但您能给我一个例子吗?一个具体的例子是什么?请尝试使用我给您的提示创建一个CBC加密私钥。如果卡住了,可以提问,但请注意Stackoverflow(和其他站点)上已经有很多代码可用。请注意,CBC容易受到填充攻击。认证模式是一个更好的选择。但是你对我说我之前显示的代码没有生成公钥。或者这不是真正的公钥。我怎样才能解决这个问题?