爬虫逆向加密技术详解之对称加密算法:SM4加密解密

news2025/5/13 5:21:22

文章目录

  • 一、对称加密介绍
  • 二、SM4算法简介
  • 三、SM4加密解密原理
  • 四、快速识别SM4加密的方法
    • 4.1 密文长度判断
    • 4.2 验证密文字符集
    • 4.3 代码特征识别
  • 五、代码实现
    • 5.1 JavaScript实现SM4加密解密
    • 5.2 Python实现SM4加密解密

一、对称加密介绍


SM4属于对称加密算法,不知道什么是对称加密的小伙伴请看这篇文章:https://blog.csdn.net/thy525/article/details/147700959


二、SM4算法简介

SM4 是中国国家密码管理局发布的一种分组密码算法,也被称为国密 SM4 算法。它是一种对称加密算法,用于替代 DES 和 AES 等传统的对称加密算法。 其中“SM”代表“商密”,即用于商用的、不涉及国家秘密的密码技术。

核心参数定义 :

  1. 密钥与密钥位数

    • 密钥长度固定为128位(16字节),加密与解密使用同一密钥。
    • 密钥扩展:将初始密钥通过非线性变换生成32个32位轮密钥(RK₀至RK₃₁),用于32轮迭代加密。
  2. 初始向量(IV)

    • 在CBC、CFB等模式中需使用IV,长度为16字节,用于初始化加密状态,确保相同明文在不同加密操作中产生不同密文。
  3. 加密模式

    • ECB(电子密码本):明文分组独立加密,安全性低,不推荐用于敏感数据。
    • CBC(密码分组链接):前一块密文与当前明文异或后加密,适用于文件加密。
    • CTR(计数器模式):将块加密转为流密码,适合大数据量并行加密。
  4. 填充方式

    • 常用PKCS#5/PKCS#7填充,确保明文长度为分组长度(16字节)的整数倍。

三、SM4加密解密原理

  1. 加密流程

    • 密钥扩展:128位密钥生成32个轮密钥。
    • 分组处理:明文按128位分组,不足则填充。
    • 32轮迭代
      • 轮函数F:包含S盒替换(非线性变换)和线性变换(L函数),每轮使用一个轮密钥。
      • 反序变换:第32轮输出反序后得到密文。
  2. 解密流程

    • 与加密流程相同,但轮密钥按逆序(RK₃₁至RK₀)使用。

四、快速识别SM4加密的方法

4.1 密文长度判断

密文长度是 16 字节分组的整数倍转换为十六进制后的结果,通常是 16 或者32 的倍数。

4.2 验证密文字符集

密文是十六进制字符串,由字符 0 - 9a - f 组成。

4.3 代码特征识别

代码中可能包含SM4CryptSM4等算法标识。

总结:密文为十六进制字符串,这是与其他使用 Base64 编码的加密算法明显不同的特征。结合使用的 SM4 加密库和 16 字节分组的规律,可推测为 SM4 加密结果。

五、代码实现

5.1 JavaScript实现SM4加密解密

const sm4 = require('sm-crypto').sm4;

// SM4 加密函数,使用 CBC 模式和偏移量
function sm4Encrypt(plainText, key, iv) {
    return sm4.encrypt(plainText, key, {
        mode: 'cbc',
        iv: iv
    });
}

// SM4 解密函数,使用 CBC 模式和偏移量
function sm4Decrypt(cipherText, key, iv) {
    return sm4.decrypt(cipherText, key, {
        mode: 'cbc',
        iv: iv
    });
}

const plainText = '123456';
const key = '0123456789abcdeffedcba9876543210'; // 16字节密钥(Hex)
const iv = '00000000000000000000000000000000';  // 16字节IV(Hex)
const encrypted = sm4Encrypt(plainText, key, iv);
const decrypted = sm4Decrypt(encrypted, key, iv);

console.log('SM4 加密后密文: ', encrypted);
console.log('SM4 加密后密文长度: ', encrypted.length);
console.log('SM4 解密后: ', decrypted);

运行结果:

SM4 加密后密文:  13c71106a5aad6efddd2476f44565f37
SM4 加密后密文长度:  32
SM4 解密后:  123456

5.2 Python实现SM4加密解密

from gmssl import sm4


def sm4_encrypt(plain_text, key, iv):
    """
    SM4 加密函数,使用 CBC 模式和偏移量
    :param plain_text: 明文(字节串或字符串)
    :param key: 密钥(16字节或32字节的字节串)
    :param iv: 初始化向量(16字节的字节串)
    :return: 加密后的密文(字节串)
    """
    if isinstance(plain_text, str):
        plain_text = plain_text.encode('utf-8')
    if isinstance(key, str):
        key = bytes.fromhex(key)
    if isinstance(iv, str):
        iv = bytes.fromhex(iv)

    crypt_sm4 = sm4.CryptSM4()
    crypt_sm4.set_key(key, sm4.SM4_ENCRYPT)
    cipher_text = crypt_sm4.crypt_cbc(iv, plain_text)
    return cipher_text


def sm4_decrypt(cipher_text, key, iv):
    """
    SM4 解密函数,使用 CBC 模式和偏移量
    :param cipher_text: 密文(字节串)
    :param key: 密钥(16字节或32字节的字节串)
    :param iv: 初始化向量(16字节的字节串)
    :return: 解密后的明文(字节串)
    """
    if isinstance(key, str):
        key = bytes.fromhex(key)
    if isinstance(iv, str):
        iv = bytes.fromhex(iv)

    crypt_sm4 = sm4.CryptSM4()
    crypt_sm4.set_key(key, sm4.SM4_DECRYPT)
    plain_text = crypt_sm4.crypt_cbc(iv, cipher_text)
    return plain_text


# 示例使用
plain_text = '123456'
key = '0123456789abcdeffedcba9876543210'  # 16字节密钥(Hex)
iv = '00000000000000000000000000000000'  # 16字节IV(Hex)

# 加密
encrypted = sm4_encrypt(plain_text, key, iv)
print('SM4 加密后密文:', encrypted.hex())
print('SM4 加密后密文长度:', len(encrypted))

# 解密
decrypted = sm4_decrypt(encrypted, key, iv)
print('SM4 解密后:', decrypted.decode('utf-8'))

运行结果:

SM4 加密后密文:  13c71106a5aad6efddd2476f44565f37
SM4 加密后密文长度:  32
SM4 解密后:  123456

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TAPIP3D:持久3D几何中跟踪任意点

简述 在视频中跟踪一个点(比如一个物体的某个特定位置)听起来简单,但实际上很复杂,尤其是在3D空间中。传统方法通常在2D图像上跟踪像素,但这忽略了物体的3D几何信息和摄像机的运动,导致跟踪不稳定&#xf…

uniapp 生成海报二维码 (微信小程序)

先下载qrcodenpm install qrcode 调用 community_poster.vue <template><view class"poster-page"><uv-navbar title"物业推广码" placeholder autoBack></uv-navbar><view class"community-info"><text clas…

16.Excel:数据收集

一 使用在线协作工具 简道云。 excel的在线表格协作在国内无法使用&#xff0c;而数据采集最需要在线协作。 二 使用 excel 1.制作表格 在使用excel进行数据采集的时候&#xff0c;会制作表头给填写人&#xff0c;最好还制作一个示例。 1.输入提示 当点击某个单元格的时候&am…

AI系列:智能音箱技术简析

AI系列&#xff1a;智能音箱技术简析 智能音箱工作原理详解&#xff1a;从唤醒到执行的AIPipeline-CSDN博客 挑战真实场景对话——小爱同学背后关键技术深度解析 - 知乎 (zhihu.com) AI音箱的原理&#xff0c;小爱同学、天猫精灵、siri。_小爱同学原理-CSDN博客 智能音箱执行步…

BUUCTF——Ezpop

BUUCTF——Ezpop 进入靶场 给了php代码 <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier {protected $v…

三、Hadoop1.X及其组件的深度剖析

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 专栏&#xff1a;Hadoop教程 一、Hadoop 1.X 概述 &#xff08;一&#xff09;概念 Hadoop 是 Apache 开发的分布式系统基础架构&#xff0c;用 Java 编写&#xff0c;为集群处理大型数据集提供编程模型&#xff0c;…

PDF2zh插件在zotero中安装并使用

1、首先根据PDF2zh说明文档&#xff0c;安装PDF2zh https://github.com/guaguastandup/zotero-pdf2zh/tree/v2.4.0 我没有使用conda&#xff0c;直接使用pip安装pdf2zh &#xff08;Python版本要求3.10 < version <3.12&#xff09; pip install pdf2zh1.9.6 flask pypd…

springboot3+vue3融合项目实战-大事件文章管理系统-更新用户密码

大致分为这三步 首先在usercontroller中增加updatePwd方法 PatchMapping ("/updatePwd")public Result updatePwd(RequestBody Map<String,String> params){//1.校验参数String oldPwd params.get("old_pwd");String newPwd params.get("n…

C++GO语言socket套接字

目录 01 06-socket-client-server通信过程分析 02 07-socket-server-单次处理 03 08-socket-client 01 09-socket-server-多连接建立 02 10-socket-client多次发送数据 01 -socket-client-server通信过程分析 ### - Server Demo接收一个链接&#xff0c;而且只能发送一次数…

WebSocket:实时通信的新时代

在现代Web应用中&#xff0c;实时通信变得越来越重要。传统的HTTP协议虽然能够满足基本的请求-响应模式&#xff0c;但在需要频繁更新数据的场景下&#xff0c;其效率和性能显得捉襟见肘。WebSocket协议应运而生&#xff0c;它提供了一种在单个TCP连接上进行全双工通信的机制&a…

IT/OT 融合架构下的工业控制系统安全攻防实战研究

1. 引言 随着工业 4.0 和智能制造的浪潮席卷全球&#xff0c;信息技术 (IT) 与运营技术 (OT) 的融合已成为不可逆转的趋势。这种融合旨在通过实时数据交换和分析&#xff0c;打破传统的信息孤岛&#xff0c;显著提升生产效率、优化决策、降低运营成本并增强市场竞争力。IT 系统…

基于Qt的app开发第六天

写在前面 博主是一个大一下的计科生&#xff0c;现在正在做C面向对象程序设计的课程设计&#xff0c;具体功能可以看本专栏的第一篇博客。 目前的进度是&#xff1a;配好MySQL驱动->设计完界面->实现各个界面的切换 这一篇博主要初步实现待办板块的功能&#xff0c;即新建…

npm create vite@latest my-vue-app 解读

背景发荧光的样式。 filter属性的学习&#xff1a;filter - CSS&#xff1a;层叠样式表 | MDN 复习一下em 组件的调用: 是msg让“ViteVue”显示出来的&#xff01;&#xff01; a标签的targte属性&#xff1a; 组件之间怎么传值的&#xff1a; &#xff0c;没看懂code标签怎么…

【SpringCloud GateWay】Connection prematurely closed BEFORE response 报错分析与解决方案

一、背景 今天业务方调用我们的网关服务报错: Connection prematurely closed BEFORE response二、原因分析 三、解决方案 第一步: 增加 SCG 服务的JVM启动参数,调整连接获取策略。 将连接池获取策略由默认的 FIFO&#xff08;先进先出&#xff09;变更为 LIFO&#xff08…

PD快充诱骗协议芯片XSP04D与主板共用一个Type-C和电脑传输数据

随着智能电子产品的广泛应用&#xff0c;快充方案越来越受到重视&#xff0c;且迭代次数也更加频繁。在一些使用频率较高、耗电较大的电子产品中&#xff0c;快充方案也成为了大多数人的追求&#xff0c;它能很大程度上缩短充电的时间&#xff0c;例如XSP04D这款快充诱骗协议方…

goland无法debug

goland无法使用debug&#xff0c;修复_goland无法debug-CSDN博客

ECLIC中断流程及实际应用 —— RISC-V中断机制(二)

在长期的嵌入式开发实践中&#xff0c;对中断机制的理解始终停留在表面层次&#xff0c;特别当开发者长期局限于纯软件抽象层面时&#xff0c;对中断机制的理解极易陷入"知其然而不知其所以然"的困境&#xff0c;这种认知的局限更为明显&#xff1b;随着工作需要不断…

【网络分析工具】网络工具wireshark、TCPdump、iperf使用详解

这里写目录标题 1. wireshark1.1. 过滤包1.2. 常见分析 2. tcpdump3. iperf 1. wireshark **ip.dst eq 10.0.0.21** 是用于网络流量分析工具&#xff08;例如 Wireshark 或 tcpdump&#xff09;的过滤器表达式。 它的作用是筛选出所有目标IP地址为 10.0.0.21 的数据包 IP.add…

debian中笔记本的省电选择auto-cpufreq

在reddit中&#xff0c;看评论区出现这个软件&#xff0c;于是打算尝试一下&#xff0c;应该能对不使用电源时笔记本的省电起到一定的作用。 https://github.com/AdnanHodzic/auto-cpufreq?tabreadme-ov-file#why-do-i-need-auto-cpufreq 作用 One of the problems with Linux…

力扣热题100之环形链表 II

题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使…