常见的js加密方式
RSA、16进制、Base64 都属于可逆加密方式,可以通过相应的解密方法将密文还原为明文。
而哈希算法是不可逆加密方式,只能将明文进行哈希后得到一段固定长度的密文,但无法通过密文还原出明文。其中,SHA 算法、MD5 算法都是常用的哈希算法。
一、16进制加密
加密和解密示例:
def hex_encode(s):
return s.encode('utf-8').hex()
# 将 16 进制字符串进行解码
def hex_decode(s):
return bytes.fromhex(s).decode('utf-8')
# 测试
original_str = 'hello world'
encoded_str = hex_encode(original_str)
decoded_str = hex_decode(encoded_str)
print('原始字符串:', original_str)
print('16进制编码后的字符串:', encoded_str)
print('解码后的字符串:', decoded_str)
我们定义了两个函数 hex_encode
和 hex_decode
,分别用于将字符串进行 16 进制编码和解码。然后,我们定义一个字符串 original_str
,使用 hex_encode
函数进行编码,将编码后的字符串输出到控制台上,再使用 hex_decode
函数进行解码,并输出解码后的字符串到控制台上。
效果:
二、base64
加密和解密示例:
import base64
# 将字符串进行 Base64 编码
def base64_encode(s):
return base64.b64encode(s.encode('utf-8')).decode('utf-8')
# 将 Base64 编码的字符串进行解码
def base64_decode(s):
return base64.b64decode(s.encode('utf-8')).decode('utf-8')
# 测试
original_str = 'hello world'
encoded_str = base64_encode(original_str)
decoded_str = base64_decode(encoded_str)
print('原始字符串:', original_str)
print('Base64 编码后的字符串:', encoded_str)
print('解码后的字符串:', decoded_str)
在上述代码中,我们使用 base64
模块提供的 b64encode
和 b64decode
函数,分别用于将字符串进行 Base64 编码和解码。然后,我们定义一个字符串 original_str
,使用 base64_encode
函数进行编码,将编码后的字符串输出到控制台上,再使用 base64_decode
函数进行解码,并输出解码后的字符串到控制台上。
效果:
三、不可逆的加密方式
1、MD5
MD5常见的加密方式有三种:16位、32位、40位,示例如下:
import hashlib
a = 123456
sign = hashlib.md5()
sign.update(str(a).encode('utf-8'))
s = sign.hexdigest()
md5_16 = s[8:24]
md5_32 = s
md5_40 = '0' * (40 - len(s)) + s
print(f'16位:{md5_16}长度:{len(md5_16)}')
print(f'32位:{md5_32}长度:{len(md5_32)}')
print(f'40位:{md5_40}长度:{len(md5_40)}')
在上述代码中,我们首先定义了一个字符串 original_str
,然后使用 hashlib 模块计算其 MD5 哈希值,并将结果转换为 16 位、32 位、40 位的字符串。其中,16 位的字符串取哈希值的第 9 位到第 24 位,32 位的字符串就是完整的哈希值,40 位的字符串在 32 位的字符串前面补 0,使其总长度为 40。
效果如下:
2、SHA
SHA的加密方式主要有:SHA1、SHA256、SHA512,其得出的位数分别是:40位、64位、128位。案例如下:
sha1 = hashlib.sha1()
sha1.update(str(a).encode('utf-8'))
sha1 = sha1.hexdigest()
print(sha1,len(sha1))
# 256
sha256 = hashlib.sha256()
sha256.update(str(a).encode('utf-8'))
sha256 = sha256.hexdigest()
print(sha256,len(sha256))
# 512
sha512 = hashlib.sha512()
sha512.update(str(a).encode('utf-8'))
sha512 = sha512.hexdigest()
print(sha512,len(sha512))
在上述代码中,我们首先定义了一个字符串 original_str
,然后使用 hashlib 模块分别计算了其 SHA-1、SHA-256、SHA-512 哈希值,并将其转换为十六进制字符串表示。最后,将计算得到的哈希值输出到控制台上。
效果如下:
四、可逆的加密方式
- 对称加密
主要包含三种:AES、DES、3DES。AES(Advanced Encryption Standard)、 DES(Data Encryption Standard)和3DES(Triple Data Encryption Standard)都是对称加密算法,也就是加密和解密使用同一个密钥的算法。
在 Python 中,可以使用 pycryptodome
或 cryptography
等第三方库来实现 AES 和 DES 加密。下面是使用 pycryptodome
库分别实现 AES 和 DES 加密
1、AES
AES 是一种比 DES 更加安全的对称加密算法,它的密钥长度可以为 128、192、256 位,加密和解密的过程都是通过将数据分成 128 位的块,然后对每个块进行加密或解密。由于 AES 的密钥长度较长,因此目前仍然被广泛使用。
总的来说,AES 比 DES 更加安全,因此在实际应用中,我们通常会使用 AES 来加密数据。而且,由于 AES 的加密速度比 DES 更快,因此在对大量数据进行加密时,AES 也比 DES 更加适合。
代码示例:
from Crypto.Cipher import AES
import base64
# 待加密的字符串
original_str = 'hello world'
# 密钥,长度必须是 16、24 或 32 个字符
key = '0123456789abcdef'
# 按照 PKCS#7 标准进行补位
BS = AES.block_size
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
original_str = pad(original_str)
# 使用 CBC 模式加密
iv = '0123456789abcdef'
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
encrypted_bytes = cipher.encrypt(original_str.encode('utf-8'))
# 将加密后的字节串转换为 base64 编码的字符串
encrypted_str = base64.b64encode(encrypted_bytes).decode('utf-8')
# 输出结果
print('原始字符串:', original_str)
print('AES 密钥:', key)
print('加密后的字符串:', encrypted_str)
在上述代码中,我们首先定义了一个字符串 original_str
和一个密钥 key
。然后,按照 PKCS#7 标准进行补位,并使用 AES 算法的 CBC 模式进行加密。最后,将加密后的字节串转换为 base64 编码的字符串,并输出到控制台上。
效果如下:
2、DES
DES 是最早期的对称加密算法之一,它的密钥长度为 56 位,加密和解密的过程都是通过将数据分成 64 位的块,然后对每个块进行加密或解密。由于 DES 的密钥长度较短,已经可以被暴力破解,因此现在已经不再被广泛使用。
代码案例:
from Crypto.Cipher import DES
import base64
# 待加密的字符串
original_str = 'hello word'
# 密钥,长度必须是 8 个字符
key = 'abcdefgh'
# 按照 PKCS#7 标准进行补位
BS = DES.block_size
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
original_str = pad(original_str)
# 使用 ECB 模式加密
cipher = DES.new(key.encode('utf-8'), DES.MODE_ECB)
encrypted_bytes = cipher.encrypt(original_str.encode('utf-8'))
# 将加密后的字节串转换为 base64 编码的字符串
encrypted_str = base64.b64encode(encrypted_bytes).decode('utf-8')
# 输出结果
print('原始字符串:', original_str)
print('DES 密钥:', key)
print('加密后的字符串:', encrypted_str)
在上述代码中,我们首先定义了一个字符串 original_str
和一个密钥 key
。然后,按照 PKCS#7 标准进行补位,并使用 DES 算法的 ECB 模式进行加密。最后,将加密后的字节串转换为 base64 编码的字符串,并输出到控制台上。
效果如下:
3、3DES
3DES(Triple Data Encryption Standard)是一种对称加密算法。它是对 DES(Data Encryption Standard)算法的改进,使用三次 DES 算法对数据进行加密,因此被称为 3DES。3DES 使用相同的密钥进行加密和解密,因此属于对称加密算法。
代码案例:
from Crypto.Cipher import DES3
import base64
# 待加密的字符串
original_str = 'hello word'
# 密钥,长度必须是 16 或 24 个字符
key = '0123456789abcdef01234567'
# 按照 PKCS#7 标准进行补位
BS = DES3.block_size
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
original_str = pad(original_str)
# 使用 CBC 模式加密
iv = '01234567'
cipher = DES3.new(key.encode('utf-8'), DES3.MODE_CBC, iv.encode('utf-8'))
encrypted_bytes = cipher.encrypt(original_str.encode('utf-8'))
# 将加密后的字节串转换为 base64 编码的字符串
encrypted_str = base64.b64encode(encrypted_bytes).decode('utf-8')
# 输出结果
print('原始字符串:', original_str)
print('3DES 密钥:', key)
print('加密后的字符串:', encrypted_str)
在上述代码中,我们首先定义了一个字符串 original_str
和一个密钥 key
。然后,按照 PKCS#7 标准进行补位,并使用 3DES 算法的 CBC 模式进行加密。最后,将加密后的字节串转换为 base64 编码的字符串,并输出到控制台上。
五、非对称加密
非对称加密主要是RSA用的较多。
-
(私钥和公钥)同一个明文可以生成不同密文。
-
特点:密文长度始终是344,且后面会带有两个等号==
RSA 是一种非对称加密算法,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 三人于 1977 年共同提出,其名称取自他们三人的姓氏的第一个字母。RSA 算法的安全性基于大数分解的难度,其公钥和私钥是一对,公钥可以公开,私钥必须保密。
RSA 算法的加密过程如下:
- 选择两个大素数 p 和 q,并计算它们的乘积 n=p*q。
- 计算欧拉函数 φ(n)=(p-1)(q-1)。
- 选择一个整数 e,使得 1<e<φ(n) 且 e 与 φ(n) 互质。
- 计算 e 关于模 φ(n) 的乘法逆元 d,即 e*d ≡ 1 (mod φ(n))。
- 将 n 和 e 组成公钥,将 n 和 d 组成私钥。
- 加密时,将明文 m 转换为整数 M,计算密文 C=M^e(mod n)。
- 解密时,将密文 C 计算出明文 M=C^d(mod n)。
代码示例:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
# 生成 RSA 密钥对
key = RSA.generate(2048)
# 待加密的字符串
original_str = '123456'
# 使用公钥进行加密
cipher = PKCS1_v1_5.new(key.publickey())
encrypted_bytes = cipher.encrypt(original_str.encode('utf-8'))
# 将加密后的字节串转换为 base64 编码的字符串
encrypted_str = base64.b64encode(encrypted_bytes).decode('utf-8')
# 使用私钥进行解密
cipher = PKCS1_v1_5.new(key)
decrypted_bytes = cipher.decrypt(base64.b64decode(encrypted_str), None)
decrypted_str = decrypted_bytes.decode('utf-8')
# 输出结果
print('原始字符串:', original_str)
print('RSA 公钥:', key.publickey().export_key().decode('utf-8'))
print('RSA 私钥:', key.export_key().decode('utf-8'))
print(f'加密后的字符串:长度{len(encrypted_str)}', encrypted_str)
print('解密后的字符串:', decrypted_str)
结果如下:
原始字符串: hello word
RSA 公钥: -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtfs++xFMq8ksoF4OIFhl
Nczk79cCYL2rY51IQtzN9dZlfeUnLDNl53pqucj4ExMXyj0Ve4F45v/GV6nm9WkH
0eAIoApYrQa4wGu0gGRfk12yr1jNrlFN0F/IEwbBcc8ZWAXfZ2v3EAJtP4s4oJMh
YohHL3/j8VopJcDOEnnUtSFbMX7YP/g1iba61/iYXb5npv4gcmvOy7kb3aoc4gwa
TxsVjaNXcQQR32At12w5pF/7EuafN3BOlO4ATw3sLoBeJMwSNKnFNRPSr9CshLyY
UOVgssIgGSgSsPqR87wDRORQh/WMIuY9jixokOz6iAiJBvZD2KrnMEckwfVriVwI
IQIDAQAB
-----END PUBLIC KEY-----
RSA 私钥: -----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAtfs++xFMq8ksoF4OIFhlNczk79cCYL2rY51IQtzN9dZlfeUn
LDNl53pqucj4ExMXyj0Ve4F45v/GV6nm9WkH0eAIoApYrQa4wGu0gGRfk12yr1jN
rlFN0F/IEwbBcc8ZWAXfZ2v3EAJtP4s4oJMhYohHL3/j8VopJcDOEnnUtSFbMX7Y
P/g1iba61/iYXb5npv4gcmvOy7kb3aoc4gwaTxsVjaNXcQQR32At12w5pF/7Euaf
N3BOlO4ATw3sLoBeJMwSNKnFNRPSr9CshLyYUOVgssIgGSgSsPqR87wDRORQh/WM
IuY9jixokOz6iAiJBvZD2KrnMEckwfVriVwIIQIDAQABAoIBAAsxhiXmrwFQ0V9k
QAv9elNtJAnPZYe/MuF6MhDDlYf3cex+YcK/8jBjFCYTgy39LY67Fu0VWvMhrJ84
xdcdG9kgP1ErKCaTmsQvLv37Ib8Mc0Po1O64QbtW7a7Wtz0n89M5U6ZmlCt80rmm
934DZSxmQ7N1Jndye14Lz9qzRrU4J1iphzT+M+QijjK7eVcy8CO/EF799C0C3WG2
3weBxQD+0/XDKT3lwav9ItOBuqxtEA85KMgG0XsYg8c14gFqav4zm56yX05x0pw9
uDZRKI8azg5UEE8EvTgDBf4UH8t7xQrQKCFL11dxm4G9yavG4mKVWT8he9ic9aeP
7u/l0tcCgYEAzq58+Mu0kXWT2Vk3MW4HXWxblXPsnKmfZWvDzkk33yI79/A4Y7K2
5ZC/3BqjOGbb8fAwO39S8GUUKJ0LchN/hKSvZV36rRjursQfsUReQ1qEzkPXqMeD
3XYL1vN9l48s9FWeOtYO02AZidNfBv7cYyuMcsqewImqYkJhJtfQNicCgYEA4Wfn
i44CUCV7stTfKA+B8J/TVwx/l3QKOvVXa+tRPhRpzA3xcgP0iHOpnzs8O1hRxxvq
hYFik5hDB5PT4AU4HLh2Bu2it3POp26DJUcNG+Kl7F5iSy1GVKS807YKxdZfl8d/
jWlrzREF2RxWgNOmKJIjQMA+eYu0Upe2WigbxHcCgYEAtXIsFsPHNzgw30xajxOY
daUOVguaewLTA9fy46QV39ePLCEBcE1SEgHc3d+o0XhDuYfy4BjseE1UwD728GQ7
u/hUXzp9Ov+7c0SMyjRKSPkrxGV87BiUJJVg2YmUBb1Vav/LVL3d8CXa5cviDiMq
2gk+WPyXGFMDeRXrco1eplsCgYEApMe2x5irLDgas+NWuAyOK4BLmalzZR7Zk7xj
imte2wlFRn0y8uzdSRt09wjwwVmRfwNzcOHjVI7NAa8aBv0JxkU7U1lJyN8KRfBO
Q2QruyT3s1JUfSy964b627KLMZHEFEstfg2BV0qIge1rd4ZCRAqBZwajJWvyCScL
keEcW4UCgYEAhA5oLgYDj50Bir8xsuKyXBp0maqZ/ZYzdGNqgwHqmaJJuh3arvVo
a+1UH33WyRjLLRAlmjqEOVxfyhRDBWVNVYKt/+hVwKbjowSqMpYPMy07AgcxGNMK
Ji9EXF25gtbaMckKuMKI1HGcQ6hPqLYuP8kfAcsATZFmnFPPt1KjZHU=
-----END RSA PRIVATE KEY-----
加密后的字符串:长度344 DueDrUz7hg8m3CADRJSSaxbXes4Vo8cEyf7HuDyTRzRtTpHjI6B/A36uyKxROXUWynktYvRzvX0MtwxlAMisATdbdqQRJUsx16C7FACfu1GjdFbkBLeKl1IFpYQp2SQikE56XMl7K/dBldnn/vKc5v8SE5GE1VKebzJM7lkremb4LdvHfkHSQnT2Niq5AQYcycUZrZW1qcoDVR6rffJuzyulwDgV39Vc/OBF4PcVQ7erGGBwHlNCrgmXNm+ZXTgLs280lFpLxk1J6w0TDssyFsWILlWQ1kgM9uRCGC8Xn3c7Z7kZkuYLWj2IsYVUGfTZxSnUqyOOnufaJK7VaS22Sg==
解密后的字符串: hello word