`openssl req` 生成的密钥应用了什么加密?

信息安全 openssl
2021-08-14 13:28:38

当使用 生成密钥时openssl genrsa,使用命令行参数选择加密,例如-aes128生成密钥后,我们可以看到文件中使用了什么加密。前任:

cat host.key

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,AF4EBC2AE861F6FE8C751F7DAD5D4721
... 
-----END RSA PRIVATE KEY-----

当通过 生成密钥时openssl req -newkey rsa:2048 -keyout host.key,该文件不会说明使用了什么加密。

-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----

它是什么?

如何openssl rsa -in host.key知道如何解密密钥?


更新

openssl req 默认情况下使用 DES-EDE3-CBC 进行加密。

openssl req -new -x509 -out server.cer -keyout server.key -subj "/CN=toto/" 

Generating a 1024 bit RSA private key
..................++++++
..++++++
writing new private key to 'server.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----

cat server.key

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

问题出在我的原始命令上。它指定了一个以某种方式影响密钥生成的配置,但我仍然无法理解。

默认情况下,配置将假定encrypt_key = yes. 这导致使用未指定的算法对密钥进行加密。encrypt_key = no在节下指定[req]等同于-nodes参数。

但仍存在以下问题:

  • 指定配置时,openssl req 应用了什么加密?
  • 算法可以控制吗?
  • 如何openssl rsa猜测正确的解密密码?它显然必须在数据中的某个地方进行编码......

起初,openssl req为我生成密钥似乎很好。genrsa提供更多控制。

1个回答

指定配置时,openssl req 应用了什么加密?

通过源代码在我看来,它要么是三重 DES,要么什么都没有。(不管您的配置文件中可能配置了什么。)

$ git log apps/req.c | head -n3
commit f1cece554ddf282f1512b4da04664467746ffd24
Author: Richard Levitte <levitte@openssl.org>
Date:   Tue Jul 7 11:13:20 2015 +0200

$ grep -n -C1 cipher apps/req.c
197-    X509_REQ *req = NULL;
198:    const EVP_CIPHER *cipher = NULL;
199-    const EVP_MD *md_alg = NULL, *digest = NULL;
--
216-#ifndef OPENSSL_NO_DES
217:    cipher = EVP_des_ede3_cbc();
218-#endif
--
590-        if ((p != NULL) && (strcmp(p, "no") == 0))
591:            cipher = NULL;
592-        if (nodes)
593:            cipher = NULL;
594-
--
597-        assert(private);
598:        if (!PEM_write_bio_PrivateKey(out, pkey, cipher,
599-                                      NULL, 0, NULL, passout)) {

算法可以控制吗?

不。往上看。

openssl rsa 如何猜测正确的解密密码?它显然必须在数据中的某个地方进行编码......

是的。它在文件中。该文件本身是一个 ASN.1 文件。您可以使用 OpenSSL 来解析它。

$ openssl asn1parse -in keyviareqnewkeycommand.pem -i | cut -c-90
    0:d=0  hl=4 l=1294 cons: SEQUENCE
    4:d=1  hl=2 l=  64 cons:  SEQUENCE
    6:d=2  hl=2 l=   9 prim:   OBJECT            :PBES2
   17:d=2  hl=2 l=  51 cons:   SEQUENCE
   19:d=3  hl=2 l=  27 cons:    SEQUENCE
   21:d=4  hl=2 l=   9 prim:     OBJECT            :PBKDF2
   32:d=4  hl=2 l=  14 cons:     SEQUENCE
   34:d=5  hl=2 l=   8 prim:      OCTET STRING      [HEX DUMP]:D48091CF79B0E2D2
   44:d=5  hl=2 l=   2 prim:      INTEGER           :0800
   48:d=3  hl=2 l=  20 cons:    SEQUENCE
   50:d=4  hl=2 l=   8 prim:     OBJECT            :des-ede3-cbc
   60:d=4  hl=2 l=   8 prim:     OCTET STRING      [HEX DUMP]:EEF03DDF397E19DB
   70:d=1  hl=4 l=1224 prim:  OCTET STRING      [HEX DUMP]:A8DACADF4BABA008CF155C960FD112C

现在PBKDF2是密钥拉伸/密钥派生算法,des-ede3-cbc是加密算法。