JAVA和PHP AES加密之间的区别

费德里科·加西亚(Federico Garcia)

我需要在JAVA应用程序和PHP网站之间交换加密的数据。这是用于加密数据的代码:

private static SecretKeySpec createKeyFromString(String plainKey) {

    MessageDigest sha = null;
    byte[] key;
    SecretKeySpec secretKey = null;

    try {

        key = plainKey.getBytes("UTF-8");
        sha = MessageDigest.getInstance("SHA-1");
        key = sha.digest(key);
        key = Arrays.copyOf(key, 16);

        secretKey = new SecretKeySpec(key, "AES");

    } catch(NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch(UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return secretKey;

}

private static String AESCrypt(String password, SecretKeySpec secretKey) {
    try {

        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        return Base64.getEncoder().encodeToString(cipher.doFinal(password.getBytes("UTF-8")));

    } catch (Exception e) {
        System.out.println(e.toString());
    }
    return null;
}


public static void main(String[] args) {

    System.out.println(Pay.AESCrypt("password", Pay.createKeyFromString("key")));

}

该程序的输出为:

aRtcSG0H5u9v7xVYClnYIw==

我正在尝试使用以下代码在PHP中复制此行为:

function createKeyFromString($key) {
    return substr(hash('sha1', $key), 0, 16);
}

echo openssl_encrypt("password", "AES-128-ECB", createKeyFromString("key"));

但是我得到以下输出:

pE3cPGDFjM9vwWZ3EO8xDg==

我有点迷茫,为什么我要得到一个不同的密文字符串。我尝试使用此功能填充数据以在PHP中加密:

function pkcs5_pad($text) {
    $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
    $pad = $size - (strlen($text) % $size);
    return $text . str_repeat(chr($pad), $pad);
}

echo openssl_encrypt(pkcs5_pad("password"), "AES-128-ECB", createKeyFromString("key"));

但这仍然行不通。

费德里科·加西亚(Federico Garcia)

我在PHP的哈希函数中缺少第三个参数来获取原始输出而不是HEX版本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章