最近由于项目需要,尝试了一下Xamarin.Forms绑定三方JAR包,实现文件的加密压缩及解密解压。本人才疏学浅,第一次撰写博客,有不当之处请大家指正。
1、加密的基本概念
"加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。
2、 加密的基本功能
a)防止不速之客查看机密的数据文件;
b)防止机密数据被泄露或篡改;
c)防止特权用户(如系统管理员)查看私人数据文件;
d)使入侵者不能轻易地查找一个系统的文件。
数据加密是确保计算机网络安全的一种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。
3、加密的技术分类
加密类型可以简单地分为四种:
a)根本不考虑解密问题;
b)私用密钥加密技术:对称式加密(Symmetric Key Encryption):对称式加密方式对加密和解密使用相同的密钥。通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。如:RC4、RC2、DES 和 AES 系列加密算法。
c)公开密钥加密技术:非对称密钥加密(Asymmetric Key Encryption):非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。公共密钥可以广泛的共享和透露。当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。如:RSA
d)数字证书(Certificate):数字证书是一种非对称密钥加密,但是,一个 组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。
4、对称加密--AES加密和解密
对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。
单钥密码系统的安全性依赖于以下两个因素:
第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。
第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。
4.1 加解密过程
图1 加解密过程图
图2 AES加密详细过程图
上图是整个AES算法相关的流程图,下面以AES为例,结合MD5及SHA256分析加密解密的各个步骤,并给出相关实现代码。
4.2 生成Key及IV
AES的Key是一个固定长度的字节数组(128位,192位或者256位)
相关代码如下:
注:AES的密钥向量IV为16位,模式(CBC、CFB、OFB)不同IV值不同,CBC模式下IV默认为16个0(称为初始向量),由于是分组加密,所以下一组的IV,就用前一组的加密的密文来充当。
4.3 加密操作
加密的原料是明文字节流,AES算法对字节流进行加密,返回的是加密后的字节流,同时要给定加密使用的Key和IV。
4.4 解密操作
解密操作解密上面步骤生成的密文byte[],需要使用到加密步骤使用的同一组Key和IV。
AES加解密效果如下所示:
5、Zip4J的使用
Zip4J的功能强大,压缩速度快,本文采用绑定Zip4J JAR包的方法,利用JAVA原生的方法进行加解密。Xamarin.Android绑定JAR包的详细方法,参考官网
https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/,在此不再累述。本文给出绑定相关JAR包编译出现的错误及解决方法:
编译出现的错误:
解决方法:
方法一:移除无关的node节点
方法二:增加相关的node节点
调用Zip4J相关类的方法进行加解密
加密
解密
6、结束语
本文是在参考网上各位大神的文章,结合自己的项目,写的一点东西,也算是给自己一点积累,也希望能给大家带来帮助,同时欢迎大家共同探讨,共同进步