盘点几个安卓逆向之常用加密算法
作者:Python进阶者
来源:Python爬虫与数据挖掘为什么要学习加密算法
在搞逆向进行抓包的时候,可以经常发现一些莫名其妙的字符串,可能是81dc9bdb52d04dc20036dbd8313ed055等之类的一长串字符,这些是怎么生成呢?
这些其实就是加密,加密算法主要分为两大类标准加密算法非标准加密算法
标准加密算法在任何语言中的实现,结果都是一样的。
是应该是一样的,也可能不一样,如果不一样,说明更改了标准算法的某些变量,但是这种情况比较少。
非标准算法那就是自己写的了,这就具有很大的不确定性了,全靠程序员发挥!
注意:在安卓逆向中,加密算法通常出现在Java层和C中!在Java层标准算法是有固定名字的,即使再混淆,固定名字是不能混淆的所以比较好处理!在C层标准加密算法是没有固定名字的,那就只能根据算法特征去识别了!常用标准算法有哪些?消息摘要算法(散列函数、哈希函数)MD5、SHA、MAC对称加密算法DES、3DES、AES非对称加密算法RSA数字签名算法MD5withRSA、SHA1withRSA、SHA256withRSA
因为本次主要是安卓逆向,所以就将常用的标准加密算法使用Android来复现一下!我的环境AndroidStudio2020。3。1版本Jdk8版本项目
CryptologyDemo。zipHex和Base64
Hex和Base64不是加密,它是一种编码!!!
Hex和Base64编码是加密算法中最常用的编码,任何加密算法最终都要选择它的表现形式,而Hex和Base64是最常用的!添加依赖apicom。squareup。okhttp3:okhttp:3。10。0
记得点击SyncNow
Hex
Hex编码是一种用16个字符(09af)表示任意二进制数据的方法!
它是一种编码,而非加密!
Hex主要应用在MD5等加密表现形式上。代码从字符串到hexbyte〔〕byteszhangsan。getBytes(StandardCharsets。UTF8);ByteStringofByteString。of(bytes);Stringhexof。hex();Log。d(TAG,hex:hex);示例
Base64
Base64是一种用64个字符(AZaz09)表示任意二进制数据的方法。
它是一种编码,而非加密。
相比较之下,Base64应用就广泛的很多,像图片,,长密文甚至文件,都采用Base64,因为可承载的数据很多!代码从字符串到base64byte〔〕byteszhangsan。getBytes(StandardCharsets。UTF8);ByteStringofByteString。of(bytes);方式一Stringbase64of。base64();Log。d(TAG,base641:base64);方式二if(android。os。Build。VERSION。SDKINTandroid。os。Build。VERSIONCODES。O){StringsBase64。getEncoder()。encodeToString(zhangsan。getBytes(StandardCharsets。UTF8));byte〔〕encodeBase64。getEncoder()。encode(zhangsan。getBytes(StandardCharsets。UTF8));Log。d(TAG,base642:s);Log。d(TAG,base642:newString(encode));}方式三Stringsandroid。util。Base64。encodeToString(zhangsan。getBytes(StandardCharsets。UTF8),0);Log。d(TAG,base643:newString(s));示例
消息摘要算法
消息摘要算法最主要的特征!
密文是不可逆的!就是说,我在客户端把密码通过md5加密了,服务端也得采用相同的方式加密,进行比较。
不定长度输入,固定长度输出就是说,不管是123,还是123456。。。经过加密,加密的结果都是固定的长度!
加密结果唯一!MD5
这就是最常用的md5加密,在update时压入数据,通过digest获得加密结果,md5一般通过hex展示加密结果!MD系列算法
算法摘要长度实现MD2128Java6MD5128Java6MD5128BouncyCastle代码md5publicstaticStringmd5(StringplainText)throwsException{MessageDigestmd5MessageDigest。getInstance(MD5);1。md5加密的数据可以直接放在digest中2。digest是加密之后的数据,但是有不可见字符,不要使用hex或base64来展示md5。update(plainText。getBytes(StandardCharsets。UTF8));byte〔〕digestmd5。digest();1。效果完全同上,update可以压入数据,区别是digest是一次性压入,update可以分批次压入byte〔〕digestmd5。digest(plainText。getBytes(StandardCharsets。UTF8));使用hex和base64来表示加密之后的数据,因为直接加密的有不可见字符ByteStringofByteString。of(digest);Stringhexof。hex();Stringbase64of。base64();returnhexbase64;}示例
SHA
常用的是sha1算法,所以本次演示的是sha1算法。
sha1算法,甚至来说消息摘要算法基本上api都是通用的。
只需要换一个algorithm即可,所以就不废话了。SHA系列算法
算法摘要长度实现SHA1160Java6SHA256256Java6SHA384384Java6SHA512512Java6SHA224224BouncyCastle代码SHA1publicstaticStringsha1(StringplainText)throwsException{MessageDigestsha1MessageDigest。getInstance(SHA1);sha1。update(plainText。getBytes(StandardCharsets。UTF8));byte〔〕digestsha1。digest();ByteStringofByteString。of(digest);Stringhexof。hex();Stringbase64of。base64();returnhexbase64;}示例
MAC
mac这个名字听着挺牛逼的,其实就是比md5和sha算法多了个密钥而已,不必大惊小怪。MAC系列算法
算法消息摘要实现HmacMD5128Java6HmacSHA1160Java6HmacSHA256256Java6HmacSHA384384Java6HmacSHA512512Java6HmacMD2128Java6HmacMD4128BouncyCastleHmacSHA224224BouncyCastle代码publicstaticStringmac(StringplainText)throwsException{生成密钥SecretKeySpechmacMD5newSecretKeySpec(123。getBytes(StandardCharsets。UTF8),HmacMD5);hmacMD5。getAlgorithm()表示获取算法,此时获取的就是HmacMD5MacinstanceMac。getInstance(hmacMD5。getAlgorithm());同上MacinstanceMac。getInstance(HmacMD5);初始化instance。init(hmacMD5);压入数据instance。update(plainText。getBytes(StandardCharsets。UTF8));byte〔〕doFinalinstance。doFinal();同上byte〔〕doFinalinstance。doFinal(plainText。getBytes(StandardCharsets。UTF8));ByteStringofByteString。of(doFinal);Stringhexof。hex();Stringbase64of。base64();returnhexbase64;}示例
对称加密算法
虽然md5也叫加密算法,但是他是无法解密的,但是对称加密算法是可以进行加密和解密的,这就nice很多了。
因为加密和解密使用的密钥相同,所以叫做对称加密算法,那不同的,就是非对称咯!
注意了啊,对称加密算法的密钥是可以随便给的,但是有长度要求的,不是乱给的,但是加密的内容无限制。
各算法密钥长度RC4密钥长度1256字节DES密钥长度8字节3DESDESedeTripleDES密钥长度24字节AES密钥长度16,24,32字节
根据密钥长度不同AES又分为AES128,AES192,AES256DES
ECB和CBC模式主要区别在于CBC模式需要一个iv向量!DES算法
ECB模式加解密代码DESECB加密Cipher
publicstaticStringdesencryptECB(StringplainText)throwsException{
生成des所需要的key
SecretKeySpecdesKeynewSecretKeySpec(12345678。getBytes(StandardCharsets。UTF8),DES);
默认工作模式就是ECB,填充模式PKCS5Padding,
CipherinstanceCipher。getInstance(DES);
也可以写全
CipherinstanceCipher。getInstance(DESECBPKCS5Padding);
初始化,指定是加密模式还是解密模式和密钥
instance。init(Cipher。ENCRYPTMODE,desKey);
关于Cipher的update似乎有些问题,所以用doFinal的多
加密内容,返回结果
byte〔〕doFinalinstance。doFinal(plainText。getBytes(StandardCharsets。UTF8));
ByteStringofByteString。of(doFinal);
Stringhexof。hex();
Stringbase64of。base64();
returnhexbase64;
}
DESECB解密
publicstaticStringdesdecryptECB(byte〔〕cipherBytes)throwsException{
生成des所需要的key
SecretKeySpecdesKeynewSecretKeySpec(12345678。getBytes(StandardCharsets。UTF8),DES);
CipherinstanceCipher。getInstance(DESECBPKCS5Padding);
instance。init(Cipher。DECRYPTMODE,desKey);
byte〔〕doFinalinstance。doFinal(cipherBytes);
returnnewString(doFinal);
}
ECB
StringdesencryptECPdesencryptECB(zhangsan);
Log。d(TAG,des加密,ECP模式:desencryptECP);
加密拿到的des加密,ECP模式base结果为:AtLfLL8jc1nuVm31GQvyw
byte〔〕bytes1ByteString。decodeBase64(AtLfLL8jc1nuVm31GQvyw)。toByteArray();
Strings1desdecryptECB(bytes1);
Log。d(TAG,des解密,ECP模式:s1);
示例
CBC模式加解密
CBC模式就比ECB多了个iv向量而已,其他用法一样。代码DESCBC,需要iv向量publicstaticStringdesencryptCBC(StringplainText)throwsException{SecretKeySpecdesKeynewSecretKeySpec(12345678。getBytes(StandardCharsets。UTF8),DES);CipherinstanceCipher。getInstance(DESCBCPKCS5Padding);CBC需要iv向量IvParameterSpecivParameterSpecnewIvParameterSpec(12345678。getBytes());初始化时添加上iv向量instance。init(Cipher。ENCRYPTMODE,desKey,ivParameterSpec);byte〔〕doFinalinstance。doFinal(plainText。getBytes(StandardCharsets。UTF8));ByteStringofByteString。of(doFinal);Stringhexof。hex();Stringbase64of。base64();returnhexbase64;}DESCBC解密publicstaticStringdesdecryptCBC(byte〔〕cipherBytes)throwsException{生成des所需要的keySecretKeySpecdesKeynewSecretKeySpec(12345678。getBytes(StandardCharsets。UTF8),DES);CipherinstanceCipher。getInstance(DESCBCPKCS5Padding);IvParameterSpecivParameterSpecnewIvParameterSpec(12345678。getBytes());instance。init(Cipher。DECRYPTMODE,desKey,ivParameterSpec);byte〔〕doFinalinstance。doFinal(cipherBytes);returnnewString(doFinal);}示例
DESede(3DESTripleDES)
DESede也分CBC和ECB,使用方法同上,这里将他们合二为一!DESede算法
代码DESede
publicstaticStringDESedeencrypt(StringplainText)throwsException{
SecretKeySpecdesKeynewSecretKeySpec(123456781234567812345678。getBytes(),DESede);
ECB模式
CipherinstanceCipher。getInstance(DESedeECBPKCS5Padding);
instance。init(Cipher。ENCRYPTMODE,desKey);
byte〔〕doFinalinstance。doFinal(plainText。getBytes(StandardCharsets。UTF8));
CBC模式需要iv向量
CipherinstanceCipher。getInstance(DESedeCBCPKCS5Padding);
IvParameterSpecivParameterSpecnewIvParameterSpec(12345678。getBytes());
初始化时添加上iv向量
instance。init(Cipher。ENCRYPTMODE,desKey,ivParameterSpec);
byte〔〕doFinalinstance。doFinal(plainText。getBytes(StandardCharsets。UTF8));
ByteStringofByteString。of(doFinal);
Stringhexof。hex();
Stringbase64of。base64();
returnhexbase64;
}
DESede
publicstaticStringDESededecrypt(byte〔〕cipherBytes)throwsException{
生成des所需要的key
SecretKeySpecdesKeynewSecretKeySpec(123456781234567812345678。getBytes(StandardCharsets。UTF8),DESede);
ECB模式
CipherinstanceCipher。getInstance(DESedeECBPKCS5Padding);
instance。init(Cipher。DECRYPTMODE,desKey);
byte〔〕doFinalinstance。doFinal(cipherBytes);
CBC模式
CipherinstanceCipher。getInstance(DESedeCBCPKCS5Padding);
IvParameterSpecivParameterSpecnewIvParameterSpec(12345678。getBytes());
instance。init(Cipher。DECRYPTMODE,desKey,ivParameterSpec);
byte〔〕doFinalinstance。doFinal(cipherBytes);
returnnewString(doFinal);
}
DESede
StringdeSedeencryptDESedeencrypt(zhangsan);
Log。d(TAG,DESede加密:deSedeencrypt);
AtLfLL8jc1nuVm31GQvyw
byte〔〕bytes3ByteString。decodeBase64(3M7YukhZweaysZBNnqYLBw)。toByteArray();
Strings3DESededecrypt(bytes3);
Log。d(TAG,DESede解密:s3);
示例
AES
AES算法是对称加密算法中最常用的算法!
AES也分CBC和ECB,这里也合二为一的!AES算法
代码publicstaticStringAESencrypt(StringplainText)throwsException{
SecretKeySpecsecretKeySpecnewSecretKeySpec(0123456789abcdef。getBytes(),AES);
ECB模式
CipherinstanceCipher。getInstance(AESECBPKCS5Padding);
instance。init(Cipher。ENCRYPTMODE,secretKeySpec);
byte〔〕doFinalinstance。doFinal(plainText。getBytes(StandardCharsets。UTF8));
CBC模式需要iv向量
CipherinstanceCipher。getInstance(DESedeCBCPKCS5Padding);
IvParameterSpecivParameterSpecnewIvParameterSpec(12345678。getBytes());
初始化时添加上iv向量
instance。init(Cipher。ENCRYPTMODE,desKey,ivParameterSpec);
byte〔〕doFinalinstance。doFinal(plainText。getBytes(StandardCharsets。UTF8));
ByteStringofByteString。of(doFinal);
Stringhexof。hex();
Stringbase64of。base64();
returnhexbase64;
}
publicstaticStringAESdecrypt(byte〔〕cipherBytes)throwsException{
生成des所需要的key
SecretKeySpecsecretKeySpecnewSecretKeySpec(0123456789abcdef。getBytes(),AES);
ECB模式
CipherinstanceCipher。getInstance(AESECBPKCS5Padding);
instance。init(Cipher。DECRYPTMODE,secretKeySpec);
byte〔〕doFinalinstance。doFinal(cipherBytes);
CBC模式
CipherinstanceCipher。getInstance(DESedeCBCPKCS5Padding);
IvParameterSpecivParameterSpecnewIvParameterSpec(12345678。getBytes());
instance。init(Cipher。DECRYPTMODE,desKey,ivParameterSpec);
byte〔〕doFinalinstance。doFinal(cipherBytes);
returnnewString(doFinal);
}
示例
非堆成加密算法
非堆成加密算法中,最常用最典型的加密算法就是RSA。原来说过,对称加密算法是因为加密解密用的是同一个密钥,但是非对称就不是了。
它需要一堆,称为公钥和私钥,当然,密钥不是随便写的!
在线密钥生成网站:http:web。chacuo。netnetrsakeypair公钥加密,私钥解密。私钥加密,公钥解密。一般公钥是公开的,私钥保密,私钥包含公钥。加密安全,但是性能差,加密长度有限制。RSA可以用于加密解密,也可以用来数据签名。Java中的私钥必须是pkcs8格式。RSARSA算法
代码RSA
解析公钥key并返回
publicstaticPublicKeygeneratePublic(StringpublicKeyBase64)throwsException{
byte〔〕bytesByteString。decodeBase64(publicKeyBase64)。toByteArray();
X509EncodedKeySpecx509EncodedKeySpecnewX509EncodedKeySpec(bytes);
KeyFactorykeyFactoryKeyFactory。getInstance(RSA);
returnkeyFactory。generatePublic(x509EncodedKeySpec);
}
publicstaticPrivateKeygeneratePrivate(StringprivateKeyBase64)throwsException{
byte〔〕bytesByteString。decodeBase64(privateKeyBase64)。toByteArray();
PKCS8EncodedKeySpecpkcs8EncodedKeySpecnewPKCS8EncodedKeySpec(bytes);
KeyFactorykeyFactoryKeyFactory。getInstance(RSA);
returnkeyFactory。generatePrivate(pkcs8EncodedKeySpec);
}
RSA这里使用私钥解密
publicstaticStringRSAPrivateDecrypt(byte〔〕cipherBytes)throwsException{
StringBEGINPRIVATEKEYMIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMOVkFb2U8aOxLZr
vRVq8vB1fp4GnLLmBhHg343Q5J69AVqbflgf9DRgzPzBUoauRQnvfsUBt
6NXKv3t2bkkAkA4ulCqk6pxWZy03LyyADUtkBrDrTfGHqaw6vJSp0qjT56u563
V0nOoUboUmjAIZRrzNEcwAKa7B1AgMBAAECgYB4oflDCemGkzOTys4PIpVRe3o
i84fMNsD6yPyz1XlS5NlAuIg5qNI63yOCd6nR1dN26mntM8159dCUfNcY1W3F
JaTvBZKD56fDUKQ5UfHhlrd4rVxWKKkuhdYe67Y6twrMzLTEOXmn7jdxuq2
Au93oa2kxraM6pGJCQJBANPckCGRl26UraqzP3XwrVPqyGQUMb8y627MXwVJJ
LsE3c9vuoDkm79rYN8jCXbxSkUbBpxopHYfdSxTDt8CQQDftlI8PZXDzJLlJAmm
LynoC7OO52sdCPoqndJ04DDjo1rg6fcWaaIXFmOLWTn5HJt8pa4r7vi54DChZ7
ju8rAkBUBUSVdGctyxk7k6mv4Y7Zh0J4PNjtr0SNTBzMNIP1cBDCshm655ecn
dgJDKMx9tVV6hZqQ1JyUc7wLDtFrAkB1s6ZmvXw7jTnIR4KwJeZliSqKyGVJ3gSm
WHH0rMv1l93MEG0JJMC8ZvIvKD3b6Azwng8A0q0HAAh1zmFgLAkEA0PahyHnX
ZCzB5ic4QvkiKCqZSyibYXOGxBGyCXkuirCwqrtaEorrFxgNEssdpHcEmk71nv
gvrL5QkvgcLvMA;
PrivateKeyprivateKeygeneratePrivate(BEGINPRIVATEKEY);
CipherinstanceCipher。getInstance(RSAECBPKCS1Padding);
instance。init(Cipher。DECRYPTMODE,privateKey);
byte〔〕doFinalinstance。doFinal(cipherBytes);
returnnewString(doFinal);
}
RSA使用公钥加密
publicstaticStringRSAPublicEncrypt(StringplainText)throwsException{
StringBEGINPUBLICKEYMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDlZBW9lPGjsS2a70f1avPrw
dX6eBpyy5gYR4NN0OSevQFam35YHQ0YMz8wVKGrkUJ737FAbejVyr97dm5J
AJAOLpQqpOvqcVv2ctNy8sgA1LZAaw603xh6msOryUqdKo0eruet1dJzqFG6FJo
gCGUa8zRHMACmuwdQIDAQAB;
PublicKeypublicKeygeneratePublic(BEGINPUBLICKEY);
CipherinstanceCipher。getInstance(RSAECBPKCS1Padding);
instance。init(Cipher。ENCRYPTMODE,publicKey);
byte〔〕doFinalinstance。doFinal(plainText。getBytes());
ByteStringofByteString。of(doFinal);
returnof。base64();
}
RSA
加密
StringrsaPublicEncryptRSAPublicEncrypt(zhangsan);
Log。d(TAG,RSA加密:rsaPublicEncrypt);
解密
byte〔〕bytes5ByteString。decodeBase64(rsaPublicEncrypt)。toByteArray();
StringrsaPrivateDecryptRSAPrivateDecrypt(bytes5);
Log。d(TAG,RSA解密:rsaPrivateDecrypt);
示例
总结
本文讲述的加密算法主要分为三大类,也是最常用的几个加密算法。消息摘要算法(MD5,SHA1,MAC)对称加密算法(DES,DESede,AES)非堆成加密算法(RSA)
经过比较发现,在Java中加密算法有几大特点通过MessageDigest类生成的算法有MD5,SHA1通过Mac类生成的算法有MAC通过Cipher生成的算法有DES,DESede,AES,RSA
嗯,似乎你不太懂什么意思,意思就是可以通过类反推算法。
这样就可以完成自吐算法了,什么算法直接都一把梭哈了,后面再讲!
如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。
越努力,越幸运。
我是码农星期八,如果觉得还不错,记得动手点赞一下哈。
感谢你的观看。
本教程只用于学习探讨,不允许任何人使用技术进行违法操作!
曝关晓彤鹿晗结婚在即结婚场面能超越黄晓明baby的世纪婚礼吗黄晓明的婚礼为什么叫世纪婚礼?10月8日,在上海,黄晓明送给baby一场童话般的梦幻婚礼。这场婚礼因为极其豪华的布置和庞大的明星到来,堪称史无前例。但整个婚礼现场,……
2017年山东临沂中考满分作文借你一双慧眼借你一双慧眼,你能不能捉住心灵闪过的微光?你能不能抓住微光闪现的瞬间?你能不能跟随微光创造奇迹?一个寒冷的夜晚,你或许正沉醉在甜蜜的梦乡,但是有一个人却在深思:他会画画,但此刻……
关于尽孝的亲情作文不要让父母在希望中等待,不要让那颗苍老的心孤独的死去。赶快尽自己的一份孝心。下面是小编收集的关于尽孝的亲情作文,欢迎阅读。关于尽孝的亲情作文:孝亲敬老从古至今,人们……
疑似iPhone14系列前面板曝光,Pro版本搭载感叹号挖孔伴随着时间来到五月,有关iPhone14系列手机的相关爆料也来到了关键阶段。结合往年信息来看,iPhone14系列手机的方案应该已经敲定并寻求量产,而后续爆料的真实性也将大大提……
特斯拉二年的真实使用感受和成本总结最近几天看到网上很多评价特斯拉负面消息,还有很多不切实际的使用成本分析,作为一个真实车主,我想给大家说说我的使用感受和使用实际支出成本,目前我的车子已经使用一年10个月,行驶里……
我的发现作文250字8篇导语:在生活中,我们常常会发现一些有趣的现象,把你发现的描写下来吧,下面是小编为大家整理的我的发现作文,欢迎大家阅读。【篇一:我的发现作文】神奇的大自然,千姿百态,奥妙无……
中秋节赏月的作文400字集合5篇在日常学习、工作或生活中,许多人都有过写作文的经历,对作文都不陌生吧,写作文是培养人们的观察力、联想力、想象力、思考力和记忆力的重要手段。作文的注意事项有许多,你确定会写吗?以……
风起陇西被陈坤连累扑街?有人说,是不是每个下凡演电视剧的电影咖,都会出师不利?比如章子怡,比如汤唯,比如陈坤。虽然但是,陈坤并不是纯粹的电影演员,他早期拍过很多电视剧,让他名声大噪的,也都……
王俊凯新剧开播,网友我只看脸王俊凯和张译的最新的剧《重生之门》近几日开播。讲真的,TFBOYS三兄弟,易烊千玺在影视剧中非常亮眼,给王俊凯的压力确实不小。如果王俊凯只是一个没有多大名气的演员,大家更……
蘑菇伞的二年级作文蘑菇伞的二年级作文1一天早上,小白兔花花想去森林里玩。出门前妈妈关心地对花花嘱咐:一定要小心,注意安全,孩子!花花听了妈妈的话就出发了。到了森林里,花花看见小草绿油……
风起陇西中的剧抛脸演员,认出了王骁和俞灏明,却没认出赵峥由陈坤和白宇领衔主演的电视剧《风起陇西》播出后,观众反响强烈。环环相扣的剧情不仅极具吸引力,还会为你带来沉浸式的追剧体验。尽管网上有一些质疑的声音,但整体感觉还是不……
给近一年来演技最好8位男演员排个名,胡军第8,雷佳音第3近一年来,国产好剧迎来井喷。优秀的主旋律作品,层出不穷,《觉醒年代》《大决战》《理想照耀中国》《功勋》让人目不暇接。一些籍籍无名的宝藏演员,凭借对历史人物的精准扮演……