2014-10-20 124 views
0

使用javax.crypto.xxx,Java中这个JS代码的等效代码是什么?如何在使用JS加密技术加密的Java字符串中解密

encryptString : function encryptString(str, password) { 
     var cipher = crypto.createCipher("aes128", password); 
     return cipher.update(str, "binary", "base64") + 
      cipher.final("base64"); 
    }, 

    decryptString : function decryptString(str, password) { 
     var desipher = crypto.createDecipher("aes128", password); 
     return desipher.update(str, "base64", "binary") + 
      desipher.final("binary"); 
    } 

我将在JS中编码以解码Java,反之亦然。 'str'和'password'变量都是字符串,'password'长度为16个字符。

看起来像这样createCipher(算法,密码)方法使用一些方法来生成原始密钥和IV,这并不是全部的标准。我认为使用createCipheriv(算法,键,四)将是一个更便携的方法。 更多这里:http://nodejs.org/api/crypto.html#crypto_crypto_createcipheriv_algorithm_key_iv 我会尽快更新最新信息。

+0

有很多关于展示如何使用AES128解密网的例子 - 你发现了什么? – 2014-10-20 08:25:54

+0

我已经看过http://www.androidsnippets.com/encryptdecrypt-strings,但是我通过创建原始密钥而感到困惑。 – n0rm1e 2014-10-20 08:58:12

+0

那么你的问题是否真的减少为“如何在JavaScript和Java中创建相同的密钥”?在你的问题中更明确地说明这一点可能会有帮助。 – apsillers 2014-10-21 11:44:19

回答

0

这是分别使用Crypto和javax.crypto在JS和Java中加密/解密的方法。

如果你不关心不同环境的互操作性,你可以在你的JS代码中使用createCypher(algorithm, password)很快入门,但它不是很便携,因为你不知道原始密钥和初始化矢量是如何从密码。

改变JS代码使用createCipheriv(algorithm, key, iv)相反,会给你一个便携式加密/解密:

encryptString : function encryptString(str, encryptionKey, iv) { 
     var cipher = crypto.createCipheriv('aes-128-cbc', encryptionKey, iv); 
     var cipherText = cipher.update(str, 'binary', 'base64'); 
     var cipherTextRemaining = cipher.final('base64'); 
     return cipherText + cipherTextRemaining; 
    }, 

    decryptString : function decryptString(str, encryptionKey, iv) { 
     var desipher = crypto.createDecipheriv('aes-128-cbc', encryptionKey, iv); 
     var desipherText = desipher.update(str, 'base64', 'binary'); 
     var desipherTextRemaining = desipher.final('binary'); 
     return desipherText + desipherTextRemaining; 
    }, 

这相当于Java代码做同样的事情:

public static String encryptString(String clearText, byte[] key, byte[] initialVector) throws Exception 
{ 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    SecretKeySpec secretKeySpecy = new SecretKeySpec(key, "AES"); 
    IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpecy, ivParameterSpec); 
    byte[] encrypted = cipher.doFinal(clearText.getBytes()); 
    return new String(Base64.encodeBase64(encrypted, false)); 
} 

public static String decryptString(String cipherText, byte[] key, byte[] initialVector) throws Exception 
{ 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    SecretKeySpec secretKeySpecy = new SecretKeySpec(key, "AES"); 
    IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector); 
    cipher.init(Cipher.DECRYPT_MODE, secretKeySpecy, ivParameterSpec); 
    return new String(cipher.doFinal(Base64.decodeBase64(cipherText))); 
} 
0

我们有类似的问题。所以我们想要的是加密Java端的凭证代码并将其发送到前端。需要加密以确保代金券代码的安全。

现在在前端,第三方java脚本库需要这个凭证代码,以便它能够通过解密来获取实际的凭证代码。

所以这是我们所做的

在Java方面

import javax.xml.bind.DatatypeConverter; 

    public class Controller{ 

    @RequestMapping("voucherCode") 
    public String getVoucherCode{ 
     String voucherCode = voucherService.getVoucherCode() 
      return DatatypeConverter.printBase64Binary(voucherCode.getBytes("UTF-8")) 

} 
    } 

因此,如果我们有优惠券代码为50%OFF那么上面的代码将发送NTAlT0ZG为50%OFF编码值。

现在,我们已经在前端的编码值。 在JavaScript中,我们可以通过使用

window.atob("NTAlT0ZG") // this will return 50%OFF 

所以这样我们就可以在手enncryption /解密手Java和Java脚本之间得到原始值。

窗口对象提供了两种方法进行加密和解密

window.btoa("50%OFF") // returns NTAlT0ZG 
    window.atob("NTAlT0ZG") // return original value as "50%OFF" 
相关问题