最近做JS逆向时遇到了AES,RSA,Base64,Base32等解码,特此汇总一下解密/码方式,不定时更新。
RSA
参考文档:RSA加密解密原理
加密方式
加密公式
C = % n
解密公式
M = % n
字母 | M | C | d | e | n |
含义 | 明文 | 密文 | 私钥 | 公钥 | 公共模数 |
n = p*q(p,q为质数,越大越安全)
e*d* =1
1 < e < (e取值是整数,e和 是互质数)
解密方式
必须知道C,e,n或pq
示例:
已知c = 32949 e = 42667 n = 64741
对n因式分解p = 101 q = 641
因式分解网站:因式分解网站
解密代码如下:
c = 32949
e = 42667
n = 64741
p = 101
q = 641
def egcd(a, b):
if a == 0:
return b, 0, 1
else:
g, x, y = egcd(b % a, a)
return g, y - (b // a) * x, x
def modinv(a, p, q):
m = calculate_phi(p, q)
g, x, y = egcd(a, m)
if g != 1:
raise Exception('Modular inverse does not exist')
else:
return x % m
# 计算 φ(n)
def calculate_phi(p, q):
return (p - 1) * (q - 1)
def rsa(c, d, n):
return c ** d % n
d = modinv(e, p, q)
result = rsa(c, d, n)
print("密码是:", result)
结果为18429
AES
加密方式
加密公式
字母 | K | C | P |
含义 | 秘钥 | 密文 | 明文 |
加密模式
1.电码本模式(ECB),这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。
2.密码分组链接模式(CBC),这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
3.计算器模式(CTR),这种模式不常见,在CTR模式中,有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。
4.密码反馈模式(CFB),在这种模式下,输入数据块可以直接与加密算法的输出进行混合,从而得到加密的数据。
5.输出反馈模式(OFB),在这种模式下,输入数据块与加密算法输出的反馈进行混合,从而得到加密的数据。
解密方式
CBC模式
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
# 1. 初始化AES加密器
key = get_random_bytes(16) # 16字节密钥
cipher = AES.new(key, AES.MODE_CBC) # 使用CBC模式
# 2. 加密数据
plaintext = b'This is a secret message'
ciphertext = cipher.encrypt(plaintext)
# 3. 解密数据
decipher = AES.new(key, AES.MODE_CBC, iv=cipher.iv) # 使用相同的密钥和IV
decrypted_data = decipher.decrypt(ciphertext)
# 4. 打印解密后的数据
print("解密后的数据:", decrypted_data)
ECB模式
from Crypto.Cipher import AES
# 初始化AES加密器和密钥
key = b'Sixteen byte key'
cipher = AES.new(key, AES.MODE_ECB)
# 解密数据
plaintext = cipher.decrypt(ciphertext)
CFB模式
from Crypto.Cipher import AES
# 初始化AES加密器和密钥
key = b'Sixteen byte key'
iv = b'InitializationVe' # 16字节的初始向量
cipher = AES.new(key, AES.MODE_CFB, iv=iv)
# 解密数据
plaintext = cipher.decrypt(ciphertext)
OFB模式
from Crypto.Cipher import AES
# 初始化AES加密器和密钥
key = b'Sixteen byte key'
iv = b'InitializationVe' # 16字节的初始向量
cipher = AES.new(key, AES.MODE_OFB, iv=iv)
# 解密数据
plaintext = cipher.decrypt(ciphertext)
CTR模式
from Crypto.Cipher import AES
# 初始化AES加密器和密钥
key = b'Sixteen byte key'
nonce = b'Nonce' # 随机数,不是初始向量
cipher = AES.new(key, AES.MODE_CTR, nonce=nonce)
# 解密数据
plaintext = cipher.decrypt(ciphertext)
Base64
import base64
# 要解码的Base64编码字符串
base64_encoded_data = "5rGf5rmW5LiA5p2h6bG8"
# 使用base64模块解码
decoded_data = base64.b64decode(base64_encoded_data)
# 将解码后的数据转换为字符串
decoded_string = decoded_data.decode('utf-8')
print(decoded_string)
Base32
import base64
# 要解码的Base32编码字符串
base32_encoded_data = "42YZ7ZVZS3SLRAHGTWQ6TMN4"
# 使用base64模块解码
decoded_data = base64.b32decode(base32_encoded_data)
# 将解码后的数据转换为字符串
decoded_string = decoded_data.decode('utf-8')
print(decoded_string)
MD5模拟加密
import hashlib
# 要加密的字符串
string_to_encrypt = "江湖一条鱼"
# 创建md5对象
md5 = hashlib.md5()
# 更新md5对象
md5.update(string_to_encrypt.encode())
# 获取md5哈希值
md5_hash = md5.hexdigest()
print(md5_hash)