JAVA AES-128-CBC加密 PHP7 OpenSSL解密失败?

C哩C哩 发布于 2018/01/14 16:01
阅读 403
收藏 1

这是一段JAVA加密的代码,现在在转化为PHP7中的OpenSSL解密中,总是返回失败,Google之后,感觉问题出现在IV偏移量上,但是不太清楚具体原因,下面贴上JAVA的加密和PHP解密的方法,希望对对称加密比较熟悉的不惜赐教。

JAVA Code:

public class SecurityUtil {
	public static byte[] encrypt(String content, String password) throws Exception {
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
		secureRandom.setSeed(password.getBytes());
		kgen.init(128, secureRandom);

		SecretKey secretKey = kgen.generateKey();
		byte[] enCodeFormat = secretKey.getEncoded();
		SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

		Cipher cipher = Cipher.getInstance("AES");
		byte[] byteContent = content.getBytes("utf-8");

		cipher.init(Cipher.ENCRYPT_MODE, key);
		return cipher.doFinal(byteContent);
	}

	public static byte[] decrypt(byte[] content, String password) throws Exception {
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
		secureRandom.setSeed(password.getBytes());
		kgen.init(128, secureRandom);
		SecretKey secretKey = kgen.generateKey();
		byte[] enCodeFormat = secretKey.getEncoded();
		SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
		Cipher cipher = Cipher.getInstance("AES");
		cipher.init(Cipher.DECRYPT_MODE, key);
		return cipher.doFinal(content);
	}

	public static String decrypt(String value, String password) {
		try {
			byte[] raw = password.getBytes();
			SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
			IvParameterSpec iv = new IvParameterSpec(skeySpec.getEncoded());
			Cipher dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			dcipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
			return new String(dcipher.doFinal(asBin(value)));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}

}

PHP Code: 

public static function decrypt($plainText, $key){

   $key = substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 16);

   return openssl_decrypt(hex2bin($plainText), 'aes-128-cbc', $key, OPENSSL_RAW_DATA);

}

有兴趣解决问题,红包答谢

以下是问题补充:

@C哩C哩:问题已解决,结帖 (2018/01/15 17:28)
加载中
0
fkkeee
fkkeee
PHP里最后一个参数是iv,不是key。要从输入带进来
C哩C哩
C哩C哩
PHP7代码修改之后可以解密Java加密,目前超长字符PHP7这边会直接返回false
0
我是特种兵
我是特种兵
问题代码不看了,我遇到的一个问题就是密文被urlencode了
C哩C哩
C哩C哩
从JAVA边加密代码看是没有encode,PHP7这边不需要decode操作
0
东君
东君

之前有遇到过类似的问题,貌似是空白填充算法不一致导致的,可以查一下PHP的AES默认的空白填充方法

东君
东君
回复 @C哩C哩 : 字符集的问题吗?
C哩C哩
C哩C哩
回复 @东君 : 有中文字符的解析就失败了,没有的可以正常解密
东君
东君
回复 @C哩C哩 : 现在是什么,带了中文就解不了了吗?
C哩C哩
C哩C哩
回复 @东君 : Java中加密解密没有设置IV偏移,上面的PHP7代码是可以解析正常非中文字符的
东君
东君
回复 @C哩C哩 : 另外好像没看到你设置IV值
下一页
0
bjgxjob
bjgxjob

Java加密或解密时,请指定Cipher为:AES/CBC/PKCS5Padding, 同时设置好IV;

也可以在Java与PHP共同使用AEC/ECB/PKCS5Padding。

0
C哩C哩
C哩C哩

PHP降低版本到7.0,在网上找了段代码,可运行,具体情况不清楚,先凑合用

返回顶部
顶部