js逆向之国密算法

admin 2025年5月15日09:24:27评论2 views字数 3377阅读11分15秒阅读模式

大趋势是国密,可以先认识一下:

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
算法
类别
对标国际算法
密钥/分组长度
设计原理
主要优势
典型应用场景
SM2
非对称加密
ECC / RSA
256位
椭圆曲线密码学(ECC)
密钥短、效率高、自主可控
数字签名、密钥交换、公钥加密
SM3
哈希算法
SHA-256
256位输出
增强型抗碰撞哈希结构
抗碰撞性强,安全性对标国际
数据完整性校验、数字证书
SM4
对称加密
AES
128位分组
Feistel网络结构(32轮迭代)
结构简洁、适配国产硬件
数据加密(金融、通信领域)
下面是使用js代码实现SM2、SM3、SM4的案例
SM2代码示例:
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: '04abff3b083b5280c93aea122895a894c2f91d697275c58b3c5e55f2ad8706cf513113d9c66109fd78eb4394bb472b66757bdb2c37501b3f9d7102b969a70e31ad'}加密结果: 9b2cbe85b0730a51093970f7fe592a9599c3eafbd11af7d3e536ddb568e7f09f842e304a9da8bc8a343facc623a24163188f662ef1528c39eda4771e09ebe5da3704a08289aa62d4df71b77a6ebe7d5c838c1a5c0cc9232a73a1c17ba928103cb7874ea640解密结果: 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);

输出结果:

明文: daodaosm3加密: bf67da33596f1f071b60fd2606da915a47a742d97f52159e3208cbd582a5cb08

SM4代码示例:

// 密钥 ivconst 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',        ivIV,        output'base64' });}// CBC模式解密function cbcDecrypt(cipherText) {    return smCrypto.sm4.decrypt(cipherText, KEY, {        mode'cbc',        ivIV, });}// 测试用例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 daoGeECB加密: 9740921981c6156529dc17ee606d3e5bECB解密: Hello daoGeCBC加密: 3b6cb0b775a65e069cba72c8dd4d15eaCBC解密: Hello daoGe

以下是一个SM2+SM3+SM4的案例:

谷歌调试定位代码:sign、encrypt、decrypt、password、sm关键字等;或者追踪其调用栈

定位到其加密函数:

js逆向之国密算法

加密函数实现:

js逆向之国密算法

定位到其解密函数:

js逆向之国密算法

解密函数实现:

js逆向之国密算法

最后扣代码,使用python实现js代码自动加解密

注:扣完代码,代码开头要加上window全局对象!!!!!

或者V_jstools、Jsrpc、Autodecoder三者自动加解密;这里就不写了!

https://github.com/cilame/v_jstools

https://github.com/jxhczhl/JsRpc

https://github.com/f0ng/autoDecoder

原文始发于微信公众号(吾入安全圈的二手程序猿):js逆向之国密算法

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月15日09:24:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   js逆向之国密算法https://cn-sec.com/archives/4065558.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息