乐之之

知而行乐,乐而行之,天道酬勤,学无止境。
常见的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 算法的加密过程如下:

  1. 选择两个大素数 p 和 q,并计算它们的乘积 n=p*q。
  2. 计算欧拉函数 φ(n)=(p-1)(q-1)。
  3. 选择一个整数 e,使得 1<e<φ(n) 且 e 与 φ(n) 互质。
  4. 计算 e 关于模 φ(n) 的乘法逆元 d,即 e*d ≡ 1 (mod φ(n))。
  5. 将 n 和 e 组成公钥,将 n 和 d 组成私钥。
  6. 加密时,将明文 m 转换为整数 M,计算密文 C=M^e(mod n)。
  7. 解密时,将密文 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

 

posted on 2023-05-06 15:03  乐之之  阅读(738)  评论(0编辑  收藏  举报