Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
Java Encryption:Java Encryption:javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是8的倍数_Java_Base64_Encryption - Fatal编程技术网

Java Encryption:Java Encryption:javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是8的倍数

Java Encryption:Java Encryption:javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是8的倍数,java,base64,encryption,Java,Base64,Encryption,我有一个JavaHTTP服务器,它从Java客户端接收消息 服务器和客户端使用相同的加密程序类: public class Encrypter { private Cipher cipher; //The encryption cipher object public static final String ALGORITHM = "Blowfish"; //Encryption Algorithm /** * Constructor */ pub

我有一个JavaHTTP服务器,它从Java客户端接收消息

服务器和客户端使用相同的加密程序类:

public class Encrypter {

    private Cipher cipher; //The encryption cipher object
public static final String ALGORITHM = "Blowfish"; //Encryption Algorithm

    /**
     * Constructor
     */
    public Encrypter()
    {       
        try {
            initlizeCipher();
        } catch (Throwable e) {     
            ServerSettings.LOG.logError(e);
            e.printStackTrace();

        }
    }

    /**
     * Initialize the Cipher object
     * @throws NoSuchAlgorithmException
     * @throws NoSuchPaddingException
     */
    private void initlizeCipher() throws NoSuchAlgorithmException, NoSuchPaddingException
    {       
        cipher = Cipher.getInstance(ServerSettings.ALGORITHM);
    }

    /**
     * Encrypt a String
     * @param string String to encrypt
     * @return an encrypted String
     * @throws InvalidKeyException
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     * @throws UnsupportedEncodingException
     */
    public synchronized String encrypt(String string) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException
    {
        cipher.init(Cipher.ENCRYPT_MODE, ServerSettings.SECRECT_KEY_SPEC);
        byte[] stringBytes = string.getBytes("UTF-8");
        byte[] encryptedBytes = cipher.doFinal(stringBytes);
        return Base64.encodeBytes(encryptedBytes);      
    }

    /**
     * Decrypt a String
     * @param string String to decrypt
     * @return a decrypted String
     * @throws InvalidKeyException
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     * @throws IOException
     */
    public synchronized String decrypt(String string) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException
    {       
        cipher.init(Cipher.DECRYPT_MODE, ServerSettings.SECRECT_KEY_SPEC);
        byte[] decryptedBytes = Base64.decode(string.getBytes());       
        byte[] encryptedBytes = cipher.doFinal(decryptedBytes);
        return new String(encryptedBytes,"UTF-8");
    }   
}
当发送的变量为:
m=encryptedMessage时,我通过POST方法向服务器发送消息。

出于某种原因,我总是得到

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
我无法解密服务器端收到的消息

我一开始以为可能是信息被破坏了,但事实并非如此

有什么想法吗

更新1:

奇怪的是,发送给服务器的一些消息被正确解密,而一些消息返回错误。 好消息:

zuhRpmbtH0xSmv6cnBFkAxaGFmRbDP/97LwF4bcDyhANCTLb4afBzFpP3GI1pGFLok03GRQVCwi81Hsp                                             bCpGtuoIVY9cqWYDzNFgOCx5w2sboR2Qx6oxtTSIFIzj1XadQdk9V8lCxcCVVYEH8vA3tph63wU6qJOo                                             OyROz0OJauLBEiWbn5OUQxJ7Yz9Qc1wzl8z7UQb71v4pswF69c1CM/LWWmAzBDCjlRQ5YIB9wN8mBgoC                                             t8Ngt38XkCg/yRHh0EpXYQfrgP6Ls5I8/FY8BQorMy/le5y2
cjj7yzW v3NDtbIJXurrrf318DcY PBk2inzSfz qoIaTKns2tWvR7ftOKK30XY VAlXDrQlyTLatgKA                                             S4IkAIK3lXQKNcwPh87CybHrTqD3HWEM3tqkpVWdB7GNmpHYsITTLrWsBvaMeDcXEr/gr9KYSZ0ks0gR                                             z12jHxPiZoSKHdy5nZ4zShHUy/wlkslmjFvA1G8A15nTVBhjBI GWSh54tyBZF113lL pm5eZNkZrqzo                                             RWI2QAjfqNPzCpV0tqd/pEO70vdSLbCYi7V0bVQNW2KpBv3Hj3VOTCP92k62/iQhIY4F VuMo2UTgGWV                                             1fqoelrl/eelAvsZO8YNC5/2KTKw2sDFaTOwW9R12AgeyzOuhkKQQro2Umd0KoiGnYL9AaQ6 T2MBnLK                                             ZyROHh3cvI T9chPlGfmUHbCN2f3pHoF5rb383KpJNjvlnmnwtaEhQYw8TQjj4PLenK24Hpcs4 wO8gu                                             XSrUglFzLIkkwjvsA5AyTHx/jP9AwMSnWjDwco184YQGAePeM8PYy42oMOaw7Pg/3jWFy1uOzFok2LN9                                             RJWv1iyXejh5s9zXoAT3kywICQygK2YTLZNIS1d5lc0H0f15EN6itZhaR0YnslhYGmH1KcNwdMWhBKsf                                             PytWnK0N8AzUVzt4P4mtmGSuaLi2t54J2pv7m7/c6WjTi1/E16rd3QyWkmXrghSshOJNRRwcydlhhTLH                                             drHTEFaXSPZyVFqlaFu4 f5kxiBa6ewglKHe6zbmRyM15Mq3lRj8Ab/RWBd2tgvaEO/vhw
错误消息:

zuhRpmbtH0xSmv6cnBFkAxaGFmRbDP/97LwF4bcDyhANCTLb4afBzFpP3GI1pGFLok03GRQVCwi81Hsp                                             bCpGtuoIVY9cqWYDzNFgOCx5w2sboR2Qx6oxtTSIFIzj1XadQdk9V8lCxcCVVYEH8vA3tph63wU6qJOo                                             OyROz0OJauLBEiWbn5OUQxJ7Yz9Qc1wzl8z7UQb71v4pswF69c1CM/LWWmAzBDCjlRQ5YIB9wN8mBgoC                                             t8Ngt38XkCg/yRHh0EpXYQfrgP6Ls5I8/FY8BQorMy/le5y2
cjj7yzW v3NDtbIJXurrrf318DcY PBk2inzSfz qoIaTKns2tWvR7ftOKK30XY VAlXDrQlyTLatgKA                                             S4IkAIK3lXQKNcwPh87CybHrTqD3HWEM3tqkpVWdB7GNmpHYsITTLrWsBvaMeDcXEr/gr9KYSZ0ks0gR                                             z12jHxPiZoSKHdy5nZ4zShHUy/wlkslmjFvA1G8A15nTVBhjBI GWSh54tyBZF113lL pm5eZNkZrqzo                                             RWI2QAjfqNPzCpV0tqd/pEO70vdSLbCYi7V0bVQNW2KpBv3Hj3VOTCP92k62/iQhIY4F VuMo2UTgGWV                                             1fqoelrl/eelAvsZO8YNC5/2KTKw2sDFaTOwW9R12AgeyzOuhkKQQro2Umd0KoiGnYL9AaQ6 T2MBnLK                                             ZyROHh3cvI T9chPlGfmUHbCN2f3pHoF5rb383KpJNjvlnmnwtaEhQYw8TQjj4PLenK24Hpcs4 wO8gu                                             XSrUglFzLIkkwjvsA5AyTHx/jP9AwMSnWjDwco184YQGAePeM8PYy42oMOaw7Pg/3jWFy1uOzFok2LN9                                             RJWv1iyXejh5s9zXoAT3kywICQygK2YTLZNIS1d5lc0H0f15EN6itZhaR0YnslhYGmH1KcNwdMWhBKsf                                             PytWnK0N8AzUVzt4P4mtmGSuaLi2t54J2pv7m7/c6WjTi1/E16rd3QyWkmXrghSshOJNRRwcydlhhTLH                                             drHTEFaXSPZyVFqlaFu4 f5kxiBa6ewglKHe6zbmRyM15Mq3lRj8Ab/RWBd2tgvaEO/vhw
这两条消息以相同的方式发送并打印到System.Out进行测试。 正如你所看到的,由于某种原因,坏消息有空格,而好消息没有空格,这可能会导致阻塞错误消息。。 你知道怎么解决吗

更新2:

在深入研究我的代码之后,我发现我的问题出在解析POST方法参数的函数内部。我不能说我是编码方面的专家,但是在传递Base64编码抛出POST-URLEcoding时存在一些问题

这是我的解析代码,在获得URLDecode后,它将转到我的加密程序进行解密:

私有void parseQuery(字符串查询、HashMap参数)引发UnsupportedEncodingException{

 if (query != null) {
     String pairs[] = query.split("[&]");

     for (String pair : pairs) 
     {
         String param[] = pair.split("[=]");
         String key = null;
         String value = null;
         if (param.length > 0) 
             key = URLDecoder.decode(param[0], "UTF-8");//System.getProperty("file.encoding"));                 

         if (param.length > 1) 
             value = URLDecoder.decode(param[1], "UTF-8");//System.getProperty("file.encoding"));                 

         if (parameters.containsKey(key)) 
         {
             Object obj = parameters.get(key);
             if(obj instanceof List<?>)
             {
                 @SuppressWarnings("unchecked")
                 List<String> values = (List<String>)obj;
                 values.add(value);
             } 
             else if(obj instanceof String) 
             {
                 List<String> values = new ArrayList<String>();
                 values.add((String)obj);
                 values.add(value);
                 parameters.put(key, values);
             }
         } 
         else 
           parameters.put(key, value);                 
     }
 }
if(查询!=null){
字符串对[]=query.split(“[&]”);
for(字符串对:对)
{
字符串参数[]=pair.split([=]);
字符串键=null;
字符串值=null;
如果(参数长度>0)
key=urldecker.decode(参数[0],“UTF-8”);//System.getProperty(“file.encoding”);
如果(参数长度>1)
value=urldecker.decode(参数[1],“UTF-8”);//System.getProperty(“file.encoding”);
if(参数containsKey(键))
{
Object obj=parameters.get(key);
if(obj实例列表)
{
@抑制警告(“未选中”)
列表值=(列表)对象;
增加(价值);
} 
else if(字符串的obj实例)
{
列表值=新的ArrayList();
添加((字符串)obj);
增加(价值);
参数。put(键、值);
}
} 
其他的
参数。put(键、值);
}
}
}


有什么想法吗?

我昨天遇到了类似的问题。我通过在客户端将字节编码为base64并在服务器端使用之前对其进行解码来解决这个问题

请参阅此链接-[密码]:

所以基本上这就是你需要做的-

在客户端

  • 从字符串中获取字节数组
  • 加密它
  • 使用base64编码对字节数组进行编码
在服务器端

  • 对base64编码数据进行解码以获得字节数组
  • 解密字节数组
  • 使用此字节数组构造字符串

经过大量测试和哭泣:),我发现了我从一开始就怀疑的东西

当通过URL传递数据(POST\GET WHERT)时,您必须首先在发送数据之前在客户端对其进行URL编码,然后在处理数据之前在服务器端对其进行URL解码

由于Java的强大功能和一流的性能,您可以轻松地做到这一点:

//在发送之前,为URL编码数据-客户端 encode(您的_数据、字符集_名称)//字符集名称-建议使用“UTF-8”

//在接收到数据后-为进程-服务器端解码数据
解码(你的数据,字符集名称)//charset_name-建议使用“UTF-8”缩小备选方案的范围,从Oracle/Sun下载和无限强度JCE策略jar,并将其放在JVM下。根据我在java加密方面的经验,加密时90%的问题都来自于JVM/JDK附带了一个强大但有限的策略,每当您尝试使用and和252k或更多算法时,JVM就会抛出一些奇怪的错误

什么是
ServerSettings.ALGORITHM
?将其实际值添加到您的问题中。不过,即兴说来,看起来您使用的是分组密码而不是流密码。算法是空的。您可以包含完整的算法字符串吗?基本上转储
ServerSettings.ALGORITHM
的值,并将其包含在您的问题中。当然,完成了。。。一开始就加上了你从来没有说过,但是encryptedBytes的大小真的是8的倍数吗?也许您在解码或传输应用程序库的另一层中丢失了某些内容以获取详细答案,但您是否阅读了我的代码?我就是这么做的。。