Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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多线程异常_Java_Multithreading_Cryptography_Aes - Fatal编程技术网

AES Java多线程异常

AES Java多线程异常,java,multithreading,cryptography,aes,Java,Multithreading,Cryptography,Aes,我注意到我正在运行的一个应用程序在同步解密时抛出异常。我编写了以下内容来测试这一点: public void run() { for(int i=0; i<100000; i++){ String encrypted = Crypt.encrypt( "Lorem ipsum dolor sit amet.", "password" ); String decrypte

我注意到我正在运行的一个应用程序在同步解密时抛出异常。我编写了以下内容来测试这一点:

public void run() {
    for(int i=0; i<100000; i++){
        String encrypted = Crypt.encrypt(
                "Lorem ipsum dolor sit amet.",
                "password"
        );

        String decrypted = Crypt.decrypt(encrypted, "password")[0];
        System.out.println(decrypted);
    }
}


public static void main(String[] args) {

    Thread t1 = new Thread(new Main());
    Thread t2 = new Thread(new Main());

    t1.start();
    t2.start();

}
果然,两个线程上的第一次尝试都失败了:

javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at common.Crypt.decrypt(Crypt.java:122)
at bootstrap.Main.run(Main.java:427)
at java.lang.Thread.run(Thread.java:680)
每个线程上大约有20次尝试成功(可能是在不安全调用不相交的地方),然后抛出异常。这种模式似乎还在继续

如果有帮助的话,我正在OSX10.7.2上运行这个

如果我理解正确,这可能只是一个供应商的问题,因为它使用的是Sun JDK,我可以很容易地将其替换掉,但我认为最好在这方面获得一些更有经验的意见,并提出它,以防有人遇到同样的问题

如果有人能为我指出一个线程安全的加密+解密方案的方向,它能达到同样的效果,我将非常感激

谢谢,
Marcus

该问题是由用于从密码生成密钥的此行引起的

byte[] keybytes = md5(key);

使用MessageDigest类的md5函数很容易返回垃圾,然后垃圾被送入解密过程,最终导致解密失败。

该问题是由用于从密码生成密钥的这一行引起的

byte[] keybytes = md5(key);

使用MessageDigest类的md5函数很容易返回垃圾,然后垃圾被送入解密过程,最终导致解密失败。

您有一个错误(尽管不相关):
新字符串(输出)
应该是
新字符串(输出,“UTF-8”)
。我不会在我的Windows 7设备JDK 1.6.026上复制它,md5只执行commons编解码器中的key.getBytes(“UTF-8”)和Base64。可能问题来自您的md5或Base64实现,您没有提到这一点。(我使用“passwordpassword”作为密钥)我的Crypt类中的javax.crypto.Cipher.doFinal行引发了异常。这肯定是一个比我的代码级别更低的问题。如果我使用encrypt()插入有效的加密字符串,而不是使用随机IV创建一个字符串(这可能就是问题所在)这个问题仍然时断时续地出现,排除了恶意Base64字符串或md5问题的可能性。我尝试在我的Ubuntu机器上运行这个问题,但同样的问题发生了。结果是我的md5()方法随机中断,这导致了错误。感谢您指出问题可能一直存在。Dupe of??不完全正确。该问题的问题是在线程之间使用单个实例,我在每个线程中使用一个实例。但对于那些发现此问题的人来说,值得注意。谢谢。您有一个bug(尽管与此无关):
新字符串(输出)
应该是
新字符串(输出,“UTF-8”)
。我不会在我的Windows 7设备JDK 1.6.026上复制它,md5只做key.getBytes(“UTF-8”)和commons codec中的Base64。可能问题来自您的md5或Base64实现,您没有提到。(我使用“passwordpassword”作为密钥)异常是由我的Crypt类中的javax.crypto.Cipher.doFinal行引发的。这肯定是一个比我的代码级别更低的问题。如果我使用encrypt()插入有效的加密字符串,而不是使用随机IV创建一个字符串(这可能就是问题所在)这个问题仍然时断时续地出现,排除了恶意Base64字符串或md5问题的可能性。我尝试在我的Ubuntu机器上运行这个问题,但同样的问题发生了。结果是我的md5()方法随机中断,这导致了错误。感谢您指出问题可能一直存在。Dupe of??不完全正确。该问题的问题是在线程之间使用单个实例,我在每个线程中使用一个实例。但对于那些发现此问题的人来说,值得注意。谢谢。如何更改p添加将影响稳定性?该问题最终导致我使用的MD5函数出现故障。更改填充将如何影响稳定性?该问题最终导致我使用的MD5函数出现故障。
byte[] keybytes = md5(key);