关于 OPENSSL 的简单应用

关于 OPENSSL 的简单应用

Tags
Published
Sub-item
Parent item
Author
AI summary

前言

目标 使用openssl 中的 非对称加密算法 RSA 加密 AES 秘钥,再使用 AES 对文件或者数据加解密
(RSA加密长度有限制,小于密钥长度,只适合短数据加密,所以一般配合对称加密使用)

完整加解密过程

  1. 生成随机AES秘钥
    1. ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ openssl rand -base64 256 > aes.key ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ cat aes.key +k4KfuMWRU6cWqiZ9SN6MU+8kYgk5owuZy5gVt+nudPExImEyOSvqXVnsbuEG0yP qdMgsyA+bUVQwvPnUBlVaNsqzBhMha2AzvVCVlfLJvnDtcL8hm5ZoUtFimEoYFVa UvtJgzGhdjF7ExHr5+rOTl2/+xFKkGgj/PrIC09jF6OiIS9iGT368DEk4qwyTGbP qLoRf8xNM/DKc7FWUd+Z6gvSRM7+/SDYaUqxtMVOVcidl6A7ehxXr45FA7qwDqMJ xN1MdpgZSaygsZ1oo/mI+/sZQomkDWD2QDL0y7oUMc7ykHaJTGMEM5xYo7IEm07v PdfjyMyTaNtBwPWaY/ZIoQ==
  1. 生成rsa密钥对
    1. 生成 RSA 密钥对
      1. ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ openssl genpkey -algorithm RSA -out mykey.pem -pkeyopt rsa_keygen_bits:4096 ...........+..+...+............+.......+...+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+..+.......+...+...+.....+......+....+....................+.+........+...+..........+...+...........+......+....+...+...............+.....+.............+..+...........................+......+....+...+........+.......+.....+.+..............+......+.+...+...........+.+......+........+.+.....+.+........+................+......+.....+......................+..+...+......+.......+..................+...........+....+.....+.+.....+...+..........+...+............+...+..+.+...........+...+..................+.................................+.+...............+.....+.+.................+.+.........+........+....+...+...+.........+...+..+..........+..............+....+..+.........+......+......+.......+..+.+...+...........................+........+.......+.........+.....+.+...+......+...............+.........+.........+..+...+...+.............+.....+................+......+....................+...................+...+...+........+.........+..........+........+..................+.+.........+..............+.......+...........+...+.+......+..............+...................+..+...+...............+.+.....+...+.........................+............+...+........+...............+....+...+.....+.......+......+..+...+...+.+...+.....+.........................+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .....+....+..+.....................+..........+..+.......+...+......+..+...+.+........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+.+.....+...+.......+...............+...........+...+.........+.+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+.............+...........+.......+...+.....+......+......+.......+........+...+....+..+...............+.+....................+....+..............+.........+.............+.........+..............+.......+.....+.......+...+...........................+...+........+....+..+.+...+...........+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    2. 从私钥中提取公钥并保存在文件 mykey.pub 中
      1. ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ openssl rsa -pubout -in mykey.pem -out mykey.pub writing RSA key ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ ls aes.key mykey.pem mykey.pub ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ cat mykey.pub -----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyqfYXA4mweUg61r3gym7 0AVx5aocoKCNaOJ04VGaTEI5WBRL7nJ2pQiWFHUoOIr10QOvu1L+ZkhAicdIu89K oWkXF/MJVuO7JA1Eys6fUduNESL0/kCmbNSDT+QVqVdtyeNaCIqV/cPl6OgrmmCj kgxnodqUmZTQyhqFqY6sdkUOdrEhlMEHfw+7QXvo/hng3ubK7syX5cZ6CENd+kte aNAfkeq4AyfIZSvUhn0xkv0Y/EJu7Pk1xDcnleDPs5BUrrnc8a0lYIV//AaCR7NA qgbzr1SAs54tgD/QLsGIL65wIONeFyvYzwR0R0F8m0pLIhML4FvTq1H8088G0/d8 y70Xlr16lQr2ZAakdCyeYiGEyUMMJjnbK0/MfBH5Hi7eWi6OYszVzXIZLUqrN2fr 16JJoDjxntyiLgMni6CgAfJ1dVlh70OAmK99Dly32NadW6rXQKhdC95qRPtw1tjT sKuKrPTZReLN0sRGdutB1GMP/u/YkxiDwRa9XbBAjDiAIIQyJXr3i8jf2T8/Qh8F htTqLeBZ3X9O7MJCP7IblG/80NV7OaC2jXuBTR/QdXXhazJZVHKqCFN1GdE6EEnp hOWcnF6E31Jf3TSKPSC4jWuB8jLJYUms2oeGctNGq8TTQ9YSEySMHmZ8G6df8V8e KXkreMzi8YvV8lWfVEFxGOMCAwEAAQ== -----END PUBLIC KEY-----
  1. 准备待加密数据
    1. ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ echo testMessage > plaintextfile.txt
  1. AES加密文件
    1. ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ openssl enc -aes-256-cbc -salt -pbkdf2 -in plaintextfile.txt -out encryptedfile.enc -pass file:aes.key ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ ls aes.key encryptedfile.enc mykey.pem mykey.pub plaintextfile.txt ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ cat encryptedfile.enc Salted__�~�C$���K��#��V:- �V
  1. 使用 RSA 公钥加密 AES 密钥
    1. ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ openssl pkeyutl -encrypt -inkey mykey.pub -pubin -in aes.key -out encrypted_aes_key.enc ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ ls aes.key encrypted_aes_key.enc encryptedfile.enc mykey.pem mykey.pub plaintextfile.txt ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ cat encrypted_aes_key.enc V��bx�0i^�rSCXɾ�ȳ��\���H#�|<�Fl��w���DN~�,��z�����g�?�H�f}~?p�ȳംװ��qs�%(��6�fFW ���JO%nZ�Rv#��5���%�)UI��j&�qW�G�P��=�՗����喅��$��⧎ o���ɛ��J�M+�_VEXG����GJ#p��ANc�k��4��dj�$�0��ݛ+�����B���m[:�ͥ�J�t>V�_��>�͢!&Ƀjb�{�u쀄̋�ն6Y�_=�QoO ��z�� ��Ę�[Ɉ�`>�mms���em� ��ea�н��Q�oN�k�=�>�ġ�R�~7k{BMV4�)�k#�������s�ٔڊ�z���E�k.?Dϒ`�I|���� ���(��ˁנ٨���a��&����Y�>>fz��
  1. 使用 RSA 私钥解密 AES 密钥
    1. ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ openssl pkeyutl -decrypt -inkey mykey.pem -in encrypted_aes_key.enc -out decrypted_aes.key ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ ls aes.key decrypted_aes.key encrypted_aes_key.enc encryptedfile.enc mykey.pem mykey.pub plaintextfile.txt ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ cat decrypted_aes.key +k4KfuMWRU6cWqiZ9SN6MU+8kYgk5owuZy5gVt+nudPExImEyOSvqXVnsbuEG0yP qdMgsyA+bUVQwvPnUBlVaNsqzBhMha2AzvVCVlfLJvnDtcL8hm5ZoUtFimEoYFVa UvtJgzGhdjF7ExHr5+rOTl2/+xFKkGgj/PrIC09jF6OiIS9iGT368DEk4qwyTGbP qLoRf8xNM/DKc7FWUd+Z6gvSRM7+/SDYaUqxtMVOVcidl6A7ehxXr45FA7qwDqMJ xN1MdpgZSaygsZ1oo/mI+/sZQomkDWD2QDL0y7oUMc7ykHaJTGMEM5xYo7IEm07v PdfjyMyTaNtBwPWaY/ZIoQ==
  1. 使用解密后的 AES 密钥解密文件
    1. ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ openssl enc -d -aes-256-cbc -pbkdf2 -in encryptedfile.enc -out decryptedfile.txt -pass file:decrypted_aes.key ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ ls aes.key decryptedfile.txt encryptedfile.enc mykey.pub decrypted_aes.key encrypted_aes_key.enc mykey.pem plaintextfile.txt ┌──(lzy㉿kali)-[~/tmp/pp/test] └─$ cat decryptedfile.txt testMessage
 

参数详解

  1. ssh-keygen
      • [-m format] 指定密钥的输出格式 PEM 是 "Privacy Enhanced Mail" 的缩写,是一种编码格式。现代版本的 OpenSSH 默认生成的是 OpenSSH 自有的密钥格式
        • PEM:Privacy Enhanced Mail。是一种常见的编码格式,兼容性较广,与许多非 OpenSSH 工具(如 OpenSSLparamiko 等)兼容性好
        • RFC4716:这种格式也称为 SSH2 格式,是另一种标准化的 SSH 密钥格式,定义在 RFC 4716 文档中
        • PKCS8:Public-Key Cryptography Standards #8,一种广泛使用的标准私钥格式,在密码学软件中很常见
      • [-f output_keyfile] 指定输出文件 [ 类型转换的时候同时是输入输出 ( 就是修改当前文件 ) ]
      • -p 这个标志用于更改现有私钥文件的密码(passphrase)
      • [-b bits] 指定密钥的长度(以位为单位)
        • RSA:2048 位(默认)、4096 位等。
        • DSA:1024 位。
        • ECDSA 和 Ed25519:密钥长度是固定的,不由用户指定。
      • [-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa] 指定生成密钥的类型。后面的参数可以是以下几种类型之一:
        • dsa:生成基于 DSA (Digital Signature Algorithm) 的密钥。
        • ecdsa:生成基于 ECDSA (Elliptic Curve Digital Signature Algorithm) 的密钥。
        • ecdsa-sk:生成带有安全密钥 (security key or FIDO/U2F) 支持的 ECDSA 密钥。
        • ed25519:生成基于 Ed25519 椭圆曲线的密钥。
        • ed25519-sk:生成带有安全密钥 (security key or FIDO/U2F) 支持的 Ed25519 密钥。
        • rsa:生成基于 RSA (Rivest–Shamir–Adleman) 算法密钥,目前这是最常用的密钥类型
      usage: ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile] [-m format] [-N new_passphrase] [-O option] [-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa] [-w provider] [-Z cipher] ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase] [-P old_passphrase] [-Z cipher] ssh-keygen -i [-f input_keyfile] [-m key_format] ssh-keygen -e [-f input_keyfile] [-m key_format] ssh-keygen -y [-f input_keyfile] ssh-keygen -c [-a rounds] [-C comment] [-f keyfile] [-P passphrase] ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile] ssh-keygen -B [-f input_keyfile] ssh-keygen -D pkcs11 ssh-keygen -F hostname [-lv] [-f known_hosts_file] ssh-keygen -H [-f known_hosts_file] ssh-keygen -K [-a rounds] [-w provider] ssh-keygen -R hostname [-f known_hosts_file] ssh-keygen -r hostname [-g] [-f input_keyfile] ssh-keygen -M generate [-O option] output_file ssh-keygen -M screen [-f input_file] [-O option] output_file ssh-keygen -I certificate_identity -s ca_key [-hU] [-D pkcs11_provider] [-n principals] [-O option] [-V validity_interval] [-z serial_number] file ... ssh-keygen -L [-f input_keyfile] ssh-keygen -A [-a rounds] [-f prefix_path] ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number] file ... ssh-keygen -Q [-l] -f krl_file [file ...] ssh-keygen -Y find-principals -s signature_file -f allowed_signers_file ssh-keygen -Y match-principals -I signer_identity -f allowed_signers_file ssh-keygen -Y check-novalidate -n namespace -s signature_file ssh-keygen -Y sign -f key_file -n namespace file [-O option] ... ssh-keygen -Y verify -f allowed_signers_file -I signer_identity -n namespace -s signature_file [-r krl_file] [-O option]
 
  1. openssl
    1. HELP [ openssl ]
      ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ openssl help: Standard commands asn1parse ca ciphers cmp cms crl crl2pkcs7 dgst dhparam dsa dsaparam ec ecparam enc engine errstr fipsinstall gendsa genpkey genrsa help info kdf list mac nseq ocsp passwd pkcs12 pkcs7 pkcs8 pkey pkeyparam pkeyutl prime rand rehash req rsa rsautl s_client s_server s_time sess_id smime speed spkac srp storeutl ts verify version x509 Message Digest commands (see the `dgst' command for more details) blake2b512 blake2s256 md4 md5 rmd160 sha1 sha224 sha256 sha3-224 sha3-256 sha3-384 sha3-512 sha384 sha512 sha512-224 sha512-256 shake128 shake256 sm3 Cipher commands (see the `enc' command for more details) aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb aes-256-cbc aes-256-ecb aria-128-cbc aria-128-cfb aria-128-cfb1 aria-128-cfb8 aria-128-ctr aria-128-ecb aria-128-ofb aria-192-cbc aria-192-cfb aria-192-cfb1 aria-192-cfb8 aria-192-ctr aria-192-ecb aria-192-ofb aria-256-cbc aria-256-cfb aria-256-cfb1 aria-256-cfb8 aria-256-ctr aria-256-ecb aria-256-ofb base64 bf bf-cbc bf-cfb bf-ecb bf-ofb camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb camellia-256-cbc camellia-256-ecb cast cast-cbc cast5-cbc cast5-cfb cast5-ecb cast5-ofb des des-cbc des-cfb des-ecb des-ede des-ede-cbc des-ede-cfb des-ede-ofb des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb des-ofb des3 desx rc2 rc2-40-cbc rc2-64-cbc rc2-cbc rc2-cfb rc2-ecb rc2-ofb rc4 rc4-40 seed seed-cbc seed-cfb seed-ecb seed-ofb sm4-cbc sm4-cfb sm4-ctr sm4-ecb sm4-ofb
      • 粗略解析
        • 密钥和参数生成

        • genpkey: 生成私钥。
        • genrsa: 生成 RSA 私钥。
        • gendsa: 生成 DSA 私钥。
        • ecparam: 处理 EC 参数文件。
        • 密钥管理

        • pkey: 私钥操作(如显示私钥或提取公钥)。
        • pkeyparam: 参数生成和查看。
        • pkeyutl: 私钥工具(如加密、解密、签名和验签)。
        • 证书相关

        • x509: 处理 X.509 证书 (创建、显示、签名、验证)。
        • ca: 证书颁发机构 (CA) 管理。
        • req: 处理证书签名请求(CSR),生成、验证、签名请求。
        • verify: 证书链验证。
        • crl: 生成、检查和处理证书吊销列表 (CRL)。
        • crl2pkcs7: 将 CRL 转换为 PKCS#7 文件。
        • pkcs12: 处理 PKCS#12 文件(常用来交换私钥和证书)。
        • pkcs7: 处理 PKCS#7 文件(通常用于签名、加密、解密)。
        • ts: 时间戳请求、响应和验证。
        • 加密和解密

        • enc: 加密和解密文件。
        • rsautl: RSA 低级加密工具。
        • cms: 处理 PKCS#7 格式,它是 CMS 的子集及其功能的处理。
        • 哈希和签名

        • dgst: 计算消息摘要 (MD5、SHA 等),还可以签名和验签。
        • mac: 计算消息验证码 (MAC)。
        • asn1parse: 解析 ASN.1 编码的数据。
        • 协议和连接

        • s_client: SSL/TLS 客户端测试工具。
        • s_server: SSL/TLS 服务器测试工具。
        • s_time: SSL 连接性能测试。
        • ocsp: 在线证书状态协议 (OCSP) 查询和应答。
        • 其他工具

        • asn1parse: 解析 ASN.1 结构。
        • ciphers: 列出并描述 OpenSSL 支持的 SSL/TLS 密码套件。
        • cmp: 使用证书管理协议 (CMP) 进行操作。
        • dhparam: 生成和处理 DH 参数。
        • dsa: 处理 DSA 密钥。
        • dsaparam: 生成和处理 DSA 参数。
        • engine: 处理引擎设置和操作。
        • errstr: 转换错误代码为错误信息。
        • info: 显示 OpenSSL 建筑信息。
        • list: 显示 OpenSSL 性能列表。
        • nseq: 处理 ASN.1 NDEF 序列。
        • passwd: 生成密码哈希。
        • prime: 计算和检查素数。
        • rand: 生成随机数据。
        • rehash: 生成哈希表文件的 symlinks。
        • sess_id: SSL 会话 ID 操作。
        • smime: S/MIME 邮件处理。
        • speed: 测试 OpenSSL 的性能。
        • spkac: 处理 Netscape SPKAC 命令。
        • srp: 安全远程密码 (SRP) 协议工具。
        • storeutl: 处理证书和私钥的文件存储。
        • version: 显示 OpenSSL 版本信息。
       
    2. enc openssl 中用于加密和解密的子命令。它提供了一些对称加密算法
        • -d 表示要对数据进行解密操作。如果不加这个选项,则默认执行加密操作
        • -aes-256-cbc 指定使用 AES(Advanced Encryption Standard)算法,其中 256 表示使用 256 位密钥,cbc 表示使用 CBC(Cipher Block Chaining)模式。AES-256-CBC 是一种安全性较高的加密方式
        • -pbkdf2 表示使用 PBKDF2(Password-Based Key Derivation Function 2)来生成密钥。这是一个密码强化函数,增加了从密码到密钥生成的复杂度和安全性 ( 可选参数 )
        • -inkey 输入的key文件
        • -in / -out 输入输出文件
        • -pass file:xxx 指定密码来源。file:表示密码存储在一个文件中
    3. pkeyutl openssl 中用于公钥操作的子命令,包括加密、解密、签名和验证
      1. HELP
        ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ openssl pkeyutl -help Usage: pkeyutl [options] General options: -help Display this summary -engine val Use engine, possibly a hardware device -engine_impl Also use engine given by -engine for crypto operations -sign Sign input data with private key -verify Verify with public key -encrypt Encrypt input data with public key -decrypt Decrypt input data with private key -derive Derive shared secret -config infile Load a configuration file (this may load modules) Input options: -in infile Input file - default stdin -rawin Indicate the input data is in raw form -pubin Input is a public key -inkey val Input private key file -passin val Input file pass phrase source -peerkey val Peer key file used in key derivation -peerform PEM|DER|ENGINE Peer key format (DER/PEM/P12/ENGINE) -certin Input is a cert with a public key -rev Reverse the order of the input buffer -sigfile infile Signature file (verify operation only) -keyform PEM|DER|ENGINE Private key format (ENGINE, other values ignored) Output options: -out outfile Output file - default stdout -asn1parse asn1parse the output data -hexdump Hex dump output -verifyrecover Verify with public key, recover original data Signing/Derivation options: -digest val Specify the digest algorithm when signing the raw input data -pkeyopt val Public key options as opt:value -pkeyopt_passin val Public key option that is read as a passphrase argument opt:passphrase -kdf val Use KDF algorithm -kdflen +int KDF algorithm output length Random state options: -rand val Load the given file(s) into the random number generator -writerand outfile Write random data to the specified file Provider options: -provider-path val Provider load path (must be before 'provider' argument if required) -provider val Provider to load (can be specified multiple times) -propquery val Property query used when fetching algorithms
        • -encrypt / -decrypt 指定加解密
        • -inkey 输入的key文件
        • -in / -out 输入输出文件

其他

  1. 也可以这样去生成密钥对
    1. ssh-keygen -t rsa -b 1024 -f testkey ( 长度最小为 1024 )
      1. CODE
        ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ ssh-keygen -t rsa -b 1024 -f testkey Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in testkey Your public key has been saved in testkey.pub The key fingerprint is: SHA256:i2eIqftzHTHpQVszsk4I824urKMuxOVzhGtQQ4cNZKs lzy@kali The key's randomart image is: +---[RSA 1024]----+ | o=+. | | .+=. o + | | ..o+ o * o | | ..o .o O | |.E+ o. +S+ | | o = +oo+. | |. ..=oo.+. | |. ..+ oo. | |+o+=.+ | +----[SHA256]-----+ ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ ls testkey testkey.pub ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ vim testkey ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ cat testkey -----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAlwAAAAdzc2gtcn NhAAAAAwEAAQAAAIEAxD6SKjyaTAD7OpAyjOgDh7GPQJaVTTYZkhCbXedpDx577BQH1Z2S 4Q5DD5wDAcSOpxI+qPw+Cl5jz+favqE1Bm93DVzBR8DYAZv4/6XNiQCm3ZYV0n93AmCU5i ObgsIcle5ocFfi+GlHD4Pa4M0sKH6lqGAN6SOzNJhqnl67hnkAAAIAXGc8GFxnPBgAAAAH c3NoLXJzYQAAAIEAxD6SKjyaTAD7OpAyjOgDh7GPQJaVTTYZkhCbXedpDx577BQH1Z2S4Q 5DD5wDAcSOpxI+qPw+Cl5jz+favqE1Bm93DVzBR8DYAZv4/6XNiQCm3ZYV0n93AmCU5iOb gsIcle5ocFfi+GlHD4Pa4M0sKH6lqGAN6SOzNJhqnl67hnkAAAADAQABAAAAgG6cQfBShj lumCvzGLr5DvxNpUunVHHXm2QLvjaYd0vRR9HRnHTXwvDdBAlpSvyVGD6s9upyelmHyERo D5BA9swz+QDxaYHRQoijSib0uaMeruNLfbPvE3xT9PmhZyVusTciYDs0jA9esMPODBM/fP zrPDsS9O4jjCgfwkHkfVxxAAAAQQCm0X2wfeNb70pn65k8NfPrxKyEhjB347lCkbqWCOCr 9ZcGAh0selfJGk9PkNSEIWinWGJauRzM7Ywf9fpCllDkAAAAQQDn1iqwOLl4efn/ETGSCG q3eqF3r7CVHxPWi0QwxLDg8RDBxKq+3VRPRZLE5T2UABlGnZkg9rcwPZSV2sGeI/89AAAA QQDYsr0UtQ3PQAr36o38etxZKwBbEvqw8Ya2cDDSa6g1YhAvoZBhk9MViOjjafmpX2yhph 4m/meU5llwW1Us/NftAAAACGx6eUBrYWxpAQI= -----END OPENSSH PRIVATE KEY----- ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ cat testkey.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDEPpIqPJpMAPs6kDKM6AOHsY9AlpVNNhmSEJtd52kPHnvsFAfVnZLhDkMPnAMBxI6nEj6o/D4KXmPP59q+oTUGb3cNXMFHwNgBm/j/pc2JAKbdlhXSf3cCYJTmI5uCwhyV7mhwV+L4aUcPg9rgzSwofqWoYA3pI7M0mGqeXruGeQ== lzy@kali
    2. ssh-keygen -p -m PEM -f testkey 转换为 RSA KEY 格式 (通常也是 PEM 结尾)
      1. CODE
        ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ ssh-keygen -p -m PEM -f testkey Key has comment 'lzy@kali' Enter new passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved with the new passphrase. ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ cat testkey -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQDEPpIqPJpMAPs6kDKM6AOHsY9AlpVNNhmSEJtd52kPHnvsFAfV nZLhDkMPnAMBxI6nEj6o/D4KXmPP59q+oTUGb3cNXMFHwNgBm/j/pc2JAKbdlhXS f3cCYJTmI5uCwhyV7mhwV+L4aUcPg9rgzSwofqWoYA3pI7M0mGqeXruGeQIDAQAB AoGAbpxB8FKGOW6YK/MYuvkO/E2lS6dUcdebZAu+Nph3S9FH0dGcdNfC8N0ECWlK /JUYPqz26nJ6WYfIRGgPkED2zDP5APFpgdFCiKNKJvS5ox6u40t9s+8TfFP0+aFn JW6xNyJgOzSMD16ww84MEz98/Os8OxL07iOMKB/CQeR9XHECQQDn1iqwOLl4efn/ ETGSCGq3eqF3r7CVHxPWi0QwxLDg8RDBxKq+3VRPRZLE5T2UABlGnZkg9rcwPZSV 2sGeI/89AkEA2LK9FLUNz0AK9+qN/HrcWSsAWxL6sPGGtnAw0muoNWIQL6GQYZPT FYjo42n5qV9soaYeJv5nlOZZcFtVLPzX7QJAE6BBxOFIcjaBP2KJO7+SqS2sdaFd 5YHYABWSFD7Sanh93qlzeuzpsjxFjH2LlPfdK+kziWLZZzAPYBBAy85oUQJAJjdv jUVZCCH9TTe6jrqEPd2NlIJGYApYfbhPg+ykn7WJsTzHH85YPcYFfIXmF+7SU7fe PXZEgkgVofEZlnOJCQJBAKbRfbB941vvSmfrmTw18+vErISGMHfjuUKRupYI4Kv1 lwYCHSx6V8kaT0+Q1IQhaKdYYlq5HMztjB/1+kKWUOQ= -----END RSA PRIVATE KEY-----
    3. openssl rsa -pubout -in testkey -out testkey.pub.pem 同上文的,从私钥提取公钥
      1. CODE
        ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ openssl rsa -pubout -in testkey -out testkey.pub.pem writing RSA key ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ ls testkey testkey.pub testkey.pub.pem ┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ cat testkey.pub.pem -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEPpIqPJpMAPs6kDKM6AOHsY9A lpVNNhmSEJtd52kPHnvsFAfVnZLhDkMPnAMBxI6nEj6o/D4KXmPP59q+oTUGb3cN XMFHwNgBm/j/pc2JAKbdlhXSf3cCYJTmI5uCwhyV7mhwV+L4aUcPg9rgzSwofqWo YA3pI7M0mGqeXruGeQIDAQAB -----END PUBLIC KEY-----
 
总的来说 ssh-keygen 主要还是用在 ssh 上,至于生成rsa密钥对 使用 openssl 即可
openssl genpkey -algorithm RSA
HELP [ openssl genpkey ]
┌──(lzy㉿kali)-[~/tmp/pp/test/tt] └─$ openssl genpkey -h Usage: genpkey [options] General options: -help Display this summary -engine val Use engine, possibly a hardware device -paramfile infile Parameters file -algorithm val The public key algorithm -quiet Do not output status while generating keys -pkeyopt val Set the public key algorithm option as opt:value -config infile Load a configuration file (this may load modules) Output options: -out outfile Output file -outform PEM|DER output format (DER or PEM) -pass val Output file pass phrase source -genparam Generate parameters, not key -text Print the in text -* Cipher to use to encrypt the key Provider options: -provider-path val Provider load path (must be before 'provider' argument if required) -provider val Provider to load (can be specified multiple times) -propquery val Property query used when fetching algorithms Order of options may be important! See the documentation.