安卓逆向 -- 算法基础(Base64与HEX)
2023-03-14 22:37:06 时间
一、Base64
1、所有的数据都能被编码为只用65个字符就能表示的文本。
标准的Base64每行为76个字符,每行末尾添加一个回车换行符( )。不论每行是否满76个字符,都要添加一个回车换行符。
2、65字符:A~Z a~z 0~9 + / =
URL Base64算法中,为了安全,会把 + 替换成 - ,把 / 替换成 _
= 有时候用 ~ 或 . 代替
3、Base64的应用
密钥、密文、图片、数据简单加密或者预处理
4、正常的Base64编码与解码
package com.company; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.zip.Deflater; public class Main { public static void main(String[] args) { System.out.println("逆向有你"); String bs= "逆向有你a"; String enbs=Base64.getEncoder().encodeToString(bs.getBytes(StandardCharsets.UTF_8)); System.out.println("逆向有你base64编码:"+enbs); String debs= new String(Base64.getDecoder().decode(enbs)); System.out.println("逆向有你base64解码码:"+debs); } } 运行结果: 逆向有你 逆向有你base64编码:6YCG5ZCR5pyJ5L2gYQ== 逆向有你base64解码码:逆向有你a
二、自己编写Base64算法
1、新建一个java类
2、源码如下
package com.company; public class zbase64 { private static final char[] Base64ByteToStr = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; private static final int RANGE = 255; private static byte[] StrToBase64Byte = new byte[128]; public static String Base64Encode(byte[] bytes) { StringBuilder res = new StringBuilder(); for (int i = 0; i <= bytes.length - 1; i += 3) { byte[] enBytes = new byte[4]; byte tmp = 0; for (int k = 0; k <= 2; k++) { if (i + k <= bytes.length - 1) { enBytes[k] = (byte) (((bytes[i + k] & 255) >>> ((k * 2) + 2)) | tmp); tmp = (byte) ((((bytes[i + k] & 255) << (((2 - k) * 2) + 2)) & 255) >>> 2); } else { enBytes[k] = tmp; tmp = 64; } } enBytes[3] = tmp; for (int k2 = 0; k2 <= 3; k2++) { if (enBytes[k2] <= 63) { res.append(Base64ByteToStr[enBytes[k2]]); } else { res.append('='); } } } return res.toString(); } } 主函数调用: String zbx = zbase64.Base64Encode(bs.getBytes(StandardCharsets.UTF_8)); System.out.println("自编写base64加密:"+zbx); 运行结果: 自编写base64加密:6YCG5ZCR5pyJ5L2gYQ==
三、Hex
二进制数据最常用的一种表示方式。用0-9 a-f 16个字符表示。每个十六进制字符代表4bit。也就是2个十六进制字符代表一个字节。在实际应用中,尤其在密钥初始化的时候,一定要分清楚自己传进去的密钥是哪种方式编码的,采用对应方式解析,才能得到正确的结果
public static String bytes2HexString(byte[] b) { StringBuffer result = new StringBuffer(); for (int i = 0; i < b.length; i++) { result.append(String.format("%02X",b[i])); } return result.toString(); } public static byte[] hexString2Bytes(String src) { int l = src.length() / 2; byte[] ret = new byte[l]; for (int i = 0; i < l; i++) { ret[i] = Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue(); } return ret; } 主函数调用 String hexbm=bytes2HexString(bs.getBytes(StandardCharsets.UTF_8)); System.out.println("十六进制编码:"+hexbm); byte[] bytes = hexString2Bytes(hexbm); String hexjm=new String(bytes); System.out.println("十六进制解码:"+hexjm); 运行结果: 十六进制编码:E98086E59091E69C89E4BDA061 十六进制解码:逆向有你a
禁止非法,后果自负
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的