2014-10-20 158 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" 
相關問題