Java 中的 AES SHA1PRNG 如何用 golang 实现?

2018-06-01 12:37:44 +08:00
 hilow

/**
 *
 * AES CBC 256 位加密
 * @param content 加密内容字节数组
 * @param keyBytes 加密字节数组
 * @param iv 加密向量字节数组
 * @param encryptLength 仅支持 128、256 长度
 * @return 解密后字节内容
 * @throws NoSuchAlgorithmException
 * @throws NoSuchPaddingException
 * @throws InvalidKeyException
 * @throws InvalidAlgorithmParameterException
 * @throws IllegalBlockSizeException
 * @throws BadPaddingException
 */
public static byte[] encryptAESCBC( byte[] content, byte[] keyBytes,byte[] iv, int encryptLength )
{

	KeyGenerator	keyGenerator	= KeyGenerator.getInstance( "AES" );
	SecureRandom	secureRandom	= SecureRandom.getInstance( "SHA1PRNG" );
	secureRandom.setSeed( keyBytes );
	keyGenerator.init( encryptLength, secureRandom );
	SecretKey	key	= keyGenerator.generateKey();  
	// 以上应该是使用任意长度的 keyBytes,生成指定长度为 encryptLength 的 key
	// 后面再使用 AES/CBC/PKCS5Padding 算法,对 content 加密,加密角度是上面生成的固定长度的 key
	// 我的主要疑问就在这里,  如何用 golang 生成与 keyGenerator.generateKey() 一样的 key 呢?


	Cipher		cipher	= Cipher.getInstance( "AES/CBC/PKCS5Padding" );
	cipher.init( Cipher.ENCRYPT_MODE, key, new IvParameterSpec( iv ) );
	byte[] result = cipher.doFinal( content );
	return(result);
}

3943 次点击
所在节点    问与答
2 条回复
a7a2
2018-06-01 13:09:20 +08:00
hilow
2018-06-03 20:10:57 +08:00
@a7a2 谢了
但我主要疑问不是如何加密,是如何生成加密时所用的 key
java 中 AES SHA1PRNG 的生成逻辑是个黑盒吗?还是有什么标准可以参考?
而且 keyBytes 固定时,在 jdk 1.7 时,这个操作返回的 key,每次都随机;
我更新了 jdk 10 后,返回的 key 才固定下来。真把我搞晕了。

[hi@hi javaapi]$ java -version
java version "10.0.1" 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/459541

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX