Android很多场合需要使用到数据加密,比如:本地登录密码加密,网络传输数据加密,等。在Android中一般的加密方式有如下:
亦或加密,
AES加密,
RSA非对称加密,
MD5加密算法,
当然还有其他的方式,这里暂且介绍以上四种加密算法的使用方式。
什么是亦或加密?
亦或加密是对某个字节进行亦或运算,比如字节^ K=V,这是加密过程,
当你把V ^ K得到的结果就是一个,也就是V ^ K=一个,这是一个反向操作过程,解密过程。
亦或操作效率很高,当然亦或加密也是比较简单的加密方式,且亦或操作不会增加空间,源数据多大亦或加密后数据依然是多大。
示例代码如下:
/* * *亦或加解密,适合对整个文件的部分加密,比如文件头部,和尾部 *对文件文件头部和尾部加密,适合拉链压缩包加密 * * @param源需要加密的文件 * @param侦破加密后保存文件名 * @param键加密的关键 */公共静态孔隙encryptionFile(文件来源、文件依据,int键){ FileInputStream fis=零; FileOutputStream安全系数=零; 尝试{ fis=new FileInputStream(源); 安全系数=new FileOutputStream(依据); int大?2048; 字节迷[]=新字节(大小); int数=fis.read(浅黄色);/* * zip包头部加密*/for (int i=0;我& lt;计数;我+ +){ 安全系数。写(浅黄色[我]^键); } 而(真){ 数=fis.read(浅黄色);/* * zip包结尾加密*/如果(计数& lt;大小){ for (int j=0;j & lt;计数;j + +) { 安全系数。写(浅黄色[j] ^键); } 打破; } 安全系数。写(浅黄色,0,数); } fos.flush (); } 抓住(IOException e) { e.printStackTrace (); } 最后{ 尝试{ 如果(fis !=null) { fis.close (); } 如果(安全系数!=null) { fos.close (); } } 抓住(IOException e) { e.printStackTrace (); } } }/* * *亦或加解密,适合对整个文件加密 * * @param源需要加密文件的路径 * @param侦破加密后保存文件的路径 * @param键加密秘钥密钥 */私有静态孔隙encryptionFile(源字符串,字符串相同,int键){ FileInputStream fis=零; FileOutputStream安全系数=零; 尝试{ fis=new FileInputStream(源); 安全系数=new FileOutputStream(依据); int读; 在((=fis.read ()) !=1) { 安全系数。写(读^键); } fos.flush (); } 抓住(IOException e) { e.printStackTrace (); } 最后{ 尝试{ 如果(fis !=null) { fis.close (); } 如果(安全系数!=null) { fos.close (); } } 抓住(IOException e) { e.printStackTrace (); } } }
可以对文件的部分加密,比如zip压缩包,就可以对头部和尾部加密,因为拉链头部和尾部藏有文件压缩相关的信息,所有,我们只对头部和尾部采用亦或加密算法,即可对整个邮政文件加密,当你不解密试图加压是会失败的。
也可以对整个文件进行亦或加密算法,所以你解密的时候其实是一个逆向的过程,使用同样的方法同样的关键即可对加密的文件解密。当然以后加密的安全性可想而知,不是很安全,所以,亦或加密算法一般使用在不太重要的场景。由于亦或算法很快,所以加密速度也很快。
什么是AES加密
AES对称加密
高级加密标准(英语:高级加密标准,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
Android中的AES加密秘钥钥必须为16/24/32位字节,否则抛异常
示例代码:
私有静态最终字符串标签=癊ncryptUtils”; 私人最终静态int MODE_ENCRYPTION=1; 私人最终静态int MODE_DECRYPTION=2; 私人最终的静态字符串AES_KEY=" xjp_12345 ! ^ -=42 #”;//AES秘钥密钥,必须为16位 私有静态byte[]加密(int模式,byte[]内容字符串pwd) { 尝试{ 密码密码=. getinstance (“AES/CFB/NoPadding”);//AES加密模式,在循环加密模式 SecretKeySpec keySpec=new SecretKeySpec (pwd.getBytes (“utf - 8”)、AES);//AES加密方式 IvParameterSpec ivSpec=new IvParameterSpec (pwd.getBytes (" utf - 8 ")); 密码。init(模式==MODE_ENCRYPTION & # 63;密码。ENCRYPT_MODE:密码。DECRYPT_MODE、keySpec ivSpec); 返回cipher.doFinal(内容); } 抓住(NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException | InvalidAlgorithmParameterException e) { e.printStackTrace (); 日志。e(标签,“加密失败……错:“+ e.getMessage ()); } 捕获(异常e) { e.printStackTrace (); 日志。e(标签,“encryption1失败……错:“+ e.getMessage ()); } 返回null; }/* * * AES加密 * * @param源需要加密的文件路径 * @param桌子加密后的文件路径 */公共静态孔隙encryptByAES(字符串源字符串dest) { encryptByAES (MODE_ENCRYPTION、来源、桌子); } 公共静态孔隙encryptByAES (int模式,源字符串,字符串dest) { 日志。我(标签,“开始===encryptByAES "); FileInputStream fis=零; FileOutputStream安全系数=零; 尝试{ fis=new FileInputStream(源); 安全系数=new FileOutputStream(桌子); int大?2048; 字节迷[]=新字节(大小); 字节buffResult []; 而((fis.read(浅黄色))!=1){ buffResult=加密(模式、浅黄色、AES_KEY); 如果(buffResult !=null) { fos.write (buffResult); } } 日志。我(标签,“结束===encryptByAES”); } 抓住(IOException e) { e.printStackTrace (); 日志。e(标签,“encryptByAES失败犯错:“+ e.getMessage ()); } 最后{ 尝试{ 如果(fis !=null) { fis.close (); } 如果(安全系数!=null) { fos.close (); } } 抓住(IOException e) { e.printStackTrace (); } } }/* * * AES解密 * * @param源需要解密的文件路径 * @param dest解密后保存的文件路径 */公共静态孔隙decryptByAES(字符串源字符串dest) { encryptByAES (MODE_DECRYPTION、来源、桌子); }Android常用的数据加密方式代码详解