使用CryptoJS加密的JAVA解密AES / CBC / PKCS5Padding

时间:2018-11-21 09:27:21

标签: javascript java aes cryptojs

作为stackoverflow,我已经实现了JAVA AES加密和Javascript AES解密,但是无法将JAvascript AES加密实现为JAVA AES解密。请检查以下代码以获取更多信息。

Java后端代码示例代码:

 public static String encryptAES(String data, String secretKey) {
        try {
            byte[] secretKeys = Hashing.sha1().hashString(secretKey, Charsets.UTF_8)
                    .toString().substring(0, 16)
                    .getBytes(Charsets.UTF_8);

            final SecretKey secret = new SecretKeySpec(secretKeys, "AES");

            final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secret);

            final AlgorithmParameters params = cipher.getParameters();

            final byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
            final byte[] cipherText = cipher.doFinal(data.getBytes(Charsets.UTF_8));

            return DatatypeConverter.printHexBinary(iv) + DatatypeConverter.printHexBinary(cipherText);
        } catch (Exception e) {
            throw Throwables.propagate(e);
        }
    }


    public static String decryptAES(String data, String secretKey) {
        try {
            byte[] secretKeys = Hashing.sha1().hashString(secretKey, Charsets.UTF_8)
                    .toString().substring(0, 16)
                    .getBytes(Charsets.UTF_8);

            // grab first 16 bytes - that's the IV
            String hexedIv = data.substring(0, 32);

            // grab everything else - that's the cipher-text (encrypted message)
            String hexedCipherText = data.substring(32);

            byte[] iv = DatatypeConverter.parseHexBinary(hexedIv);
            byte[] cipherText = DatatypeConverter.parseHexBinary(hexedCipherText);

            final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKeys, "AES"), new IvParameterSpec(iv));

            return new String(cipher.doFinal(cipherText), Charsets.UTF_8);
        } catch (BadPaddingException e) {
            throw new IllegalArgumentException("Secret key is invalid");
        }catch (Exception e) {
            throw Throwables.propagate(e);
        }
    }

有效的解密代码

var str = 'CB5E759CE5FEAFEFCC9BABBFD84DC80C0291ED4917CF1402FF03B8E12716E44C';

console.log("Result: " + CryptoJS.AES.decrypt({
    ciphertext: CryptoJS.enc.Hex.parse(str.substring(32))
}, CryptoJS.enc.Utf8.parse(CryptoJS.SHA1("test").toString().substring(0,16)),  
{
  iv: CryptoJS.enc.Hex.parse(str.substring(0,32)),
}).toString(CryptoJS.enc.Utf8))
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/sha1.js"></script>
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script>

如何将Javascript AES加密实现为Java AES解密代码。请给我提供意见,说明如何解决这个问题。

0 个答案:

没有答案