day3:简单密码相关算法
一)HEX编码
A 工具idea,创建Java工程
执行结果:
借助HexBin库函数,进去看其具体实现
lookUpHexAlphabet是码表;
将encode算法实现移到Java里,编码结果一致
如果改变了码表,则编码结果也都会变
B Android studio 真机pixel
创建工程后,在app下的build.gradle文件里添加okhttp3依赖
借助okhttp3中的bytestring中自带的hex编码实现。
二)Base64 编码
每个Base64字符代表原数据中的6bit
Base64编码后的字符数,是4的倍数
编码的字节数是3的倍数时,不需要填充
三)消息摘要算法
算法特点
a) 消息摘要算法/单向散列函数/哈希函数
b) 不同长度的输入,产生固定长度的输出
c) 散列后的密文不可逆
d) 散列后的结果唯一
e) 哈希碰撞
f) 一般用于校验数据完整性、签名sign
A.MD5
借助MessageDigest引擎类,创建md5算法,再用update压入数据(加盐),可分多次,最后digest进行加密,可通过reset重置。还可将md5加密结果进行hex/base64编码。
碰到加salt的MD5,可以直接输入空的值,得到结果去CMD5查询一下,有可能就得到salt。
B.MAC
借用SecretKeySpec 去创建算法,再初始化hmac算法,再dofinal加密
C.DES
有ECB与CBC模式之分,cbc模式才可以加iv。
没有指明加密模式和填充方式,表示使用默认的DES/ECB/PKCS5Padding
没有指明加密模式和填充方式,表示使用默认的DES/ECB/PKCS5Padding
D.DESede
没有指明加密模式和填充方式,表示使用默认的DESede/ECB/PKCS5Padding
若密钥不足24位,会报错。
同样存在CBC,ECB模式之分
四)非对称加密算法
A.RSA
需要生成一个密钥对,包含公钥和私钥,密钥不是随便写的
密钥对生成 在线生成非对称加密公钥私钥对、在线生成公私钥对、RSA Key pair create、生成RSA密钥对--查错网
公钥加密的数据,私钥才能解密
私钥加密的数据,公钥才能解密
一般公钥是公开的,私钥保密,私钥包含公钥,从公钥无法推导出私钥
加密处理安全,但是性能极差,单次加密长度有限制
RSA算法既可用于加密解密,也可用于数据签名(此时,一般用私钥加密,证明身份)
私钥的格式
pkcs1格式通常开头是 -----BEGIN RSA PRIVATE KEY-----
pkcs8格式通常开头是 -----BEGIN PRIVATE KEY-----
Java中的私钥必须是pkcs8格式
RSA模式和填充细节
a) None模式与ECB模式是一致的
b) NoPadding
明文最多字节数为密钥字节数(RSA-1024,明文最多可一次加密128个字节)
密文与密钥等长
填充字节0, 加密后的密文不变
c) pkcs1padding
明文最大字节数为密钥字节数-11(eg:RSA-1024,密钥1024位,即128字节,明文最多可以一次性加密的字节数就是117,再多就报错)
密文与密钥等长
每一次的填充不一样,使得加密后的密文会变
a)RSA_Base64(直接使用base64形式的密钥)
创建并初始化 公钥和私钥。
公钥加密函数
私钥加密函数
结果
D/RSA_Base64E: t+Tx/99MZotxUaThPSmo+QSRWAwd19VFF0vmNFpqtRymrwWwDSOZ41wIFWUpuOWIhIWRphV1cjgNrj7WENr4dCGkrOg3mMX7HKafn6vs7ya4e31Q/RpPCaIxljraEgA8DFE8GlNDo0HTBFjhGeQUUwbPBLQi3gmUEVuliLqHAQg=||b7e4f1ffdf4c668b7151a4e13d29a8f90491580c1dd7d545174be6345a6ab51ca6af05b00d2399e35c08156529b8e588848591a6157572380dae3ed610daf87421a4ace83798c5fb1ca69f9fabecef26b87b7d50fd1a4f09a231963ada12003c0c513c1a5343a341d30458e119e4145306cf04b422de0994115ba588ba870108
D/RSA_Base64D: MistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistMistM
没有指明加密模式和填充方式,表示使用默认的RSA/ECB/NOPadding
b)RSA_Hex
(有些情况加给出的密钥没有转换,就是hex编码的,但又不能单纯通过from hex 再to base64)
从网站找一组密钥,
很明显可以发现,私钥里面是包含公钥的,moudle取256个字符,public Exponent取010001,privateExponent取0281800后的255个字符
加密结果:
D/RSA_HexE: IQSmZslfSIH3z/Lyp9GEq6kixm074VIM9kWlsjZNr4FuoLSDepu7in3uoPF/E2vLWSn1UQDNgNgpsPR+MQX4hKEDIuvnb4gB7O6Z/RYX3DUav1pQAumQGs54jwlmXFFrDx25SLUHGvXVf408qm6XogkL78DxWAGx9D0l6nIdiAw=||2104a666c95f4881f7cff2f2a7d184aba922c66d3be1520cf645a5b2364daf816ea0b4837a9bbb8a7deea0f17f136bcb5929f55100cd80d829b0f47e3105f884a10322ebe76f8801ecee99fd1617dc351abf5a5002e9901ace788f09665c516b0f1db948b5071af5d57f8d3caa6e97a2090befc0f15801b1f43d25ea721d880c
D/RSA_HexD: Mist12345678
五,数字签名
第一个函数是签名,第二个函数是用于验证,以下是修改了RSA_Base64的一些地方
结果:使用私钥加密Mist123,使用公钥加密明文,比对两个加密结果,若一致,则verify为真,否则为假。