Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AES加密java和javascript的不同输出_Java_Javascript_Encryption_Aes_Cryptojs - Fatal编程技术网

AES加密java和javascript的不同输出

AES加密java和javascript的不同输出,java,javascript,encryption,aes,cryptojs,Java,Javascript,Encryption,Aes,Cryptojs,几天以来,我一直试图弄清楚为什么我在javascript(cryptojs)和java中有不同的加密输出。我已经走到了死胡同,不知道要改变什么,我想我会为此失去理智的。这是完整的代码,应该很容易复制粘贴测试。你是我最后的希望^^ plainText = plaintext password = password salt = 3FF2EC019C627B945225DEBAD71A01B6985FE84C95A70EB132882F88C0A59A55 iv = 3C46C00F42A6044A

几天以来,我一直试图弄清楚为什么我在javascript(cryptojs)和java中有不同的加密输出。我已经走到了死胡同,不知道要改变什么,我想我会为此失去理智的。这是完整的代码,应该很容易复制粘贴测试。你是我最后的希望^^

plainText = plaintext
password = password
salt = 3FF2EC019C627B945225DEBAD71A01B6985FE84C95A70EB132882F88C0A59A55
iv = 3C46C00F42A6044A"
Javascript结果=zbohHpV5RtmHiH3cKDY15w==

Java结果=wVdRQiIqkyVlttkWpCMSpQ==

Javascript-html:更新并将迭代次数更改为10次

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Aes Test</title>
        <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script>
        <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
    </head>
    <body>
        <div id="result"></div>
    </body>
    <script>


var password = "password";
var salt = "3FF2EC019C627B945225DEBAD71A01B6985FE84C95A70EB132882F88C0A59A55";

var plainText = "plaintext";
var iv = "3C46C00F42A6044A";

var key = CryptoJS.PBKDF2(password, CryptoJS.enc.Hex.parse(salt), {keySize: 128/32, iterations: 10});

var a = CryptoJS.AES.encrypt(plainText, key, {iv: CryptoJS.enc.Hex.parse(iv)}).ciphertext.toString(CryptoJS.enc.Base64);


var result = "encypted: " + a + "<br \>";
document.getElementById("result").innerHTML = result;
    </script>
</html>
javaaes.class

public class main {

    public static void main(String[] args) throws Exception {
        String result = Aes.encrypt("plaintext", "password", "3FF2EC019C627B945225DEBAD71A01B6985FE84C95A70EB132882F88C0A59A55", "3C46C00F42A6044A");
        System.out.println(result);    
    }  
}
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

public class Aes { 
    private static final int pswdIterations = 10;
    private static final int keySize =  128;

    public static String encrypt(String plainText, String password, String salt, String initializationVector) throws NoSuchAlgorithmException, InvalidKeySpecException, UnsupportedEncodingException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
        byte[] saltBytes = salt.getBytes("UTF-8");
        byte[] ivBytes = initializationVector.getBytes("UTF-8");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        KeySpec spec = new PBEKeySpec(password.toCharArray(), saltBytes, pswdIterations, keySize);
        SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(ivBytes));
        byte[] encryptedTextBytes = cipher.doFinal(plainText.getBytes());
        return new Base64().encodeAsString(encryptedTextBytes);
    } 
}
public class main {

public static void main(String[] args) throws Exception {
    String result = Aes.encrypt("plaintext", "password", "3FF2EC019C627B945225DEBAD71A01B6985FE84C95A70EB132882F88C0A59A55", "12345678901234567890123456789012");
    System.out.println(result);    
}  
}
public class Aes { 
private static final int pswdIterations = 10;
private static final int keySize =  128;

public static String encrypt(String plainText, String password, String salt, String initializationVector) throws NoSuchAlgorithmException, NoSuchPaddingException, DecoderException, InvalidKeySpecException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException  {
             Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
             SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
             KeySpec spec = new PBEKeySpec(password.toCharArray(), Hex.decodeHex(salt.toCharArray()), pswdIterations, keySize);
             SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
             cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(Hex.decodeHex(initializationVector.toCharArray())));
             byte[] encryptedTextBytes = cipher.doFinal(plainText.getBytes());
             return new Base64().encodeAsString(encryptedTextBytes);
} 
}

首先,您的JavaScript代码是错误的。请尝试下面的代码,查看keySize和iterationCount变量是否未定义

Aes.generateKey = function(salt, passPhrase) {
  console.log(this.keySize);
  console.log(this.iterationCount);
  var key = CryptoJS.PBKDF2(
          passPhrase, 
          CryptoJS.enc.Hex.parse(salt),
          { keySize: this.keySize, iterations: this.iterationCount });
  return key;
 }
JavaScript的结果应该是Bttn5HNBIFDQ5hb1IbOFXQ==

var password = "password";
var salt = "3FF2EC019C627B945225DEBAD71A01B6985FE84C95A70EB132882F88C0A59A55";

var plainText = "plaintext";
var iv = "3C46C00F42A6044A";

var key = CryptoJS.PBKDF2(password, CryptoJS.enc.Hex.parse(salt), {keySize: 128/32, iterations: 10000});

var a = CryptoJS.AES.encrypt(plainText, key, {iv: CryptoJS.enc.Hex.parse(iv)}).ciphertext.toString(CryptoJS.enc.Base64);

console.log(a);

最后,多亏帕西马科让我走上了正轨,他们两人都是平等的。我必须改变iv和salt转换为十六进制的方式,以及iv的长度,如上所述,keySize和iterationCount变量也未定义

这是完整的工作代码

它们都应该输出:

百科全书:47S4KEKMEOMOONGFTZYFG==

Javascript

<script>
var password = "password";
var salt = "3FF2EC019C627B945225DEBAD71A01B6985FE84C95A70EB132882F88C0A59A55";

var plainText = "plaintext";
var iv = "12345678901234567890123456789012";

var key = CryptoJS.PBKDF2(password, CryptoJS.enc.Hex.parse(salt), {keySize: 128/32, iterations: 10});

var a = CryptoJS.AES.encrypt(plainText, key, {iv: CryptoJS.enc.Hex.parse(iv)}).ciphertext.toString(CryptoJS.enc.Base64);


var result = "encypted: " + a + "<br \>";
document.getElementById("result").innerHTML = result;
</script>
javaaes.class

public class main {

    public static void main(String[] args) throws Exception {
        String result = Aes.encrypt("plaintext", "password", "3FF2EC019C627B945225DEBAD71A01B6985FE84C95A70EB132882F88C0A59A55", "3C46C00F42A6044A");
        System.out.println(result);    
    }  
}
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

public class Aes { 
    private static final int pswdIterations = 10;
    private static final int keySize =  128;

    public static String encrypt(String plainText, String password, String salt, String initializationVector) throws NoSuchAlgorithmException, InvalidKeySpecException, UnsupportedEncodingException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
        byte[] saltBytes = salt.getBytes("UTF-8");
        byte[] ivBytes = initializationVector.getBytes("UTF-8");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        KeySpec spec = new PBEKeySpec(password.toCharArray(), saltBytes, pswdIterations, keySize);
        SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(ivBytes));
        byte[] encryptedTextBytes = cipher.doFinal(plainText.getBytes());
        return new Base64().encodeAsString(encryptedTextBytes);
    } 
}
public class main {

public static void main(String[] args) throws Exception {
    String result = Aes.encrypt("plaintext", "password", "3FF2EC019C627B945225DEBAD71A01B6985FE84C95A70EB132882F88C0A59A55", "12345678901234567890123456789012");
    System.out.println(result);    
}  
}
public class Aes { 
private static final int pswdIterations = 10;
private static final int keySize =  128;

public static String encrypt(String plainText, String password, String salt, String initializationVector) throws NoSuchAlgorithmException, NoSuchPaddingException, DecoderException, InvalidKeySpecException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException  {
             Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
             SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
             KeySpec spec = new PBEKeySpec(password.toCharArray(), Hex.decodeHex(salt.toCharArray()), pswdIterations, keySize);
             SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
             cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(Hex.decodeHex(initializationVector.toCharArray())));
             byte[] encryptedTextBytes = cipher.doFinal(plainText.getBytes());
             return new Base64().encodeAsString(encryptedTextBytes);
} 
}

这在java中是如何执行的?AES/CBC/PKCS5Padding仅支持128个密钥大小长度。你应该得到非法的密钥大小exception@Anupam:这些是支撑尺寸所需的。另外,如果你安装了无限制的加密权限文件,可以使用更大的密钥大小。我确实禁用了限制,但如果你想帮助,可以将其设置为128位,在这种情况下并不重要。javascript中的标准填充是否不是AES/CBC/PKCS7,而是等同于java AES/CBC/PKCS5填充?@wook。我只是想确定一下,因为你没有提到这件事。如果您已经更新了JCEPolicy,那么问题可以缩小到填充。PKSC7和PKCS5的块大小不同。PKCS5的块大小为8字节,PKSC7的块大小可以为1-255字节。我不知道如何指定块大小。@是的,没错,我在上面的代码中将它改为128位。在javascript代码中,它将iv和salt转换为十六进制。在java中,它正在转换为字节,我能够将salt转换为十六进制,但不能转换为iv(给我一些z索引错误)。结果=>加密仍然是不同的结果:(.不知道可能是哪里出了错?谢谢你澄清了这一点。但是javascript输出仍然与java输出不匹配。Cryptojs正在将salt和iv转换为十六进制,而在java im中转换为字节。我能够将salt转换为十六进制,但不是iv,没有错误。可能是这里的错误?如何转换字符串(使用十六进制值)到Java中的字节数组?您是否使用了类似于此的内容:是的,类似于此内容。也尝试了链接中的方法,只是再次获得了一个新的不同加密密文。但与javascript Java不匹配:(尽管如此,当您使用.getBytes(“UTF-8”)时)在表示十六进制值的字符串上,您会得到一个UTF8字符数组,而不是本例中实际需要的数字。您应该首先更正该错误,然后尝试找到iv错误的解决方案。。。