如何在Java类中解密Triple Des CryptoJS值

时间:2013-10-29 03:21:14

标签: java encryption tripledes cryptojs

我被要求在将其发送到服务器端(java)之前从客户端(web)加密一些文本

所以我尝试将CryptoJS库用于客户端。 我加密它是这样的:

    var key = "aaaaaaaaaaaaaaaaaaaaaaaa";
    var value = "KF169841";
    var encryptedString = CryptoJS.TripleDES.encrypt(value, key);
    console.log(encryptedString.toString());

我得到这样的东西:U2FsdGVkX19eYFFHgYGCr3v9 / skTOKVp0pLWRNK9JTg = 我在其他Decrypt tool online(也使用CryptoJS)中使用此encryptedString和key并获得准确值KF169841。

将此值和密钥发送到服务器(好的密钥不是直接发送到服务器但是为了进行测试,它是),我需要使用Java解密它。 但我完全不知道如何解密它。我尝试了谷歌搜索的一些代码,但是如果使用DESese或者如果我使用ECB / NoPadding会得到错误的值,它会导致填充错误。 我确实试过像为CryptoJS那样设置sfg,如:

    mode: CryptoJS.mode.EBC,
    padding: CryptoJS.pad.NoPadding

但他们得到了javascript异常(a未定义)

所以有任何使用CryptoJS的经验可以帮助我使用java解密这个吗?

=============================================== ==============

更新:对不起,我的服务器端代码我正在使用

/**
     * Method To Decrypt An Ecrypted String
     */
    public String decrypt(String encryptedString, String myEncryptionKey) {
        String decryptedText = null;
        try {
            byte[] keyAsBytes = myEncryptionKey.getBytes("UTF8");
            KeySpec myKeySpec = new DESedeKeySpec(keyAsBytes);
            SecretKeyFactory mySecretKeyFactory = 
                    SecretKeyFactory.getInstance("DESede");
            Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");
            SecretKey key = mySecretKeyFactory.generateSecret(myKeySpec);

            cipher.init(Cipher.DECRYPT_MODE, key);
//            BASE64Decoder base64decoder = new BASE64Decoder();
//            byte[] encryptedText = base64decoder.decodeBuffer(encryptedString);

            byte[] encryptedText =  org.apache.commons.codec.binary.Base64.decodeBase64(encryptedString);
            byte[] plainText = cipher.doFinal(encryptedText);
            decryptedText= bytes2String(plainText);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return decryptedText;
    }

1 个答案:

答案 0 :(得分:0)

根据the documentation,您的encryptedString变量包含必须拆分以发送到Java代码的结构化数据。您需要将encryptedString.ivencryptedString.ciphertext发送到Java代码。如果您继续使用密码(请参阅下文),则还需要发送encryptedString.salt

如果您将密钥作为字符串传递,它将被解释为密码,并且将从中派生密钥。如果您确实想传递明确的密钥,请按照documentation并按照下面的代码段建议指定IV和密钥。如果您坚持提供密码,那么您必须找出派生方案并在Java代码中使用相同的过程。

// Code snippet from http://code.google.com/p/crypto-js/#Custom_Key_and_IV
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script>
    var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
    var iv  = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');

    var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });
</script>

关于你的Java代码,它看起来很好(尽管字符串转换有很多错误的余地)。但是,您可能希望将密钥从十六进制转换为二进制而不是抓取字节:

byte[] keyAsBytes = DatatypeConverter.parseHexBinary(myEncryptionKey);

这假设您更改JavaScript代码以传递文字键值。

您还需要切换到DESede/CBC/PKCS5Padding并将IVParameterSpec对象传递给Cipher.init调用,指定从Java脚本代码发送的IV值。