DES 加密解密实现之旅
tangkaixing 发表于 中国 渗透测试 503浏览 · 2025-06-25 09:23

1. 概述

本文将记录从某次渗透实战登录遇到的des加密,分析 des.jslogin.jsp 文件到成功实现加密解密功能的全过程。通过这一过程,不仅深入理解了 DES 加密算法的实现细节,还成功地在 Node.js 环境中实现了与 des.js 一致的加密解密功能。

image.png


2. 正文

2.1 2个文件分析

2.1.1 des.js 文件

image.png


image.png


des.js 文件包含了一个完整的 DES 加密解密实现,主要函数包括:

strEnc:将字符串加密为十六进制字符串。

strDec:将十六进制字符串解密为原始字符串。

encdec:核心加密和解密函数,实现了 DES 算法的详细步骤,包括初始置换、多轮 Feistel 结构、S 盒置换等。

getKeyBytes:将密钥转换为二进制数组。

strToBtbt64ToHex:用于字符串和二进制数据之间的转换。

strEncstrDec:这两个函数是加密和解密的入口点,负责处理输入数据和密钥,调用核心加密解密函数。

encdec:实现了 DES 算法的核心逻辑,包括初始置换、16 轮 Feistel 结构、S 盒置换、P 盒置换和最终置换。

generateKeys:生成 DES 算法所需的子密钥。

initPermuteexpandPermutexorsBoxPermutepPermutefinallyPermute:这些函数共同完成了 DES 算法中的各种数据变换操作。

2.1.2 login.jsp 文件

login.jsp 文件是一个用户登录页面,其中的关键部分是密码的加密处理:

在用户提交登录表单时,调用 des.js 中的 strEnc 函数对密码进行加密。

加密后的密码与用户名一起提交到服务器进行验证。

document.getElementById("password").value=strEnc(password,"PCCW");

image.png


2.2 加密解密流程解析

2.2.1 加密流程

1用户输入明文密码。

2 strEnc 函数将密码分割成长度为 4 字节的数据块。

3 每个数据块调用 enc 函数进行加密。

4加密后的二进制数据转换为十六进制字符串。

5十六进制字符串作为加密结果输出。

2.2.2 解密流程

1输入加密后的十六进制字符串。

2将十六进制字符串转换为二进制数据。

3 每个数据块调用 dec 函数进行解密。

4解密后的二进制数据转换为原始字符串。

5输出原始明文字符串。

2.3 加密解密本地实现

既然加密解密都分析了,那么现在来编写脚本,开始我使用python来实现,但是我发现一个问题我手写加AI都是难以还原des.js中的加密解密流程(数据转换和边界实现很麻烦),ps有大佬师傅可以挑战使用python来实现这个加密解密(文件见附件!),我写的一直抛出TypeError: can only concatenate list (not "bytes") to list错误(ai也问了还是没有解决),而且还解密和加密实现都有问题,求大佬指教!!!

image.png


后来一想为什么不直接使用des.js直接引入使用即可,通过调用 des.js 中的 strEnc 和 strDec 函数,就可以实现加密和解密功能。

在 des.js 文件的末尾添加以下代码,以便调用 strEnc 和 strDec 函数:

创建一个 index.js 文件,来实现加密和解密功能。

image.png


3. 总结

分析了 des.js 中的关键函数,包括 strEnc、strDec、enc、dec 等,详细解释了 DES 算法的实现细节,如初始置换多轮 Feistel 结构S 盒置换等。通过这些分析,不仅理解了算法的原理,还掌握了其在实际渗透测试中的实现方法。通过本次逆向破解加密的过程,不仅加深了对 DES 算法的理解,也积累了在不同编程环境中实现相同功能的经验。希望本文的记录能够为其他实现des加密解密提供一些启示和帮助。

附件:
0 条评论
某人
表情
可输入 255