- 对称加密:加密和解密使用的密钥是同一个
常见算法:DES、3DES、Blowfish、IDEA、RC4、RC5、RC6 和 AES - 非对称加密:需要两个密钥,一个公开密钥、一个私有密钥
常见算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
使用过程:
用户A生成非对称加密密钥并将公钥进行公开,用户B接收公钥使用公钥加密信息发送给用户A,加密的信息只有用户A使用私钥进行解密。
- 反之则是用户B进行生成一对公私密钥
在非对称加密中,用户A生成的一对密钥包括公钥和私钥。如果用户A想要给用户B发送加密信息,应该使用用户B的公钥来加密信息。这是因为非对称加密的特性决定了公钥用于加密,私钥用于解密。
具体步骤如下:
- 用户B向用户A发送其公钥。
- 用户A使用用户B的公钥对消息进行加密。
- 加密后的消息可以安全地发送给用户B。
- 用户B使用自己的私钥来解密用户A发送过来的加密消息。
这样,通过使用用户B的公钥,用户A可以确保只有用户B能够解密消息,因为只有用户B拥有与公钥对应的私钥。这种方式保障了加密通信的安全性和可靠性。
数据加密标准AES
使用相同的密钥进行加密和解密的对称加密
支持三种密钥长度:128位、192位和256位。较长的密钥长度提供更高的安全性,但也需要更多的计算资源
然后,对需要加密的数据进行填充(Padding)以确保数据块长度符合AES要求(通常为128位)
注:AES加密是对数据块进行加密,而不是单个数字
假设我们有以下明文数据和密钥:
明文数据:12345678
密钥:0123456789ABCDEF1. 选择加密模式:选择一种合适的加密模式,如ECB、CBC等。这里我们选择ECB模式。2. 填充方案:将明文数据填充到AES块大小(128位或16字节)的倍数。在这个例子中,明文数据"12345678"长度为8字节,不足一个块大小。我们可以选择使用PKCS#7填充方案,在末尾填充8- 8 = 0x08,得到填充后的数据为"1234567808080808"。3. 加密:使用AES算法和密钥对填充后的数据进行加密。在这个例子中,我们使用AES-128算法(使用128位的密钥)。将填充后的数据"1234567808080808"和密钥"0123456789ABCDEF"输入AES加密算法,得到密文数据。4. 密文:26da32782e5199b78c0f7f046f292ab9python:
from Crypto.Cipher import AESdef encrypt(plaintext, key):cipher = AES.new(key, AES.MODE_ECB)ciphertext = cipher.encrypt(plaintext)return ciphertext.hex() # 返回十六进制表示的密文plaintext = b'1234567808080808'
key = b'0123456789ABCDEF'
ciphertext = encrypt(plaintext, key)
print(ciphertext)
数据加密标准DES
DES算法采用分组密码技术,将明文分成64位的块,并通过一系列的置换、替换和轮函数操作来加密数据,在DES加密的过程中,消息会经历多轮的加密操作,每轮都会使用不同的子密钥来对数据进行处理
假设要对一个8字节(64位)的消息进行DES加密,比如 "12345678"
首先,需要一个64位的密钥,假设选择的密钥是:"ABCDEFGH"
经过DES加密算法处理后,得到的密文可能是一串十六进制数字:"A2B4F8C9D3E56701"DES加密算法至少需要执行16轮加密操作,每一轮都使用不同的子密钥对数据进行处理。每一轮中,明文会经历一系列的置换、替换和混合操作
由于DES算法的密钥长度较短(56位),因此现在DES已经被认为不够安全一般都使用AES
数据加密标准RSA
简单说就是公钥加密私钥解密的过程
- 密钥对生成:
首先,选择两个大素数p和q,并计算它们的乘积n = p * q。
接下来,计算欧拉函数φ(n) = (p-1) * (q-1),它表示小于n且与n互质的正整数的数量。
然后,选择一个整数e,满足1 < e < φ(n),且e与φ(n)互质。这个e将成为公钥的一部分。
最后,计算一个整数d,满足e * d ≡ 1 (mod φ(n)),即(e * d与φ(n)取模的结果为1)。这个d将作为私钥的一部分。 - 加密过程:
发送者使用接收者的公钥(n,e)来加密消息m。具体地,发送者计算密文c = m^e mod n,其中^表示乘方运算。
发送者将密文c发送给接收者。 - 解密过程:
接收者使用自己的私钥(d)来解密收到的密文c。具体地,接收者计算明文m = c^d mod n。
接收者从解密的明文中提取原始消息。
实际中可能更多的会进行一个填充方案和哈希函数
- 举例:
选择两个不同的大素数p和q:
p = 61, q = 53计算n = p * q:
n = 61 * 53 = 3233计算欧拉函数φ(n) = (p-1)(q-1):
φ(3233) = 60 * 52 = 3120选择一个与φ(n)互质的整数e:
选择e=17计算e的模反元素d (即d * e ≡ 1 (mod φ(n))):
d = 2753公钥为(n, e),私钥为(n, d)。
假设要加密明文"M=123",加密过程如下:- 加密:C = m^e mod nC = 123^17 mod 3233 = 855- 解密:m = c^d mod nm=855^2753 mod 3233 = 123
实际中还需要考虑填充方案、数字签名等
填充方案
填充方案通常用于对称加密算法中,因为对称加密算法要求输入的数据长度是固定的,而实际的数据往往不会正好满足这个长度。填充方案用于将数据填充到合适的长度。
- 常见的填充方案包括:
PKCS#5和PKCS#7填充:通过在数据末尾填充特定字节来使数据长度符合加密算法的要求。
Zero padding:在数据末尾补零,使得数据长度符合要求。
将待加密的数据使用选定的填充方案填充至合适的长度。
例如,对于PKCS#7填充,如果需要填充4个字节,那么填充的字节就是0x04 0x04 0x04 0x04。
哈希函数
将任意长度的输入数据映射到固定长度输出的函数。在加密中,哈希函数常用于验证数据的完整性、数字签名(常用非对称加密中)、密码存储等
- 常见的哈希函数包括:
SHA-1、SHA-256、SHA-512:安全哈希算法,产生不同长度的哈希值。
MD5:虽然已经不建议用于安全目的,但仍然在某些场景中被使用。
将数据输入到哈希函数中,得到固定长度的哈希值。
例如,对于SHA-256哈希函数,输入数据后会得到一个256位(32字节)的哈希值。