1 Star 2 Fork 3

修行者 / WebEncryption

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

#WebEncryption 网络传输加密技术,用于数据在网络传输的过程中:为了防止数据被拦截破解,而采取的加密。数据处理流程:首先将文本数据进行zip压缩,然后使用AES加密,最后发送出去;对方接收到数据后,则先执行AES解密操作,再执行zip解压即可。
【注意】Android客户端的压缩解压缩,均使用JNI完成,以防被破解。并且在底层验证了apk签名是否正确,然后再决定是否执行加密解密算法。 #使用方法 ##生成密码 调用GeneratePassword.java文件中的主函数,即可生成加密解密密码(初始化向量也可以使用这个方法来生成)。
生成的密码格式如下:

AES密码C语言版:88,19,206,109,85,77,248,70,128,192,20,248,102,50,83,240
AES密码Java版:88,19,-50,109,85,77,-8,70,-128,-64,20,-8,102,50,83,-16

生成密码后,讲加密解密密码和异或密码拷贝到JavaAESEncrypt.java和AESEncrypt.h文件中。
加密密码:key和_aes_key
初始化向量:iv和_aes_iv ##服务器端 将上面生成的密码拷贝到JavaAESEncrypt.java,加密解密算法即可使用。
###发送数据 首先将客户端需要的数据进行压缩(也可以不压缩),加密,然后在发送加密后的字节数组:

	try {
	    	// 压缩数据,也可以不压缩,直接加密
	    	byte[] zipData = JavaAESEncrypt.compress(data);
	    	// 加密数据
	    	byte[] resultData = JavaAESEncrypt.AESencrypt(zipData);
	} catch (Exception e) {
		e.printStackTrace();
	}

###接收数据 接收到客户端的数据后,先进行解密,在进行解压(如果客户端没有压缩的话,则不需要执行解压操作):

	try {
    		// 解密数据
    		byte[] zDate = JavaAESEncrypt.DecodeAESEncrypt(resultData);
    		// 解压数据
    		String resultDate = JavaAESEncrypt.uncompress(zDate);
    		log += "解密后 : " + resultDate + "\n\n";
	} catch (Exception e) {
		e.printStackTrace();
	}

##Android客户端 Android客户端使用之前,首先要将生成的密码拷贝到AESEncrypt.h文件中,然后再做以下操作:

  1. 将apk签名的哈希值拷贝到AESEncrypt.h文件中,设置给_hash_code;
  2. 将上述哈希值拷贝给as.c文件中的82行的hash_code,以便【测试的时候使用,正式发布应用的时候请将此行注释掉】;
  3. 编译JNI程序;
  4. 在项目的Application中,或程序入口处,初始化加密解密库:
CAESEncrypt.initialize(getApplicationContext());

###发送数据 将需要发送的数据打包成字符串,然后使用CAESEncrypt类进行压缩(也可以不压缩)和加密。完成处理后发送给服务器:

String data = "{[{\"name\":\"jim\", \"age\":16},{\"name\":\"jerry\", \"age\":18},{\"name\":\"kate\", \"age\":21}," +
	"{\"name\":\"jack\", \"age\":20},{\"name\":\"tim\", \"age\":19},{\"name\":\"green\", \"age\":22}]}";
// 压缩数据,也可以不压缩,直接加密
byte[] zipData = CAESEncrypt.compress(data.getBytes());
// 加密数据
byte[] resultData = CAESEncrypt.AESencrypt(zipData);

###接收数据 将从服务器接收到的数据进行解密、解压(如果服务器未压缩,则不执行解压操作)处理:

// 解密数据
byte[] zDate = CAESEncrypt.DecodeAESEncrypt(resultData);
// 解压数据
String resultDate = new String(CAESEncrypt.uncompress(zDate));

#AES加密算法 本项目使用了比较常用的AES加密算法模式:CBC模式。具体介绍请参考谷歌和百度。
本项目对此加密算法进行了如下改动:

  1. 由于待加密的字节数必须是16的整数倍,所以在加密之前,先判断待加密数组长度是否是16的整数倍,不是的话则补足0;
  2. 为了记录上述补足的数量,又添加了16个字节,并在最后一个字节记录了一个数字:补足的个数 x 7;
  3. 然后进行加密;
  4. 解密的时候,根据上述算法去掉了补足的0。
    如果您闲的没事干的话,请看一下我做这个加密项目的思路:
    Android开发中,最让人头疼的莫过于对数据的保密了。谁也不希望自己辛辛苦苦做的服务器被人利用,也不希望自己的数据资源被免费泄露。另外,对于核心代码的保护,也是件头疼的事情,保护不好,显然会被盗版和破解,恶意添加或去除广告。
    异或加密是最容易理解最简单的加密方法了,简单到很容易破解的地步。只要能拦截到服务器发回来的数据,并看到解密后的数据,就很容易计算出密码。像这样坑爹的加密方法,当然不在考虑范围内。
    MD5和SHA加密是不可逆的,相当于指纹,常用作验证。对于数据加密的话,不做考虑。
    RSA、AES、DES加密方法都是可逆的,而且都可以使用密钥,可以用作数据加密。不过DES所能使用的密钥相对较小(56位),几年前有人采用网络联合运算的方式成功地破译了DES加密的数据,新版本的DES加密效率又太低。相对来说,AES使用的密钥更长,内部有更简洁精确的数学算法,而加密数据只需一次通过(即加密过程只需要遍历一次数据,新版的DES需要三次)。RSA公司是已广泛运用的数据加密算法和开发工具包的开发商,已经宣布支持AES。当然,三种加密方法都是很不错的,都可以选用。至于哪个最好,看了上面的介绍,估计也不言而喻了吧。
    不管使用哪种加密方法,凡是写在Java里的代码,都是不安全的。即便是混淆过,通过报错上溯法,还是可以找到的。
    所以加密算法和其他核心代码要写在底层,通过NDK来调用,这样才算安全。关键是写在底层,如何保证调用方是自己的应用,而不是被别人盗版的或是破解的,这也是一个问题。
    我们知道,签名是不可伪造的,这就为我们提供了解决的方案。我们在底层获得签名的哈希值,并用此哈希值与自己签名应有的哈希值比较,成功则允许调用核心代码,不成功则不允许调用,返回空即可。

空文件

简介

网络传输加密技术的算法实现。 展开 收起
Android
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Android
1
https://gitee.com/2021/WebEncryption.git
git@gitee.com:2021/WebEncryption.git
2021
WebEncryption
WebEncryption
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891