Android逆向 常见编码格式

273 阅读6分钟

Base64 特征 A-Za-z0-9+- , =或== 结尾

为什么叫Base64?

因为它是基于(Base)64个字符的一种编码方式。使用其编码后的文本只包含64个ASCII码字符(偶尔加一个或二个填充字符=),如下所示:

Base64使用到的64个字符:

A-Z 26个
a-z 26个
0-9 10个 + 1个 - / 1个

下图是Base64码表,可以看到从0到63的每个数字都对应一个上面的一个字符。
在这里插入图片描述

使用 Base64 进行编码,大致可以分为 4 步:

  • 将原始数据每三个字节作为一组,每个字节是8个bit,所以一共是 24 个 bit
  • 将 24 个 bit 分为四组,每组 6 个 bit
  • 在每组前面加补 00,将其补全成四组8个bit
  • 到此步,原生数据的3个字节已经变成4个字节了,增大了将近30%
  • 根据Base64码表得到扩展后每个字节的对应符号(见上图)

Base64字符串末尾的=是什么

有时我们会在Base64字符末尾会看到=,有时1个,有时2个,这是为啥?

通过上面的我们知道了Base64编码过程是3个字符一组的进行,如果原文长度不是3的倍数怎么办呢? 例如我们的原文为Ma,它不够3个,那么只能在编码后的字符串中补=了。缺一个字符补一个,缺两个补两个即可,所以有时候你会看见base64字符串结尾有1个或者2个=。

HEX 特征 %02X

字节转16进制 PS:汉字需要转UTF-8或UTF-16

Unicode 特征 \u

字节数组 字符串转数组

特征 new String, 逆向 so 文件常常用到,因为char * 本来就是字节数组

加密算法 MD5

消息摘要算法&单向散列函数&哈希算法

单向散列函数算法也称 Hash 算法,是一种将任意长度的消息压缩到某一固定长度的函数(该过程不可逆)。Hash 函数可以数字签名、完整性校验、消息起源的认证检测等 常见:MD5、HMAC、SHA-1、SHA-2

MD5 加密 特征:

  • 压缩性:无论数据长度是多少,计算出MD5值长度相同(16位、32位)
  • 抗修改性:即便修改一个字节,计算出来的MD5值也是差别很大
  • 抗碰撞性,知道数据和MD5值,很小概率找到相同MD5值
  • 易计算:原数据很容易计算出MD5

 
         System.out.println("MD5\t\t" + MDUtil.MD5("123456"));
        System.out.println("SHA-1\t" + MDUtil.SHA1("123456"));
        System.out.println("SHA-224\t" + MDUtil.SHA224("123456"));
        System.out.println("SHA-256\t" + MDUtil.SHA256("123456"));
        System.out.println("SHA-384\t" + MDUtil.SHA384("123456"));
        System.out.println("SHA-512\t" + MDUtil.SHA512("123456"));

// MD5		e10adc3949ba59abbe56e057f20f883e
// SHA-1	7c4a8d09ca3762af61e59520943dc26494f8941b
// SHA-224	f8cdb04495ded47615258f9dc6a3f4707fd2405434fefc3cbf4ef4e6
// SHA-256	8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
// SHA-384	0a989ebc4a77b56a6e2bb7b19d995d185ce44090c13e2984b7ecc6d446d4b61ea9991b76a4c2f04b1b4d244841449454
// SHA-512	ba3253876aed6bc22d4a6ff53d8406c6ad864195ed144ab5c87621b6c233b548baeae6956df346ec8c17f5ea10f35ee3cbc514797ed7ddd3145464e2a0bab413

对称加密算法

加密和解密使用相同的密钥的算法叫对称加密算法,

  • 速度快

image.png

DES

:DES 使用56位密钥,将数据分成64位块,进行加密,由于密钥长度比较短,容易遭受到暴力破解攻击,

3DES

:3次 DES 速度慢;

  • DES(Data Encryption Standard)是一种对称加密算法,它使用相同的密钥(通常是 56 位长)进行加密和解密操作。
  • ECB(Electronic Codebook)是一种加密模式,它将输入的数据分成块,每块独立进行加密运算。
  • PKCS5Padding 是一种填充模式,它在数据块长度不足时,使用特定的填充方式进行填充,使每个数据块的长度达到指定长度。
	/**
    * DES 对称加密
    */

   public static void desEncrypt() throws Exception {
   	String plainText = "需要加密的内容";
   	String secretKey = "this is password";
   	DESKeySpec desKeySpec = new DESKeySpec(secretKey.getBytes(StandardCharsets.UTF_8));
   	SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
   	SecretKey key = keyFactory.generateSecret(desKeySpec);

   	Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
   	cipher.init(Cipher.ENCRYPT_MODE, key);

   	byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
   	String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);

   	System.out.println("DES加密后的内容=" + encryptedText);
   }

AES (高级加密标准)

:使用 128 、 192、 256 位密钥,可以对不同长度的数据块进行加密。AES和DES 更加安全,速度更快,

RC4

:RC4 密钥长度40、64、128

RSA非对称加密算法

  • 公钥可以随意分发给任何需要通讯的人,私钥只能由秘钥持有者保留,

  • 在非对称加密中, 公钥用户加密消息,私钥用户解密消息

  • 使用公钥加密每次密文都不一样的

image.png

使用非对称加密算法 对AES的密钥进行加密;

X.509 X509编码密钥规范

X.509 是密码学里公钥证书的格式标准。

X.509 证书已应用在包括 TLS/SSL 在内的众多网络协议里,同时它也用在很多非在线应用场景里,比如电子签名服务。X.509 证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构 CA 的签名,也可以是自签名)。

www.cnblogs.com/linianhui/p…

PKCS 系列 PKCS8编码密钥规范

公钥加密标准(Public Key Cryptography Standards, PKCS),此一标准的设计与发布皆由 RSA 资讯安全公司(英语:RSA Security)所制定。

以上两种是一个密钥规范,实际应用中 X509公钥使用,PKCS私钥使用