1 Star 2 Fork 3

修行者/WebEncryption

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
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来调用,这样才算安全。关键是写在底层,如何保证调用方是自己的应用,而不是被别人盗版的或是破解的,这也是一个问题。
    我们知道,签名是不可伪造的,这就为我们提供了解决的方案。我们在底层获得签名的哈希值,并用此哈希值与自己签名应有的哈希值比较,成功则允许调用核心代码,不成功则不允许调用,返回空即可。

空文件

简介

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

发行版

暂无发行版

贡献者 (1)

全部

近期动态

9年多前推送了新的提交到 master 分支,23b9147...3faa56c
9年多前推送了新的提交到 master 分支,0d00d6f...23b9147
9年多前推送了新的提交到 master 分支,665e2ac...0d00d6f
9年多前推送了新的提交到 master 分支,a50286a...665e2ac
9年多前推送了新的提交到 master 分支,e2e3711...a50286a
加载更多
不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Android
1
https://gitee.com/2021/WebEncryption.git
git@gitee.com:2021/WebEncryption.git
2021
WebEncryption
WebEncryption
master

搜索帮助