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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 安卓逆向 -- 算法基础(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):47B479713A0C8794319F2A07FF7D8E43
3DES加密(Base64):R7R5cToMh5QxnyoH/32OQw==
3DES解密(Base64):a12345678
3DES解密(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();

禁止非法,后果自负

目录
相关文章
|
6月前
|
算法 安全 C语言
使用C语言实现DES算法代码
使用C语言实现DES算法代码
184 0
|
3月前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
169 1
|
5月前
|
存储 算法 安全
Java中的DES和3DES加密算法详解
Java中的DES和3DES加密算法详解
|
6月前
|
安全 算法 数据库
MD5、SHA、DES、AES、RSA的算法说明
【5月更文挑战第10天】MD5、SHA、DES、AES、RSA的算法说明
291 2
|
6月前
|
算法 Android开发
安卓逆向 -- 自吐算法(3DES和AES)
安卓逆向 -- 自吐算法(3DES和AES)
61 1
|
4天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
6天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
8天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
6天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
7天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
19 2