openssl 加密 解密 签名 验签

openssl 加密 解密 签名 验签

1.签名与加密无先后顺序,加密解密是一套,签名与验签是一套(需要一对密钥),对称加密不适用于签名及验签(需生成对应公钥后才可用于签名与验签);
2.加密可以用公钥或私钥,解密只能用私钥解密,签名用私钥,验签用公钥;

一个私钥可能对应多个公钥,用私钥加密后,公钥不一定能解密(除非确定一对一关系);

  • 正常情况,公钥是公开的,任何人都可以获取,私钥只有自己拥有;
  • 签名是原始信息加上加密后的信息,具有唯一性,是有明文的,可以知道是谁签名的,所以用对方的公钥解密就行了。
  • 公钥加密,再用他的私钥解密,首先你不会有对方的私钥,其次对方的公钥是公开的,大家都有,就失去了签名的唯一性。

3.签名验签和加解密可以用同一套密钥,只在相应场景下可以;

两套密钥

非对称加密的典型示例是使用RSA算法。下面是一个简单的例子来说明A端公钥加密、私钥签名以及B端私钥解密、公钥验签的过程:
1.A端生成密钥对:

  • A端生成一对密钥:A的私钥(SK_A)和A的公钥(PK_A)。
  1. 加密和签名:
  • A端使用B端的公钥(PK_B)将数据进行加密:加密后的数据为Encrypted_Data = Encrypt(Data, PK_B)。
  • A端使用自己的私钥(SK_A)对数据进行签名:签名结果为Signature = Sign(Data, SK_A)。
  1. 数据传输给B端:
  • A端将加密后的数据Encrypted_Data和签名Signature发送给B端。
  1. 解密和验签:
  • B端使用自己的私钥(SK_B)对加密的数据进行解密:解密后的数据为Decrypted_Data = Decrypt(Encrypted_Data, SK_B)。
  • B端使用A端的公钥(PK_A)对签名进行验签:验签结果为Verify(Signature, Data, PK_A)。

在非对称加密中,公钥是公开的,任何人都可以获取到。因此,A端可以将自己的公钥(PK_A)通过安全的渠道(如加密通信、数字证书等)发送给B端。
一种常见的方式是使用数字证书来分发公钥。A端可以向可信的第三方机构申请数字证书,该机构会对A端进行验证,并将A端的公钥和身份信息打包为数字证书。B端可以通过从该第三方机构获取A端的数字证书,进而获得A端的公钥。
另一种方式是通过密钥交换协议,如Diffie-Hellman密钥交换协议,来实现在不安全的通信渠道上安全地交换公钥,同理B端公钥也如此到达

流程

A端:B端公钥加密,A端私钥签名;
B端:B端私钥解密,A端公钥验签;
注:A端有B端公钥,B端有A端公钥
1.A端生成RSA密钥对:

openssl genrsa -out private_key_A.pem 2048
openssl rsa -in private_key_A.pem -outform PEM -pubout -out public_key_A.pem

2.A端使用自己的私钥对数据进行签名:SHA-256 哈希运算

# 使用私钥对数据签名
openssl dgst -sha256 -sign private_key_A.pem -out signature.sha256 plaintext.txt

3.A端使用B端的公钥对数据进行加密:

# 使用公钥对数据加密
openssl rsautl -encrypt -inkey public_key_B.pem -pubin -in plaintext.txt -out encrypted.dat

4.将加密后的数据 encrypted.dat 和签名 signature.sha256 传输给B端。
5.B端生成RSA密钥对:

openssl genrsa -out private_key_B.pem 2048
openssl rsa -in private_key_B.pem -outform PEM -pubout -out public_key_B.pem

6.B端使用自己的私钥对数据进行解密:

# 使用私钥对数据解密
openssl rsautl -decrypt -inkey private_key_B.pem -in encrypted.dat -out plaintext.txt

7.B端使用A端的公钥对签名进行验证:

# 使用公钥对签名验证
openssl dgst -sha256 -verify public_key_A.pem -signature signature.sha256 plaintext.txt

请注意,实际使用时需确保密钥的安全管理,选择合适的加密算法和密钥长度,并谨慎处理加密解密过程中的数据。根据具体情况,可能需要调整命令中的参数和文件名。

一套密钥

方法一:对称加密

在RSA加密算法中,私钥用于对数据进行加密 解密和签名,公钥用于验证签名。这种灵活性确实使RSA成为一种非常强大的加密算法。以下是一个简单示例,演示如何使用相同的RSA密钥对进行加密和签名:

流程

A端:A端私钥加密,A端私钥签名;
B端:A端私钥解密,A端公钥验签;
:在同一端 或 B端有A端公钥及私钥
1.生成RSA密钥对:对称加密 生成私钥

openssl genrsa -out rsa_key.pem 2048

2.生成公钥文件:根据私钥生成公钥 用于验签

openssl rsa -in rsa_key.pem -outform PEM -pubout -out public_key.pem

3.加密数据:

openssl rsautl -encrypt -inkey rsa_key.pem -in plaintext.txt -out encrypted.dat

4.解密数据:

openssl rsautl -decrypt -inkey rsa_key.pem -in encrypted.dat -out plaintext.txt

5.对数据进行签名:

openssl dgst -sha256 -sign rsa_key.pem -out signature.sha256 plaintext.txt

6.验证签名:

openssl dgst -sha256 -verify public_key.pem -signature signature.sha256 plaintext.txt

在这个示例中,我们生成了RSA密钥对,并使用私钥对数据进行加密和签名,然后使用公钥对数据进行解密和验证签名。这展示了RSA算法的灵活性和强大功能。

方法二:非对称加密

在非对称加密中,A端和B端使用的密钥是不同的。以下是一个简单的过程来说明A端私钥解密、私钥签名,以及B端公钥加密、公钥验签的完整过程:

流程

B端:A端公钥加密,A端公钥验签;
A端:A端私钥解密,A端私钥签名;
注:B端只需A端公钥
1.A端生成RSA密钥对:

openssl genrsa -out private_key_A.pem 2048
openssl rsa -in private_key_A.pem -outform PEM -pubout -out public_key_A.pem
  1. B端获取A端的公钥(public_key_A.pem)。
  2. B端使用A端的公钥对数据进行加密:
echo "Sensitive data" > plaintext.txt
openssl rsautl -encrypt -inkey public_key_A.pem -pubin -in plaintext.txt -out encrypted.dat
  1. B端将加密后的数据 encrypted.dat 发送给A端。
  2. A端使用自己的私钥(private_key_A.pem)对数据进行解密:
openssl rsautl -decrypt -inkey private_key_A.pem -in encrypted.dat
  1. A端使用私钥对数据进行签名:
openssl dgst -sha256 -sign private_key_A.pem -out signature.sha256 plaintext.txt
  1. A端将签名文件 signature.sha256 发送给B端。
  2. B端使用A端的公钥(public_key_A.pem)来验证签名的有效性:
openssl dgst -sha256 -verify public_key_A.pem -signature signature.sha256 plaintext.txt

通过这个过程,我们展示了A端如何使用公钥加密数据和私钥签名数据,以及B端如何使用私钥解密数据和公钥验证签名。这种方式保证了数据在传输过程中的机密性和完整性。

  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenSSL是一个开源的软件库,提供了各种加密和安全功能,包括SM2和P7(PKCS7)的签名验签。 SM2是一种国密算法,是中国制定的用于公钥加密签名算法的标准。它基于椭圆曲线密码学,具有高效安全的特点。在使用OpenSSL进行SM2签名时,需要提供一对SM2密钥(公钥和私钥)。签名过程包括对待签名的消息进行摘要计算,然后使用私钥对该摘要进行加密得到签名值。 P7是一个密码消息语法标准,也被称为PKCS7。它定义了一种结构化数据格式,用于在网络上传输加密签名的数据。在使用OpenSSL进行P7签名时,需要提供待签名的数据和私钥。签名过程包括使用私钥对待签名数据进行摘要计算,然后将摘要和其他相关信息结合起来,形成P7签名验签过程与签名过程相反。对于SM2签名,需要提供公钥、签名值和待验签的消息,OpenSSL会对消息进行摘要计算,并使用公钥解密签名值,然后比对两者是否一致。对于P7签名,需要提供待验签的数据、签名值和签名者的证书(可以包含公钥),OpenSSL会对数据进行摘要计算,并验证签名值与摘要是否一致,并且验证签名者的证书的有效性。 总之,通过使用OpenSSL中的相关函数和提供的密钥材料,可以方便地进行SM2和P7的签名验签操作,以确保数据的安全性和完整性。 ### 回答2: OpenSSL是一个开源的加密库,支持多种加密算法和协议。其中包括国密算法SM2以及P7格式。 SM2是国密算法中的一种非对称加密算法,用于数字签名和密钥交换。SM2使用了椭圆曲线密码学,具有高安全性和性能优势。通过OpenSSL库,可以使用SM2进行数字签名验签操作。 P7是一种数据格式,也被称为PKCS#7或CMS(Cryptographic Message Syntax)。它用于封装加密签名的数据,并可以传输或存储。在OpenSSL中,可以使用P7格式来封装SM2签名信息。 对于SM2签名验签的操作,可以按照以下步骤进行: 1. 加载SM2私钥和证书:使用OpenSSL函数加载包含SM2私钥和证书的文件,或者通过代码直接提供私钥和证书信息。 2. 创建P7格式:使用OpenSSL函数创建一个空的P7结构体,并设置相应的标志和属性。 3. 将待签名数据加入P7结构体:将待签名的数据添加到P7结构体中,可以分多次添加。 4. 使用SM2私钥进行签名:使用OpenSSL函数对P7结构体中的数据进行SM2签名,生成一个签名数据。 5. 验证签名:使用OpenSSL函数加载SM2公钥和证书,然后使用公钥对P7结构体中的签名数据进行验签。 6. 验签结果判断:根据验签结果判断签名的有效性,如果验签成功,则表示数据的原始性和完整性得到了保证。 通过这些步骤,可以使用OpenSSL库来实现SM2签名验签操作。对于具体的代码实现细节,可以参考OpenSSL的官方文档和示例代码。 ### 回答3: OpenSSL是一个开源的密码学工具库,支持许多密码算法,其中包括SM2和P7(PKCS#7)。下面是关于如何在OpenSSL中使用SM2和P7进行签名验签的简要说明。 首先,我们需要生成SM2密钥对,这可以通过以下命令完成: openssl ecparam -name SM2 -genkey -out sm2key.pem 接下来,我们可以使用生成的密钥对来进行签名。假设我们要签名的数据保存在data.txt文件中,使用私钥来进行签名的命令如下所示: openssl dgst -sign sm2key.pem -out signature.txt data.txt 上述命令将使用SM2私钥对data.txt文件进行签名,并将签名结果保存在signature.txt文件中。 要验证签名的有效性,我们可以使用公钥来进行验签验签的命令如下所示: openssl dgst -verify sm2key.pem -signature signature.txt data.txt 以上命令将使用SM2公钥和签名结果来验证data.txt文件签名有效性。 需要注意的是,P7是PKCS#7的一种实现方式,它在签名加密数字证书和数据时非常有用。如果我们希望将SM2签名验签的结果封装在P7中,我们可以使用以下命令: openssl smime -sign -in data.txt -out signed.p7 -signer sm2cert.pem -inkey sm2key.pem 上述命令将使用SM2私钥和证书来对data.txt文件进行签名,并将签名结果保存在signed.p7文件中。 为了验证P7的签名,我们可以使用以下命令: openssl smime -verify -in signed.p7 -inform DER -noverify 以上命令将验证signed.p7文件中的签名是否有效。 通过上述步骤,我们可以使用OpenSSL的SM2和P7来进行签名验签操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值