"
这是一段JAVA加密的代码,现在在转化为PHP7中的OpenSSL解密中,总是返回失败,Google之后,感觉问题出现在IV偏移量上,但是不太清楚具体原因,下面贴上JAVA的加密和PHP解密的方法,希望对对称加密比较熟悉的不惜赐教。
Java加密源码:
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解密代码:
public static function decrypt($plainText, $key){
$password = substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 16);
return openssl_decrypt($plainText, 'AES-128-CBC', $password, OPENSSL_RAW_DATA, $key);
}
"
"
asBin()这个应该是自定义接口吧,可否贴下源码!?
######我看JAVA的代码没有使用iv偏移量
楼主你写错了一个地方喔 openssl_encrypt里的参数
加密:
$key = substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 16); $encRaw = openssl_encrypt($data, 'AES-128-ECB', $key, OPENSSL_RAW_DATA); $encHex = $this->strToHex($encRaw);
return base64_encode($encHex);
解密:
$key = substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 16);
$hex = base64_decode($plainText);
$enByte = $this->hexToStr($hex);
$dec = openssl_decrypt($enByte, 'AES-128-ECB', $key, OPENSSL_RAW_DATA, '');
return $dec;
这样写就没问题了
https://segmentfault.com/q/10... 我的帖子 你可以看看
"
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。