Android 文件加密及解密

 

1. 保护隐私数据不被未授权访问;

什么是加密

 1. 保护隐私数据不被未授权访问;

 2. 用于隐藏真实数据,进行安全的数据传递;

 3. 避免数据被第三方截获;

2. 用于隐藏真实数据,进行安全的数据传递;

3. 避免数据被第三方截获;

古代加密方式:置换(反序,替换)

加密算法的历史

 古代加密方式:置换(反序,替换)

 现代加密算法:带密码的加密、两套密码的加密、动态密码加密。

 现代加密:对称加密、非对称加密

现代加密算法:带密码的加密、两套密码的加密、动态密码加密。

现代加密:对称加密、非对称加密

1. 能否通过一个密码进行加密和解密的操作,如果能就是对称加密。

对称加密

 1. 能否通过一个密码进行加密和解密的操作,如果能就是对称加密。

 2. 对称加密都有密码。

 3. 常用的加密方式DES, AES

2. 对称加密都有密码。

3. 常用的加密方式DES, AES

DES 加密算法

 说明

  DES 通过密码,对数据进行大量循环方式的异或

操作,从而生成加密后的数据。

DES对数据依次进行加密,一次加密是8个字节一起

因此,DES密码,必须是64bit,也就是8个字节

 DES加密实现

  1. DES加密之后的数据,不能够直接生成字符串的;

  2. 加密:  M 明文, K 12345678, D 加密后数据

             D = DES(M, K) 用K密码对M进行加密生成D

  3. 解密:M = DES(D, K)

  4. 这种可以通过相同的密码进行加密和解密的叫做对称加密。

 DES API

  1. Cipher 加密/解密引擎,用于实际的处理

  2. cipher.init(int mode, Key key) 设置加密还是解密

  3. Key 对于DES需要使用 SecretKeyFactory 进行密码创建

  创建密码对象用的是 DESKeySpec

  4. Cipher update(byte[]) 每次调用都会返回一部分处理的数据,DES API doFinal 就只能返回最后一次的数据,不是完整的,

  5. DES 加密推荐使用 doFinal 来完成。

 DESede 加密方式

  对于DES 或者 DESede 而言,如果实现DESede的话,那么:Cipher 算法调整为 DESede,SecretKeyFactory制定的算法,同样调整为 DESede, 其中需要使用 DESedeKeySpec 生成密码,而且密码的长度 24个字节。

AES 加密算法

 特点

  1. 速度快

  2. 强度高

  3. Java中默认支持 AES 128bit 加密

   AES 256bit 美国军方的标准;

   AES 256bit 需要美国出口许可证才可以用。

 DES, AES 特性 - 分块加密

  Padding: 加密的时候,分块是数据按照固定长度一块一块处理,可以通过 Cipher 参数进行分块的控制

  NoPadding:如果数据不是块长度的倍数,那么不会填充

  一般情况下,填充会自动向数据后面添加 字节0 补齐

 AES 常用的Cipher算法

  1. AES 默认可以使用,有时也会出现BadPaddingException,不建议使用

  2. AES/ECB/PKCS5Padding  另外一种AES 加密形式,建议使用

  3. AES/CBC/PKCS5Padding 内部的算法模式不同。

  4.算法及密码长度限制

   算法/模式/填充                16字节加密后数据长度        不满16字节加密后长度  

   AES/CBC/NoPadding             16                          不支持  

   AES/CBC/PKCS5Padding          32                          16  

   AES/CBC/ISO10126Padding       32                          16  

   AES/CFB/NoPadding             16                          原始数据长度  

   AES/CFB/PKCS5Padding          32                          16  

   AES/CFB/ISO10126Padding       32                          16  

   AES/ECB/NoPadding             16                          不支持  

   AES/ECB/PKCS5Padding          32                          16  

   AES/ECB/ISO10126Padding       32                          16  

   AES/OFB/NoPadding             16                          原始数据长度  

   AES/OFB/PKCS5Padding          32                          16  

   AES/OFB/ISO10126Padding       32                          16  

   AES/PCBC/NoPadding            16                          不支持  

   AES/PCBC/PKCS5Padding         32                          16  

   AES/PCBC/ISO10126Padding      32                          16  

 AES API

  1. Cipher 加密/解密引擎

  2. 创建密码生成器 KeyGenerator,设置密码生成的密码长度 128 bit和设备安全随机数 ,

 如keyGenerator.init(128, new SecureRandom(password.getBytes()));

  3.生成 SecretKey keyGenerator.generateKey()

  4. 初始化 引擎 cipher.init(Cipher.ENCRYPT_MODE, secretKey)

  5. 加密处理 cipher.doFinal(byte[] origData)

非对称加密算法

 加密实现

  1. M 明文 D 公钥 E 密钥 C 密文 n 公共模数 0x10001

  2. C = M ^ E mod n

  3. M = C ^ D mod n

  4. 通常 E + n 作为 私钥隐秘保存

  5. 通常 D + n 作为公钥,可以给任何人。

  6. 通过 C ^ D mon => M

  7. E 通过计算两个 1024bit 以上的整数(并且是素数),

   公钥  D = (素数1 - 1) * (素数2 - 1) E 包含两个素数

  D 安全性足够高

 非对称加密的API

  1. Cipher 可以进行加密,用的是 “RSA”, “DSA”

  2. KeyPairGenerator 生成 公钥和私钥

  3. cipher init 加密用 私钥, init 解密 用的是公钥初始化。

加密实现

 1. M 明文 D 公钥 E 密钥 C 密文 n 公共模数 0x10001

 2. C = M ^ E mod n

 3. M = C ^ D mod n

 4. 通常 E + n 作为 私钥隐秘保存

 5. 通常 D + n 作为公钥,可以给任何人。

 6. 通过 C ^ D mon => M

 7. E 通过计算两个 1024bit 以上的整数(并且是素数),

  公钥  D = (素数1 - 1) * (素数2 - 1) E 包含两个素数

 D 安全性足够高

非对称加密的API

 1. Cipher 可以进行加密,用的是 “RSA”, “DSA”

 2. KeyPairGenerator 生成 公钥和私钥

 3. cipher init 加密用 私钥, init 解密 用的是公钥初始化。

Base64、MD5编码

 android.util.Base64类

  encode(byte[],flag)

  encodeToString(byte[],flag) 编码并转换成字符串

  decode(byte[],flag) 解码

  flags标识

   Base64.DEFAULT 默认,如果字符串过长(超过76)时自动在中间加一个换行符,字符串最后也会加一个换行符。可能会导致和其他模块对接时结果不一致,建议使用Base64.NO_WRAP

   Base64.NO_WRAP 不换行处理

   Base64.NO_PADDING 结束位置省略“==”

 it.sauronsoftware.base64.Base64类

  第三方Base64编码、解码工具类

  Base64.decode(byte[]);

  Base64.encode(byte[])

 MD5

  java.security.MessageDigest

  MD5加密:

猜你喜欢

转载自blog.csdn.net/dubo_csdn/article/details/86104940