crypto 加密解密——AES / DES / RSA / MD5 / SHA 一网打尽
支持的算法
| 类别 | 算法 | 方法名 |
|---|---|---|
| 消息摘要 | MD5 | crypto.md5(input) |
| SHA-1 | crypto.sha1(input) | |
| SHA-256 | crypto.sha256(input) | |
| SHA-512 | crypto.sha512(input) | |
| 对称加密 | AES | crypto.aesEncrypt / aesDecrypt |
| DES | crypto.desEncrypt / desDecrypt | |
| 非对称加密 | RSA | crypto.rsaEncrypt / rsaDecrypt |
| 基础转换 | Base64 | base64.encode / base64.decode |
| Hex | crypto.toHex / crypto.fromHex |
消息摘要(不可逆)
var hash = crypto.md5('hello world');
console.log('MD5: ' + hash);
var sha = crypto.sha256('hello world');
console.log('SHA-256: ' + sha);
输入是字符串,输出也是字符串(十六进制格式)。
AES 对称加密
var key = '1234567890abcdef'; // 16 字节 key(AES-128)
var iv = 'fedcba9876543210'; // 16 字节 IV
var encrypted = crypto.aesEncrypt('你好,JsHook', key, iv);
console.log('加密后: ' + encrypted);
var decrypted = crypto.aesDecrypt(encrypted, key, iv);
console.log('解密后: ' + decrypted);
key 和 IV 长度取决于模式:
- AES-128:key 16 字节
- AES-192:key 24 字节
- AES-256:key 32 字节
- CBC 模式 IV 必须 16 字节
- ECB 模式不需要 IV(传 null)
RSA 非对称加密
// 公钥加密
var encrypted = crypto.rsaEncrypt('消息内容', publicKey);
// 私钥解密
var decrypted = crypto.rsaDecrypt(encrypted, privateKey);
密钥格式取决于 JsHook 内部实现,通常支持 PEM 格式字符串。
Base64
var encoded = base64.encode('hello world');
console.log(encoded); // aGVsbG8gd29ybGQ=
var decoded = base64.decode(encoded);
console.log(decoded); // hello world
Base64 同时在 crypto 模块和独立的 base64 模块中提供。
典型使用场景
抓取网络请求解密
目标应用用 AES 加密请求体,密钥硬编码在 Java 代码里。Hook 拿到 key 后用 crypto 模块解密看看真实内容:
Java.perform(function () {
var RequestEncryptor = Java.use('com.example.net.RequestEncryptor');
RequestEncryptor.encrypt.implementation = function (plainText) {
// 调用原加密,同时用 crypto 模块解密看看
var encrypted = this.encrypt(plainText);
var decrypted = crypto.aesDecrypt(encrypted, myKey, myIV);
console.log('[+] 加密前: ' + plainText);
console.log('[+] 加密后: ' + encrypted);
console.log('[+] crypto 解密验证: ' + decrypted);
return encrypted;
};
});
验证签名
目标应用对请求做了签名(MD5/SHA + salt),Hook 拿到参与签名的参数和 salt,用 crypto 模块复现签名过程验证逻辑:
var signStr = params + mySalt;
var sign = crypto.md5(signStr);
console.log('[+] 计算出的签名: ' + sign);
加密方向注意
JS 层的 crypto 模块运行在 Frida 注入的同一进程里,可以访问目标应用的内存。它的价值在于帮助你快速复现应用内部的加密逻辑,而不是提供比应用本身更强的加密能力。