AES加密在Android 和java 中的利用

最近涉及到的数据需要进行AES加密,关于AES加密的算法 在网上可以搜寻到很多很多。

但是如果稍微不注意就会产生错误。我在这里总结一下我当初碰见的错误 并说说自己的解决方法。


首先 加密算法


	public static String encrypt(String content, String password) {
		try {
			KeyGenerator kgen = KeyGenerator.getInstance(AES);
			SecureRandom sr = new SecureRandom();// java pc版加密设置
			// SecureRandom sr = SecureRandom.getInstance(SHA1, CRYPTO);//
			// android版加密设置
			sr.setSeed(password.getBytes());
			kgen.init(256, sr); // 192 and 256 bits may not be available
			SecretKey secretKey = kgen.generateKey();
			byte[] enCodeFormat = secretKey.getEncoded();
			SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES);
			Cipher cipher = Cipher.getInstance(AES);// java pc版加密设置
			// Cipher cipher = Cipher.getInstance(CIPHER);// Android版加密设置
			byte[] byteContent = content.getBytes();
			cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
			return parseByte2HexStr(cipher.doFinal(byteContent));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

当初在网上找到算法之后 直接引用到Android上发现不对。  但是在Eclipse中的java项目下直接运行测试发现可以成功。

最后才知道如果是在Android上加密 需要设置两个地方

 SecureRandom sr = SecureRandom.getInstance(SHA1, CRYPTO);
 Cipher cipher = Cipher.getInstance(CIPHER);// Android版加密设置
这两个地方需要注意的。


解密代码同理


	/**
	 * 解密
	 * 
	 * @param content
	 *            待解密内容
	 * @param password
	 *            解密密钥
	 * @return
	 */
	public static byte[] decrypt(String content, String password) {
		try {

			KeyGenerator kgen = KeyGenerator.getInstance(AES);
			SecureRandom sr = new SecureRandom();// java pc版解密设置
			// SecureRandom sr = SecureRandom.getInstance(SHA1, CRYPTO);//
			// Android
			sr.setSeed(password.getBytes());
			kgen.init(256, sr);
			SecretKey secretKey = kgen.generateKey();
			byte[] enCodeFormat = secretKey.getEncoded();
			SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES);
			Cipher cipher = Cipher.getInstance(AES);// java pc版设置
			// Cipher cipher = Cipher.getInstance(CIPHER);// Android版设置
			cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
			return cipher.doFinal(parseHexStr2Byte(content));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

关于方法的介绍:如果你了解AES加密 那对于传递到方法的参数就能理解。

但我还是在这里说详细一点

如果要对于一段数据进行AES加密  那么加密的时候 你就要设置密钥,其实就是密码了。你设置了密码之后,其他人即使

和你使用同样的算法 也需要你的密码才能解析出来数据。


好了下面是关于

 Illegal key size or default parameters 时的解决办法


出现这个错误 他的意思就是告诉你,你设置的256的密钥长度哥解决不了。 太长了。

原因在于jre本身携带的 JCE   :local_policy.jar 和 US_export_policy.jar  太老了。需要下载最新的才行 。

下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

我这个链接提供的是 jce8,一般下载最新的没有多大问题了。


下载之后 会有两个jar文件 一个是local_policy.jar US_export_policy.jar

然后将这个俩个jar文件复制替换你的jdk中的原文件就可以了 。

替换路径:Java\lib\security 。这个文件夹中是有那两个jar 的,但我们不用在意,直接复制替换即可

关于路径问题 我这个安装的时候就直接写成了java。 可能大家的一般会是 \jreXX\lib\security 

要的就是替换Jre下面的。

这个时候就会发现没有问题了。

然后我之后又碰见了第三个问题:

java.lang.ExceptionInInitializerError  对就是这个错误,变量初始问题。报错就在

KeyGenerator kgen = KeyGenerator.getInstance(AES);
我的开始加密的第一句话上。
看了不少的说明文档,说的是我的jce不正确,才会造成。
之后我发现 我的jce下错了。 就是上面的jce下载 我开始的时候下的是jce6。 而我的jdk版本都8 了。之后在官网上找到了最新的下载并替换之后。
就一切OK了

效果
public static void main(String[] args) {
		String s = "我要加密这个文本";
		String ss = AESUtil.encrypt(s, "123456");
		System.out.println("加密后:" + ss);
		String ed = AESUtil.decrypt(ss, "123456");
		System.out.println("解密后:" + ed);
	}

结果:
加密后:25E322A1A69785A889F4B66BED61C53C78C111AF2E878B353F8248616DFA6237
解密后:我要加密这个文本

最后 是这个见得Demo 效果。如果大家想将它用在Android上 就根据注释将相应的字段注释掉就可了

http://download.csdn.net/detail/zy987654zy/7863933

ps:看到大家下载后的评论中, 我先解释下, 这个demo只是解决了在Android 加密 可以在Android进行解密,在java端加密 可以在java端解密。

至于Android 加密 java端解密 这个过程我没有去验证过,so,应该会有问题吧 。


你可能感兴趣的:(Android,java)