openssl 加密 解密 签名 验签
1.签名与加密无先后顺序,加密解密是一套,签名与验签是一套(需要一对密钥),对称加密不适用于签名及验签(需生成对应公钥后才可用于签名与验签);
2.加密可以用公钥或私钥,解密只能用私钥解密,签名用私钥,验签用公钥;
一个私钥可能对应多个公钥,用私钥加密后,公钥不一定能解密(除非确定一对一关系);
- 正常情况,公钥是公开的,任何人都可以获取,私钥只有自己拥有;
- 签名是原始信息加上加密后的信息,具有唯一性,是有明文的,可以知道是谁签名的,所以用对方的公钥解密就行了。
- 公钥加密,再用他的私钥解密,首先你不会有对方的私钥,其次对方的公钥是公开的,大家都有,就失去了签名的唯一性。
3.签名验签和加解密可以用同一套密钥,只在相应场景下可以;
两套密钥
非对称加密的典型示例是使用RSA算法。下面是一个简单的例子来说明A端公钥加密、私钥签名以及B端私钥解密、公钥验签的过程:
1.A端生成密钥对:
- A端生成一对密钥:A的私钥(SK_A)和A的公钥(PK_A)。
- 加密和签名:
- A端使用B端的公钥(PK_B)将数据进行加密:加密后的数据为Encrypted_Data = Encrypt(Data, PK_B)。
- A端使用自己的私钥(SK_A)对数据进行签名:签名结果为Signature = Sign(Data, SK_A)。
- 数据传输给B端:
- A端将加密后的数据Encrypted_Data和签名Signature发送给B端。
- 解密和验签:
- 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
- B端获取A端的公钥(public_key_A.pem)。
- B端使用A端的公钥对数据进行加密:
echo "Sensitive data" > plaintext.txt
openssl rsautl -encrypt -inkey public_key_A.pem -pubin -in plaintext.txt -out encrypted.dat
- B端将加密后的数据 encrypted.dat 发送给A端。
- A端使用自己的私钥(private_key_A.pem)对数据进行解密:
openssl rsautl -decrypt -inkey private_key_A.pem -in encrypted.dat
- A端使用私钥对数据进行签名:
openssl dgst -sha256 -sign private_key_A.pem -out signature.sha256 plaintext.txt
- A端将签名文件 signature.sha256 发送给B端。
- B端使用A端的公钥(public_key_A.pem)来验证签名的有效性:
openssl dgst -sha256 -verify public_key_A.pem -signature signature.sha256 plaintext.txt
通过这个过程,我们展示了A端如何使用公钥加密数据和私钥签名数据,以及B端如何使用私钥解密数据和公钥验证签名。这种方式保证了数据在传输过程中的机密性和完整性。