大趋势是国密,可以先认识一下:
1. SM2算法
-
对应国际算法:RSA(功能性对标)与ECC(技术对标) -
SM2是基于椭圆曲线密码学(ECC)的非对称加密算法,其设计对标国际ECC标准(如ECDSA、ECDH)26,但改进了安全性机制(如签名流程更复杂)78。 -
密钥效率:256位SM2的安全性与3072位RSA相当,计算速度显著优于RSA26,因此被视为RSA的替代方案67。
2. SM3算法
-
对应国际算法:SHA-256 -
SM3是输出长度为256位的哈希算法,其设计目标与SHA-256类似,主要用于数据完整性校验和数字签名25。 -
安全性差异:SM3通过增加迭代轮数(32轮)和优化消息混淆步骤,抗碰撞性理论上更强57,但两者均被广泛认为满足当前商用安全需求46。
3. SM4算法
-
对应国际算法:AES -
SM4是分组长度为128位的对称加密算法,与AES的密钥和分组长度一致,用于替代DES和3DES13。 - 性能对比:SM4采用32轮非线性迭代结构,加密效率与AES相当,但算法设计更简洁,适合软硬件实现35。国际场景下AES普及率更高,而国内政务、金融领域正逐步推广SM4
|
|
|
|
|
|
|
---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const smCrypto = require('sm-crypto');
// 明文数据
const plainText = 'daodao';
console.log('明文:', plainText);
// 1. 生成 SM2 密钥对(十六进制格式)
const keypair = smCrypto.sm2.generateKeyPairHex();
console.log(keypair); // 输出密钥对对象
// 2. 加密配置(默认 C1C3C2 模式)
const cipherMode = 1; // 0=C1C2C3, 1=C1C3C2
// 3. 使用公钥加密
const encryptedData = smCrypto.sm2.doEncrypt(plainText, keypair.publicKey, cipherMode);
console.log('加密结果:', encryptedData); // 输出密文
// 4. 使用私钥解密
const decryptedData = smCrypto.sm2.doDecrypt(encryptedData, keypair.privateKey, cipherMode);
console.log('解密结果:', decryptedData); // 输出解密后的明文
输出结果
明文: daodao
{
privateKey: '52752246a050229ffa19dd8d187d98e59edaf4075582433735e219f8be35ab43',
publicKey: '04abff3b083b5280c93aea122895a894c2f91d697275c58b3c5e55f2ad8706cf513113d9c66109fd78eb4394bb472b66757bdb2c37
501b3f9d7102b969a70e31ad'
}
加密结果: 9b2cbe85b0730a51093970f7fe592a9599c3eafbd11af7d3e536ddb568e7f09f842e304a9da8bc8a343facc623a24163188f662ef1528c39eda4771e09ebe5da3704a08289aa62d4df71b77a6ebe7d5c83
8c1a5c0cc9232a73a1c17ba928103cb7874ea640
解密结果: daodao
SM3代码示例:
SM3 为单向哈希,相当于md5的特性;
const smCrypto = require('sm-crypto');
// 明文数据
const plainText = 'daodao';
console.log('明文:', plainText);
// 使用sm-crypto库进行SM3加密
const SM3Data = smCrypto.sm3(plainText);
console.log("sm3加密: "+SM3Data);
输出结果:
明文: daodao
sm3加密: bf67da33596f1f071b60fd2606da915a47a742d97f52159e3208cbd582a5cb08
SM4代码示例:
// 密钥 iv
const smCrypto = require("sm-crypto");
// 密钥和IV(16字节十六进制字符串)
const IV = "1234567887654321abcdefghhgfedcba";
const KEY = '0123456789abcdeffedcba9876543210';
// ECB模式加密
function ecbEncrypt(plainText) {
return smCrypto.sm4.encrypt(plainText, KEY);
}
// ECB模式解密
function ecbDecrypt(cipherText) {
return smCrypto.sm4.decrypt(cipherText, KEY);
}
// CBC模式加密
function cbcEncrypt(plainText) {
return smCrypto.sm4.encrypt(plainText, KEY, {
mode: 'cbc',
iv: IV,
output: 'base64' });
}
// CBC模式解密
function cbcDecrypt(cipherText) {
return smCrypto.sm4.decrypt(cipherText, KEY, {
mode: 'cbc',
iv: IV, });
}
// 测试用例
const text = 'Hello daoGe';
console.log('明文数据:', text);
const ecbCipher = ecbEncrypt(text);
console.log('ECB加密:', ecbCipher);
console.log('ECB解密:', ecbDecrypt(ecbCipher));
const cbcCipher = cbcEncrypt(text);
console.log('CBC加密:', cbcCipher);
console.log('CBC解密:', cbcDecrypt(cbcCipher));
输出结果:
明文数据: Hello daoGe
ECB加密: 9740921981c6156529dc17ee606d3e5b
ECB解密: Hello daoGe
CBC加密: 3b6cb0b775a65e069cba72c8dd4d15ea
CBC解密: Hello daoGe
以下是一个SM2+SM3+SM4的案例:
谷歌调试定位代码:sign、encrypt、decrypt、password、sm关键字等;或者追踪其调用栈
定位到其加密函数:
加密函数实现:
定位到其解密函数:
解密函数实现:
最后扣代码,使用python实现js代码自动加解密
注:扣完代码,代码开头要加上window全局对象!!!!!
或者V_jstools、Jsrpc、Autodecoder三者自动加解密;这里就不写了!
https://github.com/cilame/v_jstools
https://github.com/jxhczhl/JsRpc
https://github.com/f0ng/autoDecoder
原文始发于微信公众号(吾入安全圈的二手程序猿):js逆向之国密算法
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论