安卓逆向 -- 算法基础(DES与3DES)

Posted web安全工具库

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓逆向 -- 算法基础(DES与3DES)相关的知识,希望对你有一定的参考价值。

 一、DES算法

1、DES是一个分组加密算法,它以64位为分组对数据加密。同时DES也是一个对称算法:加密和解密用的是同一个算法。DES是一个包含16个阶段的“替换–置换”的分组加密算法,64位的分组明文序列作为加密算法的输入,经过16轮加密得到64位的密文序列。

2、DES算法密钥是8个字节,无论你给多长的密钥他只取前8个字节。

3、3DES算法密钥是24个字节,是DES的3倍

二、常用加密模式

1、ECB(key)

简单理解为:明文123456789,先分成三组123 456 789,分别通过key加密得到密文abc def ghi,最后加密结果就是abcdefghi

2、CBC(key,iv)

简单理解为:明文123456789,先分成三组123 456 789,这里还需要一个iv向量,iv先与123异或操作,然后再通过key加密得到jkl,让jk和456进行异或操作,再通过key加密得到mno,mno与789进行异或操作,再通过key加密得到pqr,最后密文就是jklmnopqr

三、常用填充方式

假如明文为:0123456789,分组后是012 345 678 9,最后一组还缺两位,就需要填充

1、NoPadding

不填充

2、ZeroPadding

用0填充

3、Pkcs7(Pkcs5)

固定填充方式,Pkcs7包含Pkcs5

四、Java版源码实现

String bs= "逆向有你a";DESedeKeySpec des3key = new DESedeKeySpec(("123456781234567812345678".getBytes(StandardCharsets.UTF_8)));//密钥必须是24个字节SecretKeyFactory keydes3 = SecretKeyFactory.getInstance("DESede");SecretKey secretKey3 = keydes3.generateSecret(des3key);Cipher cipher3des = Cipher.getInstance("DESede/ECB/PKCS5Padding");cipher3des.init(1,secretKey3);byte[] des3res = cipher3des.doFinal(bs.getBytes(StandardCharsets.UTF_8));System.out.println("3DES加密(字节):"+Arrays.toString(des3res));System.out.println("3DES加密(Hex):"+bytes2HexString(des3res));System.out.println("3DES加密(Base64):"+Base64.getEncoder().encodeToString(des3res));cipher3des.init(2,secretKey3);//初始化解密byte[] jm3desres = cipher3des.doFinal(Base64.getDecoder().decode("vN3o+PDQ0Yo8y5+InEzpwA==".getBytes(StandardCharsets.UTF_8)));System.out.println("3DES解密(Base64):"+new String(jm3desres));byte[] des3hexbyte =hexString2Bytes("BCDDE8F8F0D0D18A3CCB9F889C4CE9C0");jm3desres=cipher3des.doFinal(des3hexbyte);System.out.println("3DES解密(Hex):"+new String(jm3desres));DESKeySpec deskey = new DESKeySpec("123456789".getBytes(StandardCharsets.UTF_8));//将密钥实例化,密钥产固定固定SecretKeyFactory key = SecretKeyFactory.getInstance("DES");//加密算法SecretKey secretKey = key.generateSecret(deskey);//处理成系统可识别的密钥Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");//加密方式cipher.init(1,secretKey);//1是加密,2是解密,初始化加密byte[] desres = cipher.doFinal(bs.getBytes());System.out.println("DES加密(字节):"+Arrays.toString(desres));System.out.println("DES加密(Hex):"+bytes2HexString(desres));System.out.println("DES加密(Base64):"+Base64.getEncoder().encodeToString(desres));cipher.init(2,secretKey);//初始化解密byte[] jmdesres = cipher.doFinal(Base64.getDecoder().decode("R7R5cToMh5QxnyoH/32OQw==".getBytes(StandardCharsets.UTF_8)));System.out.println("DES解密(Base64):"+new String(jmdesres));byte[] deshexbyte =hexString2Bytes("47B479713A0C8794319F2A07FF7D8E43");jmdesres=cipher.doFinal(deshexbyte);System.out.println("DES解密(Hex):"+new String(jmdesres));运行结果:3DES加密(字节):[71, -76, 121, 113, 58, 12, -121, -108, 49, -97, 42, 7, -1, 125, -114, 67]3DES加密(Hex):47B479713A0C8794319F2A07FF7D8E433DES加密(Base64):R7R5cToMh5QxnyoH/32OQw==3DES解密(Base64):a123456783DES解密(Hex):a12345678

五、JS版源码

var key=CryptoJS.enc.Utf8.parse("123456789")return CryptoJS.DES.encrypt("逆向有你a",key,{mode:CryptoJS.mode.ECB,padding:CryptoJS.pad.Pkcs7}).toString().toUpperCase();var key=CryptoJS.enc.Utf8.parse("1234567812345678")return CryptoJS.TripleDES.encrypt("逆向有你a",key,{mode:CryptoJS.mode.ECB,padding:CryptoJS.pad.Pkcs7,format:CryptoJS.format.Hex}).toString().toUpperCase();

禁止非法,后果自负

欢迎关注公众号:逆向有你

欢迎关注视频号:之乎者也吧

欢迎报名安卓逆向培训,报名微信(QQ):335158573

小肩膀安卓逆向培训内容

以上是关于安卓逆向 -- 算法基础(DES与3DES)的主要内容,如果未能解决你的问题,请参考以下文章

Go-Des和3Des算法详解与代码

安卓逆向 -- 自吐算法(DES)

6. Java 加解密技术系列之 3DES

3DES算法密钥长度说明

3DES算法密钥长度说明

3DES加密算法原理及实现