用Java解密PHP AES-256-CFB

时间:2018-08-18 22:03:26

标签: java php encryption aes

我创建了一个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中的哈希函数相同。问题在于密码的结果完全不同,我看不出是错误。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

经过几次测试,Java似乎使用了 AES-128 而不是 AES-256
如果我修改了PHP代码的这一部分。

private const METHOD = 'AES-256-CFB';

对此

private const METHOD = 'AES-128-CFB';

Java和PHP现在返回相同的结果。
希望对您有帮助