20232303 关于OpenSSL的学习

发布时间 2023-11-23 20:36:48作者: 20232303朱佳禾

关于OpenSSL的学习

sm2加密解密

请忽略原来遗留下的文件,它们与本任务无关,只看新生成的文件就好。

问题与解答

- openssl ecparam -name SM2 -genkey -out sm2-key.pem

  • 这是一个使用 OpenSSL 工具生成 SM2 密钥的命令。

    openssl ecparam 是 OpenSSL 的椭圆曲线操作命令。-name SM2 表示使用 SM2 曲线来生成密钥,-genkey 表示要生成密钥,-out sm2-key.pem 表示将生成的密钥保存到名为 sm2-key.pem 的文件中。

    执行该命令后,sm2-key.pem 文件将包含所生成的 SM2 密钥对的信息。密钥对包括私钥和公钥,因此可以用于加密和解密数据、签名和验证数据等操作。

- .pem

  • .pem 具体来说是一种常见的文件扩展名,在密码学和网络安全中使用广泛。它代表了隐私增强电子邮件(Privacy Enhanced Mail)的缩写。PEM 文件通常采用 Base64 编码的 ASCII 格式,可以包含不同类型的数据,如加密密钥、数字证书以及其他相关的敏感信息。

    PEM 文件的内容可以是不同的加密算法的公钥、私钥或数字证书。常见的 PEM 文件类型包括:

    .pem: 通常用于表示 X.509 格式的数字证书,也可以用于表示其他类型的 PEM 格式文件。
    .key: 常用于表示加密算法的私钥,如 RSA、DSA 或者 ECDSA 密钥。
    .cert: 通常用于表示数字证书,可能包含公钥、颁发者信息和有效期等。

    需要注意的是,PEM 文件只是密钥和证书的一种常见表示方式,后缀名本身并不决定文件的内容。因此,在处理 PEM 文件时,需要查看文件的实际内容以确定其类型和用途。

- echo

  • echo 是一个用于在终端打印输出的命令。当你在终端中使用 echo 命令时,它会将其后的文本作为参数,并将其打印到标准输出(通常是终端窗口)上。

    例如,你可以使用以下命令直接在终端上输出文本:

    echo "Hello, world!"
    

    这将在终端上打印出 "Hello, world!"。

    你还可以将 echo 与其他命令结合使用,将命令的输出作为参数传递给 echo 命令,以便输出结果。例如:

    echo $(ls)
    

    这将先执行 ls 命令列出当前目录的内容,然后将结果作为参数传递给 echo 命令,最终将列表打印到终端上。

- echo "Hello, SM2 encryption!" > plaintext.txt

  • 这是一个将字符串 "Hello, SM2 encryption!" 写入到 plaintext.txt 文件中的命令。

    echo 命令用于在终端上输出文本,> 符号将其输出重定向到指定文件名。这里的 plaintext.txt 是要写入该文本的文件名, > 符号告诉操作系统将 echo 命令的输出写入该文件中。

    因此,执行该命令后,在当前目录下将生成一个名为 plaintext.txt 的文件,并且文件中的内容为 "Hello, SM2 encryption!"。

    这个文件可以被后续的加密操作使用。

- openssl sm2 -encrypt -in plaintext.txt -out ciphertext.sm2 -aes256 -inkey sm2-key.pem (这句命令是之前版本的,在图片里没有)

  • 这是一个使用 OpenSSL 工具对文件进行 SM2 加密的命令。

    openssl sm2 是 OpenSSL 提供的 SM2 加密命令。-encrypt 表示要执行加密操作,-in plaintext.txt 表示要加密的输入文件是 plaintext.txt-out ciphertext.sm2 表示加密后的输出文件名为 ciphertext.sm2-aes256 表示使用 AES-256 密钥加密算法对输入进行加密,-inkey sm2-key.pem 表示用于加密的 SM2 密钥的文件为 sm2-key.pem

    执行该命令后,OpenSSL 将使用指定的 SM2 密钥对 plaintext.txt 文件进行加密,并将加密后的结果保存到 ciphertext.sm2 文件中。在加密过程中,使用 AES-256 算法使用指定的密钥进行对称加密。

    请确保 plaintext.txt 文件和 sm2-key.pem 文件存在,并替换为正确的文件名。

- openssl pkeyutl -in plaintext.txt -out ciphertext.sm2 -inkey sm2-key.pem -encrypt

  • 这是使用 OpenSSL 工具进行 SM2 加密的另一种命令。与之前的命令相比,该命令少了 -aes256 参数,这是因为使用 -encrypt 参数时,OpenSSL 将会使用默认的加密算法进行加密(该算法取决于密钥类型,对于 SM2 密钥,OpenSSL 会使用 C1C2C3 格式进行加密)。

    openssl pkeyutl 是 OpenSSL 中的一个通用密钥操作工具,-in plaintext.txt 表示要加密的输入文件是 plaintext.txt-out ciphertext.sm2 表示加密后的输出文件名为 ciphertext.sm2-inkey sm2-key.pem 表示用于加密的 SM2 密钥的文件为 sm2-key.pem-encrypt 表示执行加密操作。

    执行该命令后,OpenSSL 将使用指定的 SM2 密钥对 plaintext.txt 文件进行加密,并将加密后的结果保存到 ciphertext.sm2 文件中。

    请确保 plaintext.txt 文件和 sm2-key.pem 文件存在,并替换为正确的文件名。

- openssl pkeyutl -in ciphertext.sm2 -out decrypted.txt -inkey sm2-key.pem -decrypt

  • 这是使用 OpenSSL 工具进行 SM2 解密的命令。

    openssl pkeyutl 是 OpenSSL 中的一个通用密钥操作工具,-in ciphertext.sm2 表示要解密的输入文件是 ciphertext.sm2-out decrypted.txt 表示解密后的输出文件名为 decrypted.txt-inkey sm2-key.pem 表示用于解密的 SM2 密钥的文件为 sm2-key.pem-decrypt 表示执行解密操作。

    执行该命令后,OpenSSL 将使用指定的 SM2 密钥对 ciphertext.sm2 文件进行解密,并将解密后的结果保存到 decrypted.txt 文件中。对于支持解密的 SM2 密钥而言,OpenSSL 会使用 C1C2C3 格式进行解密,并将原始的明文数据恢复出来。

    请确保 ciphertext.sm2 文件和 sm2-key.pem 文件存在,并替换为正确的文件名。

- cat命令

  • "cat" 命令是一个常用的命令行工具,用于显示文件的内容。它的基本语法如下:

    cat [选项] [文件名]
    

    其中,选项可以是以下之一:
    -n:显示行号
    -b:显示行号,但不对空白行编号
    -s:压缩连续的空白行为一行

    例如,如果你要查看文件 "example.txt" 的内容,你可以运行:

    cat example.txt
    

    这将在终端上显示 "example.txt" 文件的内容。请确保在命令行中使用正确的文件名和文件路径。

- 请问我刚才的加密是对称加密还是非对称加密

  • 根据你刚才提供的命令 openssl pkeyutl -in plaintext.txt -out ciphertext.sm2 -inkey sm2-key.pem -encrypt,可以看出这是一条非对称加密的命令。

    命令 openssl pkeyutl 是 OpenSSL 中的一个通用密钥操作工具,它可以用于执行许多不同的加密、加签、解密、验签等操作。而根据命令中的 -inkey 参数,我们可以发现该命令使用的是一个非对称密钥文件 sm2-key.pem,这通常是用于非对称加密的公钥或私钥。并且根据命令中的 -encrypt 参数,我们可以看出该命令执行的是加密操作。

    因此,可以判断出这是一条使用非对称加密算法进行加密的命令。在这里,SM2 是一种非对称加密算法,因此该命令是使用 SM2 算法对数据进行非对称加密。

- 既然是非对称加密,为什么我没有看见公钥和私钥呢

  • 很抱歉给你带来的困惑。根据你提供的命令 openssl pkeyutl -in plaintext.txt -out ciphertext.sm2 -inkey sm2-key.pem -encrypt,似乎确实没有明确指定使用的公钥和私钥文件。

    通常,在非对称加密中,加密时使用公钥进行加密,而解密时使用私钥进行解密。但是在你的命令中,如果没有显式指定公钥或私钥,可能是因为使用了默认的密钥对,具体取决于 OpenSSL 的配置。

    要执行带有公钥和私钥的非对称加密操作,你可以使用类似以下的命令:

    openssl pkeyutl -in plaintext.txt -out ciphertext.sm2 -pubin -inkey public_key.pem -encrypt
    

    其中,-pubin 指定输入的密钥是公钥文件,-inkey 指定公钥文件的路径。

    如果你想执行解密操作,使用私钥进行解密,可以类似以下的命令:

    openssl pkeyutl -in ciphertext.sm2 -out decrypted.txt -inkey private_key.pem -decrypt
    

    同样,-inkey 参数指定私钥文件的路径。

    请注意,在实际使用中,确保正确处理和保管密钥对的安全非常重要。这些命令只是作为示例,并不能保证适用于你具体的情况。

用sm2公钥加密私钥解密


问题与解答

- openssl ecparam -genkey -name SM2 -out pri.key

  • 命令 openssl ecparam -genkey -name SM2 -out pri.key 是使用 OpenSSL 生成一个 SM2 曲线的密钥对的命令。

    具体来说,这个命令使用了 OpenSSL 的 ecparam 工具,-genkey 参数表示生成一个密钥对,-name SM2 参数表示使用 SM2 椭圆曲线算法,-out pri.key 参数指定将生成的私钥保存到名为 pri.key 的文件中。

    这条命令的执行将生成一个 SM2 曲线的私钥,并将其保存到 pri.key 文件中。根据命令的内容,这个文件应该包含了生成的私钥信息。

    请注意:生成的私钥需要妥善保管,确保其安全性。此外,通常需要生成相应的公钥,才能进行非对称加密、解密等操作。你可以使用 openssl ec 命令来从生成的私钥中提取公钥,例如:

    openssl ec -in pri.key -pubout -out pub.key
    

    这将从 pri.key 文件中提取公钥,并将其保存到 pub.key 文件中,以供后续使用。

- openssl ec -in pri.key -pubout -out pub.key

  • 命令 openssl ec -in pri.key -pubout -out pub.key 是用 OpenSSL 提取 SM2 私钥的公钥并保存到文件中的命令。

    这个命令使用了 OpenSSL 的 ec 工具,-in pri.key 参数指定了输入的私钥文件为 pri.key-pubout 参数表示要生成公钥,-out pub.key 参数指定了输出公钥保存到 pub.key 文件中。

    执行这条命令后,OpenSSL 将读取 pri.key 中的私钥信息,计算相应的公钥,并将生成的公钥保存到 pub.key 文件中。

    请记住,私钥和公钥属于密钥对的一部分,密钥对用于非对称加密、解密以及数字签名等操作。确保妥善保管私钥并仅共享公钥,以确保数据的安全性和完整性。

签名验签

问题与解答

- openssl pkeyutl -sign -in data -inkey pri.key -out pkeysig -rawin -digest sm3

  • openssl pkeyutl -sign -in data -inkey pri.key -out pkeysig -rawin -digest sm3 是使用 OpenSSL 对数据进行 SM3 数字签名的命令。

    具体地,该命令使用了 OpenSSL 中的 pkeyutl 工具,其中的参数说明如下:

    -sign 表示使用私钥进行数字签名操作。
    -in data 指定待签名数据的文件路径。注意,这里的 data 文件应该包含待签名的原始数据,而不是经过 Base64 或者十六进制编码后的数据。
    -inkey pri.key 指定私钥的文件路径。
    -out pkeysig 指定签名后数据的输出文件路径。
    -rawin 表示输入的数据是原始二进制数据,而不是经过 Base64 编码的数据。
    -digest sm3 指定要使用 SM3 哈希算法进行签名操作。

    当你执行该命令后,OpenSSL 将读取指定的私钥文件 pri.key,使用其中的私钥对 data 文件中的数据进行 SM3 数字签名,并将签名结果保存到 pkeysig 文件中。

- openssl pkeyutl -verify -pubin -in data.txt -inkey pub.key -sigfile pkeysig -rawin -digest sm3

  • openssl pkeyutl -verify -pubin -in data.txt -inkey pub.key -sigfile pkeysig -rawin -digest sm3 是使用 OpenSSL 对 SM3 的数字签名进行验证的命令。

    具体地,该命令使用了 OpenSSL 中的 pkeyutl 工具,其中的参数说明如下:

    -verify 表示使用公钥进行数字签名验证操作。
    -pubin 表示指定的密钥文件为公钥文件。
    -in data.txt 指定待验证的数据文件路径。注意,这里的 data.txt 文件应该包含原始的待验证数据,而不是经过 Base64 编码或其他编码形式的数据。
    -inkey pub.key 指定公钥的文件路径。
    -sigfile pkeysig 指定包含数字签名的文件路径。
    -rawin 表示输入的数据是原始二进制数据,而不是经过 Base64 编码的数据。
    -digest sm3 指定要使用 SM3 哈希算法进行签名验证操作。

    当你执行该命令后,OpenSSL 将读取指定的公钥文件 pub.key,使用其中的公钥对 data.txt 文件中的数据进行 SM3 的数字签名验证,同时会读取 pkeysig 文件中的签名数据,进行验证操作。

    如果验证成功,命令将输出 "Signature Verified Successfully",表示数字签名验证通过。如果验证失败,命令将输出 "Signature Failure",表示数字签名验证未通过。

对数据进行 SM3 散列,然后使用 SM2 私钥对该散列值进行数字签名,并将签名输出到 dgstsig 文件中.再使用 OpenSSL 中的 openssl dgst 工具进行 SM3 摘要验证,验证 data 文件的 SM3 摘要是否与 dgstsig 中的数字签名相匹配,使用的公钥为 pub.key。签名选项中的 distid:1234567812345678 表示分布式标识的参数。
-- 引用自OpenSSL学习(Secure Socket Layer)2023/11/13

- openssl dgst -sm3 -sign pri.key -out dgstsig -sigopt distid:1234567812345678 data.txt

  • openssl dgst -sm3 -sign pri.key -out dgstsig -sigopt distid:1234567812345678 data.txt 是使用 OpenSSL 对数据进行 SM3 哈希,并使用私钥进行数字签名的命令。

    具体地,该命令使用了 OpenSSL 中的 dgst 工具,其中的参数说明如下:

    -sm3 指定要使用 SM3 哈希算法进行哈希操作。
    -sign pri.key 指定私钥的文件路径。
    -out dgstsig 指定签名后数据的输出文件路径。
    -sigopt distid:1234567812345678 是可选参数,用于指定特定的签名选项,这里设置了 distid1234567812345678
    data.txt 指定待签名的数据文件路径。

    当你执行该命令后,OpenSSL 将读取指定的私钥文件 pri.key,对 data.txt 文件中的数据进行 SM3 哈希,并使用私钥进行数字签名。最后,将签名结果保存到 dgstsig 文件中。

    需要注意的是,distid 是一个自定义的签名选项,具体含义会根据具体的应用和使用场景而定。请确保根据实际需求正确设置这些选项。

- 哈希与杂凑

  • 哈希和杂凑(Hash)是密码学和计算机科学领域中的两个常用术语。

    哈希(Hash)是将任意长度的输入数据通过哈希函数转换为固定长度的输出结果的过程。哈希函数将输入数据映射到一个固定长度的哈希值,通常是一个固定长度的字节数组。哈希函数应具有以下特性:

    1. 确定性:给定相同的输入,哈希函数总是生成相同的输出。
    2. 快速计算:哈希函数应该能够在合理的时间内计算出哈希值。
    3. 抗冲突性:不同的输入应该具有不同的哈希值,并且应该极难找到两个不同的输入具有相同的哈希值(碰撞)。
    4. 不可逆性:哈希函数的输出结果难以逆向计算出原始的输入数据。

    杂凑(Hash)通常是指使用哈希函数对“消息”进行处理而得到的哈希值。在密码学中,杂凑函数通常用于确保数据的完整性和唯一性。常见的应用包括密码校验、数字签名、消息认证码等。

    总而言之,哈希是将任意长度的数据转换为固定长度的输出,而杂凑是对消息进行哈希处理以确保数据完整性和唯一性的过程。哈希函数在密码学中扮演着重要的角色,并在许多安全应用中得到广泛应用。

- openssl dgst -sm3 -verify pub.key -signature dgstsig -sigopt distid:1234567812345678 data.txt

  • openssl dgst -sm3 -verify pub.key -signature dgstsig -sigopt distid:1234567812345678 data.txt 是使用 OpenSSL 对使用私钥进行签名的数据进行验证的命令。

    具体地,该命令使用了 OpenSSL 中的 dgst 工具,其中的参数说明如下:

    -sm3 指定要使用 SM3 哈希算法进行哈希操作。
    -verify pub.key 指定公钥的文件路径。
    -signature dgstsig 指定待验证的签名文件路径。
    -sigopt distid:1234567812345678 是可选参数,用于指定特定的签名选项,这里设置了 distid1234567812345678
    data.txt 指定待验证的数据文件路径。

    当你执行该命令后,OpenSSL 将读取指定的公钥文件 pub.key,对 data.txt 文件中的数据进行 SM3 哈希,并使用公钥进行签名验证。同时,将读取 dgstsig 文件中的签名数据进行验证操作。

    如果验证成功,命令将输出 "Verified OK",表示数字签名验证通过。如果验证失败,命令将输出 "Verification Failure",表示数字签名验证未通过。

    请确保提供的签名文件 dgstsig 和公钥文件 pub.key 是与使用私钥进行签名的数据 data.txt 相匹配的。

- openssl pkeyutl -sign -in data -inkey pri.key -out pkeysig -rawin -digest sm3openssl dgst -sm3 -sign pri.key -out dgstsig -sigopt distid:1234567812345678 data.txt有什么区别?

  • 这两个命令 openssl pkeyutl -signopenssl dgst -sm3 -sign 都是使用 OpenSSL 进行数字签名,但有一些区别。

    1. 命令格式和参数:这两个命令的语法和参数略有不同。openssl pkeyutl -sign 命令需要使用 -in 参数指定要签名的数据输入,而 openssl dgst -sm3 -sign 命令需要使用 -sigopt 参数指定一些可选的签名选项。

    2. 输入数据格式:openssl pkeyutl -sign 命令使用的是原始(raw)输入数据,需要通过 -rawin 参数来指定。而 openssl dgst -sm3 -sign 命令默认会将输入数据进行哈希操作后再进行签名。

    3. 哈希算法:openssl pkeyutl -sign 命令可以使用多种哈希算法,通过 -digest 参数指定。而 openssl dgst -sm3 -sign 命令只支持 SM3 哈希算法。

    4. 签名选项:openssl dgst -sm3 -sign 命令支持使用 -sigopt 参数指定一些额外的签名选项,如在命令中通过 -sigopt distid:1234567812345678 指定 distid 选项的值。而 openssl pkeyutl -sign 命令不支持通过命令行参数指定签名选项。

    总体来说,这两个命令的功能十分相似,都是进行数字签名操作。不同之处在于输入数据格式、支持的哈希算法以及签名选项的不同。选择哪个命令应该根据具体的需求来决定。

用sm3计算字符串或文件的Hash值

问题与解答

- echo -n "Hello , SM3 hash!" | openssl dgst -sm3 -binary | xxd -p

  • echo -n "Hello , SM3 hash!" | openssl dgst -sm3 -binary | xxd -p 是一个在命令行中使用 OpenSSL 进行 SM3 哈希计算的示例。

    该命令的流程如下:

    1. 使用 echo -n 命令生成一个字符串 "Hello, SM3 hash!",并将其传递给 OpenSSL 命令进行处理。
      -n 选项表示不包括换行符在内的末尾空白字符。

    2. |(管道符号)用于将前一个命令的输出作为后一个命令的输入。
      所以,前一个命令 echo -n "Hello , SM3 hash!" 的输出结果将作为后一个命令的输入。

    3. openssl dgst -sm3 -binary 指定使用 OpenSSL 中的 dgst 工具进行 SM3 哈希计算。
      -sm3 参数指定使用 SM3 哈希算法。
      -binary 参数用于输出二进制格式的哈希结果。

    4. xxd -p 用于将二进制格式的哈希结果转换为十六进制表示。
      -p 参数表示输出为十六进制格式。

    这样,最终的输出结果就是输入字符串 "Hello, SM3 hash!" 经过 SM3 哈希计算后得到的十六进制哈希值。

用sm4算法对字符串进行加密解密

问题与解答

- openssl rand -hex 16 > sm4-key.txt

  • openssl rand -hex 16 > sm4-key.txt 是一个用于生成一个 16 字节(128 位)的随机十六进制密钥,并将其保存到 sm4-key.txt 文件中的 OpenSSL 命令。

    这个命令的流程如下:

    1. openssl rand -hex 16 使用 OpenSSL 中的 rand 工具生成一个 16 字节的随机数。
      -hex 16 参数指定生成十六进制格式的输出,并且生成的字节数是 16 字节(128 位)。

    2. > 将生成的随机数输出到 sm4-key.txt 文件中。
      > 是输出重定向符号,它会将命令的输出结果写入到指定的文件中。

    这样,执行命令后,会生成一个 16 字节(128 位)的随机十六进制密钥,并将其保存在名为 sm4-key.txt 的文件中。

- openssl rand -hex 16 > sm4-iv.txt

  • openssl rand -hex 16 > sm4-iv.txt 是一个用于生成一个 16 字节(128 位)的随机十六进制初始化向量(IV),并将其保存到 sm4-iv.txt 文件中的 OpenSSL 命令。

    这个命令的流程如下:

    1. openssl rand -hex 16 使用 OpenSSL 中的 rand 工具生成一个 16 字节的随机数。
      -hex 16 参数指定生成十六进制格式的输出,并且生成的字节数是 16 字节(128 位)。

    2. > 将生成的随机数输出到 sm4-iv.txt 文件中。
      > 是输出重定向符号,它会将命令的输出结果写入到指定的文件中。

    这样,执行命令后,会生成一个 16 字节(128 位)的随机十六进制初始化向量(IV),并将其保存在名为 sm4-iv.txt 的文件中。

    请注意,初始化向量(IV)是对称加密算法中用于增加加密强度的重要参数,每次加密操作都应使用一个不同的 IV。因此,每次生成新的 IV 都是推荐的做法。

- echo -n "Hello, SM4 encryption!" | openssl enc -sm4-cbc -e -K $(cat sm4-key.txt) -iv $(cat sm4-iv.txt) -out encrypted.sm4

  • echo -n "Hello, SM4 encryption!" | openssl enc -sm4-cbc -e -K $(cat sm4-key.txt) -iv $(cat sm4-iv.txt) -out encrypted.sm4 这个命令使用 OpenSSL 进行 SM4 算法的 CBC 模式加密,其大致流程如下:

    1. echo -n "Hello, SM4 encryption!" 输出要加密的字符串 "Hello, SM4 encryption!"。
      -n 选项表示不包括换行符在内的末尾空白字符。

    2. |(管道符号)用于将前一个命令的输出作为后一个命令的输入。
      所以,前一个命令 echo -n "Hello, SM4 encryption!" 的输出结果将作为后一个命令的输入。

    3. openssl enc -sm4-cbc -e 指定使用 OpenSSL 中的 enc 工具进行 SM4 加密。
      -sm4-cbc 参数指定使用 SM4 算法和 CBC 模式。
      -e 参数表示进行加密操作。(解密操作需要使用 -d 参数)

    4. -K $(cat sm4-key.txt) 选项表示从 sm4-key.txt 文件获取加密使用的密钥,并将其转换为二进制格式。
      -K 参数指定加密所需的二进制密钥。
      $() 语法用于执行 cat sm4-key.txt 命令,并将输出结果作为 -K 参数的值。

    5. -iv $(cat sm4-iv.txt) 选项表示从 sm4-iv.txt 文件获取加密使用的初始化向量(IV),并将其转换为二进制格式。
      -iv 参数指定加密所需的二进制初始化向量。
      $() 语法用于执行 cat sm4-iv.txt 命令,并将输出结果作为 -iv 参数的值。

    6. -out encrypted.sm4 选项表示将加密后的结果输出到 encrypted.sm4 文件中。
      -out 参数指定输出文件的文件名。

    这样,执行命令后,将输出 SM4 算法 CBC 模式加密后的结果,并将其保存在名为 encrypted.sm4 的文件中。

用sm4算法对文件进行加密解密

参考资料