各位才华横溢,风度翩翩的读者们,你们好。今天我们讨论一下DES算法以及逆向识别。
DES算法要比RC4复杂的多,但是幸运的是它的逆向识别比RC4要简单很多,当你了解DES大致的实现原理之后就明白为什么了。
DES算法介绍
DES算法,全称是数据加密标准(Data Encryption Standard),是一种对称密钥加密技巧,也就是说,加密和解密都用同一个密钥。它是分组加密算法。分组肯定要补位,关于补位的知识,我们后面再说。
DES算法实现过程
我找了一个讲的非常好的视频,还是一个妹子讲的:
https://www.bilibili.com/video/BV1KQ4y127AT
其实看视频就完全懂了,这里为了后面方便回忆,贴一张图:
https://ctf-wiki.org/crypto/blockcipher/des/

图中,加密过程分成了两部分。
第一部分是由一个64位的密钥来生成16个48位的子密钥。生成过程如下:
-
先将密钥按照一定的规则打乱,其实是使用了一个置换表,这个置换表就是识别该算法的一个特征
-
打乱时我们只保留了56位(剩下的8位用于奇偶校验,暂时不用管),分成两部分各28位。然后对这两个二进制流按一定的次数进行旋转,置换,再合并,得到一个48位的子密钥。搞16次,就得到了16个子密钥。这里也有一个置换表,是一个特征。
-
密钥生成后,就可以与明文进行异或了。
第二部分是将明文使用密钥进行加密:
-
将明文分成两个32位的,将右边的与子密钥进行异或,但是一个32位,一个48位,没法直接异或,所以采用一定的规则将32位的数据扩展成48位的,然后再进行异或。有兴趣的可以去看看视频,非常的精彩。
-
异或的结果,分为 8 组,每一组是 6-bit 的数据,丢进对应的 S 盒,输出 4-bit 的信息。把这些输出收集起来,一共是 4*8 = 32 位,**做一次置换 (P 置换)**,得到 32-bit 的结果。这个步骤里面的 S 盒与 P 置换都是算法识别的特征。而且为了加快DES速度,还可以将 S 与 P 进行合并。

好了,现在你已经精通DES算法了,去手搓一个吧。
DES算法识别
Java版
一般Java里面都是使用自带的 Cipher 库来实现,所以我们可以直接搜索相关类就行了,虽然有些App使用反射与字符串加密来隐藏实现,但是我们也可以直接使用 frida 等来进行Hook。
/**
* DES算法,加密
*
* @param data 待加密字符串
* @param key 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
*/
public static String encode(String key, byte[] data) {
try {
//Class CipherClass=MainActivity.class.getClassLoader().loadClass("javax.crypto.Cipher");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(IVPARAMETERSPEC.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, getRawKey(key), iv);
byte[] bytes = cipher.doFinal(data);
return Base64.encodeToString(bytes, Base64.DEFAULT);
} catch (Exception e) {
return null;
}
}
Hook代码:
function main() {
Java.perform(function () {
Java.use('javax.crypto.Cipher').getInstance.overload('java.lang.String').implementation = function (arg0) {
console.log('javax.crypto.Cipher.getInstance is called!', arg0);
var

最低0.47元/天 解锁文章
3180

被折叠的 条评论
为什么被折叠?



