密码学是研究和应用如何保护信息的一门学科。它涉及使用加密技术来确保数据的保密性、完整性和可用性。密码学的目标是设计和分析安全的算法和协议,以保护通信、存储和计算过程中的敏感数据。
密码学可以分为两个主要领域:对称密码和非对称密码。
1. 对称密码(又称为共享密钥密码):在对称密码中,使用相同的密钥进行加密和解密操作。发送方使用密钥对数据进行加密,接收方使用相同的密钥对数据进行解密。对称密码算法通常被称为块密码(如AES)或流密码(如RC4)。
2. 非对称密码(又称为公钥密码):在非对称密码中,使用一对相关联的密钥,即公钥和私钥。发送方使用接收方的公钥对数据进行加密,接收方则使用其私钥对数据进行解密。非对称密码算法通常用于实现数据的机密性和身份验证,最著名的非对称密码算法是RSA和椭圆曲线密码学(ECC)。
密码学还涉及到其他概念和技术,例如哈希函数(用于生成固定长度的散列值)、消息认证码(用于验证消息完整性)和数字签名(用于验证消息来源和完整性)等。
密码学的目标是保护数据的机密性(防止非授权方访问)、完整性(防止数据被篡改)和可用性(确保合法用户可以访问数据)。密码学在信息安全、电子商务、云计算、区块链和许多其他领域都发挥着重要的作用。
2.1 公私钥
公钥和私钥是非对称加密算法中使用的密钥对,也被称为公私钥对(Public-Key Cryptography)。
公钥(Public Key)是可以公开给其他人使用的密钥。公钥用于加密数据,也可以用来验证签名。它是由非对称加密算法的加密方生成,并且可以自由地在公共通信渠道上传播。由于公钥在加密过程中只用于加密数据或验证签名,不参与解密或生成签名的过程,因此可以放心地公开使用。
私钥(Private Key)是与公钥配对使用的秘密密钥,只由私钥的持有者知道,并且必须严格保密。私钥用于解密数据和生成签名。只有拥有私钥的人才能够解密使用公钥加密的数据,或者使用私钥对数据进行签名。
2.2 秘钥格式
PKCS#1格式(Public-Key Cryptography Standards #1):
公钥以 `-----BEGIN RSA PUBLIC KEY-----` 开头,以 `-----END RSA PUBLIC KEY-----` 结尾。
私钥以 `-----BEGIN RSA PRIVATE KEY-----` 开头,以 `-----END RSA PRIVATE KEY-----` 结尾。
PKCS#8格式(Public-Key Cryptography Standards #8):
公钥以 `-----BEGIN PUBLIC KEY-----` 开头,以 `-----END PUBLIC KEY-----` 结尾。
私钥以 `-----BEGIN PRIVATE KEY-----` 开头,以 `-----END PRIVATE KEY-----` 结尾。
PKCS#8格式相对更加通用,适用于不同的非对称加密算法和扩展属性的存储;而PKCS#1格式主要用于RSA算法的公私钥存储,没有统一的格式同时存储公钥和私钥。
2.3 保存秘钥的文件格式
PEM格式(Privacy Enhanced Mail):PEM格式是一种基于文本的格式,通常使用扩展名为.pem。在PEM格式中,密钥以Base64编码的形式存储,并使用特定的头部和尾部标记来标识密钥类型。例如,公钥以"-----BEGIN PUBLIC KEY-----"开始,以"-----END PUBLIC KEY-----"结束,私钥以"-----BEGIN PRIVATE KEY-----"开始,以"-----END PRIVATE KEY-----"结束。PEM格式的密钥可以直接在文本文件中存储,并且易于读取和传输。
DER格式(Distinguished Encoding Rules):DER格式是一种二进制格式,通常使用扩展名为.der。在DER格式中,密钥以ASN.1(Abstract Syntax Notation One)结构编码。DER格式的密钥相对于PEM格式更紧凑,适用于网络传输和存储。DER格式的密钥无法直接在文本文件中阅读,因为它是以二进制形式存储的。
数字签名是一种用于验证数据完整性、身份认证和防止抵赖的技术。它基于非对称加密算法和哈希算法的组合实现。
发送方数字签名的过程如下:
1. 发送方使用哈希算法对原始数据进行摘要处理,生成一个固定长度的哈希值。
2. 发送方使用自己的私钥对摘要进行加密,生成数字签名。
3. 发送方将数字签名与原始数据一起发送给接收方。
接收方验证数字签名的过程如下:
1. 接收方使用发送方的公钥对数字签名进行解密,得到摘要。
2. 接收方使用相同的哈希算法处理接收到的原始数据,生成一个新的哈希值。
3. 接收方比较解密得到的摘要和新生成的哈希值,如果一致,说明数据完整性未被篡改。
数字签名的原理在于,只有拥有私钥的发送方才能生成有效的数字签名,而任何人都可以使用公钥验证签名的有效性。这样可以确保数据的完整性,并且可以防止发送方抵赖已发送的数据。
常见的数字签名算法包括RSA和DSA。此外,数字证书和证书颁发机构(CA)也在数字签名中发挥重要作用,用于验证公钥的真实性和可信度。数字签名在电子商务、信息安全和数字文档传输等领域得到广泛应用。
加密算法是一种数学算法,用于将原始数据转换为不可读的密文,以保护数据的机密性和安全性。以下是几种常见的加密算法:
1. 对称加密算法:对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法有:
- AES(Advanced Encryption Standard):是一种高级加密标准,广泛应用于各种安全应用中。
- DES(Data Encryption Standard):是一种数据加密标准,已被AES所取代,但仍在某些应用中使用。
- 3DES(Triple Data Encryption Algorithm):是DES的改进算法,通过对数据进行多次DES加密来增强安全性。
2. 非对称加密算法:非对称加密算法使用一对密钥,分别是公钥和私钥,用于加密和解密数据。常见的非对称加密算法有:
- RSA(Rivest-Shamir-Adleman):是一种基于大素数因子化的非对称加密算法,广泛应用于数字签名、密钥交换和加密等领域。
- ECC(Elliptic Curve Cryptography):是一种基于椭圆曲线数学问题的非对称加密算法,具有较短的密钥长度和高级别的安全性。
3. 哈希算法:哈希算法将任意长度的数据映射为固定长度的哈希值,常用于验证完整性和生成数字签名。常见的哈希算法有:
- MD5(Message Digest Algorithm 5):生成128位哈希值,但由于其安全性受到一些限制,已不再推荐使用。
- SHA(Secure Hash Algorithm)家族:包括SHA-1、SHA-256、SHA-3等,生成不同长度的哈希值,被广泛用于数据完整性校验和数字签名等领域。
RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,也是最著名和广泛应用的公钥加密算法之一。它由Ron Rivest、Adi Shamir和Leonard Adleman三位密码学家于1977年提出。
RSA算法的基本原理是利用大素数因子分解问题,它使用一对相关的密钥:公钥和私钥。
RSA算法的加密过程如下:
1. 首先,选择两个不相等的大素数p和q,并计算它们的乘积n=p*q。
2. 计算与n互质的正整数e,作为加密密钥的一部分,称为公钥(n, e)。
3. 计算e的模反元素d,使得(e * d) mod ((p-1) * (q-1)) = 1,作为解密密钥的一部分,称为私钥(n, d)。
4. 加密时,将消息M转换为整数m,满足0 <= m < n。
5. 加密运算:密文C = m^e mod n,其中^表示幂运算,mod表示求余运算。
6. 将密文C发送给接收方。
解密过程如下:
1. 接收到密文C后,用私钥(n, d)进行解密运算:明文M = C^d mod n。
2. 将解密得到的明文M转换为原始消息。
RSA算法的安全性依赖于大整数因子分解问题的困难性,即将一个大整数分解为其素数因子的困难性。如果一个人能够快速有效地解决大整数的因子分解问题,那么整个RSA加密系统就会被破解。
RSA算法在数据加密、数字签名、密钥协商和安全通信等方面广泛应用,是公钥加密领域的重要算法之一。
对于加解密的具体操作,一般遵循以下步骤:
1. 选择合适的加密算法:根据需求选择合适的对称密码或非对称密码算法。对称密码通常用于对称加密和解密,而非对称密码通常用于公钥加密和解密以及数字签名等操作。
2. 生成密钥:对于对称密码,生成一个共享的密钥用于加密和解密操作。对于非对称密码,生成一对相关联的公钥和私钥,分别用于加密和解密。
3. 执行加密操作:使用合适的加密算法和密钥,对明文数据进行加密。对称密码和非对称密码的加密操作略有不同,需要根据具体的算法和库进行操作。
4. 执行解密操作:使用相应的密钥,对加密后的密文进行解密,以恢复原始的明文数据。
需要注意的是,安全的加密和解密通常需要考虑更多的因素,如数据完整性验证、密码存储和密钥管理等。因此,在实际应用中,建议使用密码学库或模块提供的高级功能和最佳实践,以确保数据的安全性和完整性。
接口加签加密,发送方和接收方交互流程如下:
1. 密钥生成:发送方和接收方各自生成一对RSA密钥,包括公钥和私钥。
2. 公钥交换:发送方将自己的公钥发送给接收方,接收方将自己的公钥发送给发送方。
3. 数据准备:发送方将要发送的数据进行准备,并将数据进行序列化,得到要发送的原始数据。
4. 数据签名:发送方使用自己的私钥对原始数据进行哈希运算,并对哈希值进行加密操作得到数字签名。
5. 数据加密:发送方使用接收方的公钥对原始数据进行加密操作,得到密文数据。
6. 组装请求:发送方将密文数据和数字签名一起组装为请求数据。
7. 请求发送:发送方将请求数据发送给接收方。
8. 请求解析:接收方接收到请求数据后,对数据进行解析,获取密文数据和数字签名。
9. 数字签名验证:接收方使用发送方的公钥对接收到的数字签名进行解密操作,得到原始的哈希值。然后对接收到的密文数据进行哈希运算,得到新的哈希值。接收方将用发送方的公钥对新的哈希值进行解密,与解密出的原始哈希值进行比对,以验证数字签名的有效性和数据的完整性和真实性。
10. 数据解密:接收方使用自己的私钥对接收到的密文数据进行解密操作,恢复成原始的明文数据。
通过以上步骤,数据在发送方进行数字签名和加密,然后在接收方进行数字签名验证和解密,以确保数据在传输过程中的机密性、完整性和真实性。同时,数字签名的验证可以验证数据的有效性,防止数据在传输过程中被篡改或伪造。
在Python中,有几个常用的密码学相关库可以用于实现加密、解密、数字签名、哈希函数等功能。以下是其中一些库的简要介绍:
1. `rsa`:这是一个专门用于RSA算法的库,提供了生成RSA密钥对、加密解密、数字签名和验证等功能。它可以用于实现非对称加密和数字签名的应用。
2. `cryptography`:这是一个功能强大的密码学库,提供了许多密码学算法和功能,包括对称密码、非对称密码、哈希函数、消息认证码、随机数生成等。它使用了现代密码学的最佳实践,通过高级API和易于使用的接口,使进行密码学操作变得简单和安全。
3. `hashlib`:这是Python标准库中的一个模块,提供了常见的哈希函数的实现,如MD5、SHA-1、SHA-256等。它可以用于计算散列值,进行数据完整性验证、密码存储等操作。
这些库都拥有丰富的功能和广泛的使用,并具有成熟的社区支持。根据具体的需求和项目要求,选择适合的密码学库可以帮助简化开发过程并提高安全性。
reference:
RSA密钥详解 - 知乎