java加密aes值与javascript加密值不匹配

时间:2017-08-02 13:34:16

标签: javascript java encryption aes cryptojs

我有java代码为我生成aes加密代码现在我试图在javascript上使用crypto-js但两个代码提供不同的密钥我不知道为什么以及如何获得相同的密钥在这里是我的代码

public static String encrypt(String text, byte[] iv, byte[] key)throws Exception{ 

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
    System.out.println("KEY SPECCCC: "+keySpec); 
    IvParameterSpec ivSpec = new IvParameterSpec(iv); 
    cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec); 
    byte [] results = cipher.doFinal(text.getBytes("UTF-8")); 
    BASE64Encoder encoder = new BASE64Encoder(); 
    return encoder.encode(results); 
} 

JavaScript代码

  require(["crypto-js/core", "crypto-js/aes"], function (CryptoJS, AES) {
        ciphertext = CryptoJS.AES.encrypt(JSON.stringify(jsondata),
                        arr.toString(),arr.toString());
  });

字符串到utf-8

var utf8 = unescape(encodeURIComponent(key));
var arr = [];
for (var i = 0; i < utf8.length; i++) {
    arr.push(utf8.charCodeAt(i));
}

2 个答案:

答案 0 :(得分:1)

首先,即使你的代码工作正常,你仍然无法正常解密,因为当你用Java创建AES密码时,你正在使用CBC密码而你正在实现PKC5Padding的Padding算法。 所以你的java代码做了以下几点; 当它获得输入时,它首先将其划分为16位块,然后如果您的输入没有划分为16位整体,那么提醒将被填充以填充具有相同数量的提醒的块。您可以通过以下方式看到我的意思图片。

enter image description here

因此,它将使用java方面的填充密码进行加密,但是在Javascript部分中,您既不会声明模式Aes将使用哪种类型,也不会声明它假设要执行的填充类型。因此,您应该将这些值添加到您的代码中。您可以在代码部分之后进行搜索。

                        mode:CryptoJS.mode.CBC,
                        padding: CryptoJS.pad.Pkcs7

关于它正在发生的不同密钥,因为您正在向您的加密方法发送字节[],然后在创建密钥时使用此未知字节[]。您没有提及为什么您的加密方法将用于您的程序,但你应该在两个方法中创建“Byte []键”相同的方式。例如,你可以参考下面的代码作为生成它的一个例子,但它不是安全的生成键的方式我只是添加它来显示你我意思是你应该以相同的方式生成两个键。

    //DONT USE THIS IMPLEMENTATION SINCE IT IS NOT SAFE!
    byte[] key = (username + password).getBytes("UTF-8");

答案 1 :(得分:0)

Java代码生成加密字符串,JavaScript也生成相同的加密字符串,以下代码有效!

 var IVstring = CryptoJS.lib.ByteArray(your IV bytearray).toString(CryptoJS.enc.Base64);
 var keystring = CryptoJS.lib.ByteArray(your KEY bytearray).toString(CryptoJS.enc.Base64);
 var text = 'texttobeencrypted';
 var key = CryptoJS.enc.Base64.parse(keystring);
 var iv  = CryptoJS.enc.Base64.parse(IVstring);
 var encrypted = CryptoJS.AES.encrypt(text, key, {iv: iv});
 console.log(encrypted.toString());

脚本链接: 添加CryptJS,AES和 https://greasyfork.org/scripts/6696-cryptojs-lib-bytearray/code/CryptoJSlibByteArray.js