Android加密算法总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android加密算法总结相关的知识,希望对你有一定的参考价值。
参考技术A 1.概念:
Base64是一种用64个字符(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/)来表示二进制数据的方法,只是一种编码方式,所以不建议使用Base64来进行加密数据。
2.由来:
为什么会有Base64编码呢?因为计算机中数据是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。在网络上交换数据时,比如图片二进制流的每个字节不可能全部都是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情况下,做一种扩展方案来支持二进制文件的传送,把不可打印的字符也能用可打印字符来表示,所以就先把数据先做一个Base64编码,统统变成可见字符,降低错误率。
3.示例:
加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。
1.DES
DES全称为Data Encryption Standard,即数据加密标准,是一种使用 密钥加密 的块算法。
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
2.3DES
3DES(或称为Triple DES)是三重 数据加密算法 (TDEA,Triple Data Encryption Algorithm)块密码的通称。是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。
3.AES
AES全称Advanced Encryption Standard,即高级加密标准,当今最流行的对称加密算法之一,是DES的替代者。支持三种长度的密钥:128位,192位,256位。
AES算法是把明文拆分成一个个独立的明文块,每一个明文块长128bit。这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。
但是这里涉及到一个问题:假如一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding):
AES的工作模式,体现在把明文块加密成密文块的处理过程中。
加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。
1.SHA
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法,且若输入的消息不同,它们对应到不同字符串的机率很高。
SHA分为SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512五种算法,后四者有时并称为SHA-2。SHA-1在许多安全协定中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的杂凑函数)的后继者。但SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的杂凑算法。
2.RSA
RSA算法1978年出现,是第一个既能用于数据加密也能用于数字签名的算法,易于理解和操作。
RSA基于一个数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可提供给任何人使用,私钥则为自己所有,供解密之用。
3.MD5
MD5信息摘要算法 (英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用于确保信息传输完整一致。具有如下优点:
XOR:异或加密,既将某个字符或者数值 x 与一个数值 m 进行异或运算得到 y ,则再用 y 与 m 进行异或运算就可还原为 x。
使用场景:
(1)两个变量的互换(不借助第三个变量);
(2)数据的简单加密解密。
加密和解密的总结
一.加密算法的分类
1.对称加密算法具有更高的加密速度,但双方都需要事先知道秘钥,秘钥在传输过程中可能会被窃取,因此安全性没有非对称加密高
常见的对称加密算法:DES, AES, 3DES等等
2.非对称加密算法的加密速度低于对称加密算法,但是安全性更高
非对称加密算法:RSA, DSA, ECC 等算法
3.利用字典的格式转换加密
MAKETRANS()
二.详细分析
1.DES加密
即数据加密标准,是一种使用秘钥加密的块算法
入口参数有三个:key, Data, Mode
key为7个字节共56位,是DES算法的工作秘钥;
Data为DES的工作方式,有两种:加密和解密
3DES是DES向AES过渡的加密算法,使用两个秘钥,执行三次DES算法,
加密的过程是加密-解密-加密
解密的过程是解密-加密-解密
1 from Crypto.Cipher import DES 2 key = b‘abcdefgh‘ # 密钥 8位或16位,必须为bytes 3 4 def pad(text): 5 """ 6 # 加密函数,如果text不是8的倍数【加密文本text必须为8的倍数!】,那就补足为8的倍数 7 :param text: 8 :return: 9 """ 10 while len(text) % 8 != 0: 11 text += ‘ ‘ 12 return text 13 14 15 des = DES.new(key, DES.MODE_ECB) # 创建一个DES实例 16 text = ‘Python rocks!‘ 17 padded_text = pad(text) 18 encrypted_text = des.encrypt(padded_text.encode(‘utf-8‘)) # 加密 19 print(encrypted_text) 20 # rstrip(‘ ‘)返回从字符串末尾删除所有字符串的字符串(默认空白字符)的副本 21 plain_text = des.decrypt(encrypted_text).decode().rstrip(‘ ‘) # 解密 22 print(plain_text)
2.AES加密
高级加密标准(英语:Advanced EncryptionStandard,缩写:AES),这个标准用来替代原先的DES
AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特(16、24和32字节)
大致步骤:
1、密钥扩展(KeyExpansion),
2、初始轮(Initial Round),
3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,
4、最终轮(Final Round),最终轮没有MixColumns。
普通方式
1 from Cryptodome.Cipher import AES 2 from binascii import b2a_hex, a2b_hex 3 #秘钥,此处需要将字符串转为字节 4 key = ‘abcdefgh‘ 5 #加密内容需要长达16位字符,所以进行空格拼接 6 def pad(text): 7 while len(text) % 16 != 0: 8 text += ‘ ‘ 9 return text 10 #加密秘钥需要长达16位字符,所以进行空格拼接 11 def pad_key(key): 12 while len(key) % 16 != 0: 13 key += ‘ ‘ 14 return key 15 #进行加密算法,模式ECB模式,把叠加完16位的秘钥传进来 16 aes = AES.new(pad_key(key).encode(), AES.MODE_ECB) 17 #加密内容,此处需要将字符串转为字节 18 text = ‘hello‘ 19 #进行内容拼接16位字符后传入加密类中,结果为字节类型 20 encrypted_text = aes.encrypt(pad(text).encode()) 21 encrypted_text_hex = b2a_hex(encrypted_text) 22 print(encrypted_text_hex) 23 24 25 # #此处是为了验证是否能将字节转为字符串后,进行解密成功 26 # #实际上a 就是 encrypted_text ,也就是加密后的内容 27 # #用aes对象进行解密,将字节类型转为str类型,错误编码忽略不计 28 de = str(aes.decrypt(a2b_hex(encrypted_text_hex)), encoding=‘utf-8‘,errors="ignore") 29 # #获取str从0开始到文本内容的字符串长度。 30 print(de[:len(text)])
面向对象方式
1 from Cryptodome.Cipher import AES 2 from binascii import b2a_hex, a2b_hex 3 4 AES_LENGTH = 16 5 6 class prpcrypt(): 7 def __init__(self, key): 8 self.key = key 9 self.mode = AES.MODE_ECB 10 self.cryptor = AES.new(self.pad_key(self.key).encode(), self.mode) 11 12 # 加密函数,如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数 13 # 加密内容需要长达16位字符,所以进行空格拼接 14 def pad(self,text): 15 while len(text) % AES_LENGTH != 0: 16 text += ‘ ‘ 17 return text 18 19 # 加密密钥需要长达16位字符,所以进行空格拼接 20 def pad_key(self,key): 21 while len(key) % AES_LENGTH != 0: 22 key += ‘ ‘ 23 return key 24 25 def encrypt(self, text): 26 27 # 这里密钥key 长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度.目前AES-128足够用 28 # 加密的字符需要转换为bytes 29 # print(self.pad(text)) 30 self.ciphertext = self.cryptor.encrypt(self.pad(text).encode()) 31 # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题 32 # 所以这里统一把加密后的字符串转化为16进制字符串 33 return b2a_hex(self.ciphertext) 34 35 # 解密后,去掉补足的空格用strip() 去掉 36 37 def decrypt(self, text): 38 plain_text = self.cryptor.decrypt(a2b_hex(text)).decode() 39 return plain_text.rstrip(‘ ‘) 40 41 42 if __name__ == ‘__main__‘: 43 pc = prpcrypt(‘abcdef‘) # 初始化密钥 44 e = pc.encrypt("0123456789ABCDEF") 45 d = pc.decrypt(e) 46 print(e, d) 47 e = pc.encrypt("00000000000000000000000000") 48 d = pc.decrypt(e) 49 print(e, d)
3.RSA加密
公钥加密算法,一种非对称密码算法
公钥加密,私钥解密
公有三个参数:rsa_n, rsa_e, message
rsa_n, rsa_e 用于生成公钥
message:需要加密的消息
1 import rsa 2 from binascii import b2a_hex, a2b_hex 3 4 5 6 class rsacrypt(): 7 def __init__(self, pubkey, prikey): 8 self.pubkey = pubkey 9 self.prikey = prikey 10 11 def encrypt(self, text): 12 self.ciphertext = rsa.encrypt(text.encode(), self.pubkey) 13 # 因为rsa加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题 14 # 所以这里统一把加密后的字符串转化为16进制字符串 15 return b2a_hex(self.ciphertext) 16 17 def decrypt(self, text): 18 decrypt_text = rsa.decrypt(a2b_hex(text), prikey) 19 return decrypt_text 20 21 22 if __name__ == ‘__main__‘: 23 pubkey, prikey = rsa.newkeys(256) 24 rs_obj = rsacrypt(pubkey,prikey) 25 text=‘hello‘ 26 ency_text = rs_obj.encrypt(text) 27 print(ency_text) 28 print(rs_obj.decrypt(ency_text)) 29 30 """ 31 b‘7cb319c67853067abcd16aad25b3a8658e521f83b1e6a6cf0c4c2e9303ad3e14‘ 32 b‘hello‘ 33 """
4.使用base64或pycrypto模块
1.使用base64
1 s1 = base64.encodestring(‘hello world‘) 2 s2 = base64.decodestring(s1) 3 print s1, s2 4 5 # 结果 6 # aGVsbG8gd29ybGQ= 7 # hello world
优点:方法简单
缺点:不保险,别人拿到密文可以解密出明文
编码原理:将3个字节转换成4个字节((3 X 8)=24=(4X6)),先读入3个字节,每读一个字节,左移8位,再右移四次,每次6位,这样就有4个字节了。
解密原理:将4个字节转换成3个字节,先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位,这样就还原了。
2.使用pycrypto模块
1 from Crypto.Cipher import AES 2 obj = AES.new(‘This is a key123‘, AES.MODE_CBC, ‘This is an IV456‘) 3 message = "The answer is no" 4 ciphertext = obj.encrypt(message) 5 print(ciphertext) 6 # ‘xd6x83x8dd!VTx92xaa`Ax05xe0x9bx8bxf1‘ 7 obj2 = AES.new(‘This is a key123‘, AES.MODE_CBC, ‘This is an IV456‘) 8 decryptext = obj2.decrypt(ciphertext) 9 print(decryptext) 10 # ‘The answer is no‘
AES只是个基本算法,实现AES有若干模式。其中的CBC模式因为其安全性而被TLS(就是https的加密标准)和IPSec(win采用的)作为技术标准。
简单地说,CBC使用密码和salt(起扰乱作用)按固定算法(md5)产生key和iv。然后用key和iv(初始向量,加密第一块明文)加密(明文)和解密(密文)。
1 import sys 2 from Crypto.Cipher import AES 3 from binascii import b2a_hex, a2b_hex 4 5 class prpcrypt(): 6 def __init__(self, key): 7 self.key = key 8 self.mode = AES.MODE_CBC 9 10 #加密函数,如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数 11 def encrypt(self, text): 12 cryptor = AES.new(self.key, self.mode, self.key) 13 #这里密钥key 长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度.目前AES-128足够用 14 length = 16 15 count = len(text) 16 add = length - (count % length) 17 text = text + (‘