安卓逆向 -- 算法基础(DES与3DES)
2023-03-14 22:39:07 时间
一、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();
禁止非法,后果自负
相关文章
- 微服务架构下,利用Sharding-jdbc解决读写分离查询延迟问题
- 当同事用Root权限输入rm -rf 后,鬼知道我经历了什么
- Linux搜索文件的5个高效命令的正确使用方法
- 极简操作!3分钟即可实现的 IIS 站点迁移
- 超越Cookie:当今的客户端数据存储技术
- Hadoop与 Spark - 选择正确的大数据框架
- Linux性能测试工具有什么好用的工具,这里推荐一款
- 如何将Hadoop集成到工作流程中?这6个优秀实践必看
- 太快太不安全:为Mongo Express Web管理界面保驾护航
- 怎样在Kubernetes上运行PostgreSQL
- NoSQL中负载均衡系统如何解决热点问题,提高可用性?
- 服务器部署前端&Node 项目(包括阿里云服务器、nginx 以及 mongoDB 的配置)
- 日均5亿查询量的京东到家订单中心,为什么舍MySQL用ES?
- 如何在MySQL 8中重置root密码
- 浅谈SQL Server内部运行机制
- MySQL8.0里GROUP BY有变化,注意了
- 删库跑路?这篇文章教你如何使用xtraback备份MySQL数据库
- 你的数据仓库还在为企业业务拖后腿吗?
- Linux服务器Redis漏洞被利用挖矿解决方法
- 使用Kafka和MongoDB进行Go异步处理