我创建了一个Helper函数,用于使用PHP中的 OpenSSL 加密数据。
private const METHOD = 'AES-256-CFB';
private const KEY = 'g5(Mt2-2x=wsS8^K';
public static function encrypt($data) {
$crypted = openssl_encrypt($data, self::METHOD, self::KEY, 1, substr(hash('sha256', self::KEY_1), 0, 16));
return base64_encode($crypted);
}
为了解密Java中的 AES-CFB-256 数据,我也创建了一个Helper类。
private String decrypt(String sdata) throws Exception {
String sKey = "g5(Mt2-2x=wsS8^K";
byte[] key = sKey.getBytes();
byte[] iv = Arrays.copyOfRange(hash("SHA-256", key).getBytes(), 0, 16);
byte[] data = Base64.getDecoder().decode(sdata.getBytes());
Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
SecretKey aesSecret = new SecretKeySpec(key, "AES");
IvParameterSpec ivps = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, aesSecret, ivps);
byte[] result = cipher.doFinal(data);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.length; i++) {
sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
}
System.out.println(new String(result, StandardCharsets.UTF_8) + " : " + sb.toString());
return sb.toString();
}
private String hash(String type, byte[] data) throws Exception {
MessageDigest digest = MessageDigest.getInstance(type);
data = digest.digest(data);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.length; i++) {
sb.append(Integer.toString((data[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
我注意到JAVA中的哈希函数可以工作,并且给我的结果与PHP中的哈希函数相同。问题在于密码的结果完全不同,我看不出是错误。
感谢您的帮助
答案 0 :(得分:1)
经过几次测试,Java似乎使用了 AES-128 而不是 AES-256 。
如果我修改了PHP代码的这一部分。
private const METHOD = 'AES-256-CFB';
对此
private const METHOD = 'AES-128-CFB';
Java和PHP现在返回相同的结果。
希望对您有帮助