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

标签 java base64 encryption

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

服务器和客户端都使用相同的 Encrypter 类:

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

这两条消息都以相同的方式发送,并打印到 System.Out 进行测试。 正如您所看到的,由于某种原因,坏消息有空格,而好消息则可能不会给出 block 错误消息。 知道如何解决吗?

更新2:

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

这是我的解析代码,在获取 URLDecode 后将转到我的加密器进行解密:

private 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);                 
     }
 }

}

有什么想法吗?

最佳答案

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

请参阅此链接 - [密码]:http://www.velocityreviews.com/forums/t645364-java-string-encryption-decryption.html

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

在客户端

  • 从字符串中获取字节数组
  • 对其进行加密。
  • 使用 Base64 编码对字节数组进行编码

在服务器端

  • 解码base64编码数据得到字节数组
  • 解密字节数组。
  • 使用此字节数组构造一个字符串。

关于Java 加密 : Java Encription: javax. crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是 8 的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15346056/

相关文章:

javascript - 使用 HTML 5 Canvas 旋转 Base64 图像数据 : final transformation is cropped and wrongly translated

Android:从base64二进制格式获取图像

c - 使用 Visual Studio 和 Openssl 进行 AES 256 CTR 加密/解密

java - 控制台中的文本加密

javascript - 为什么 bigInt 在计算时给出不同的结果。 pow() (使用 npm 大整数)?如何解密给定的数字?

java - 为什么 Eclipse 不记得我的启动配置?

java - 加载文件到oracle数据库

java - 如何获取tomcat服务器中所有已部署的应用程序

java - 服务注释类在存储库调用时抛出空指针异常

html - 使用 base64 编码将 .swf 嵌入到 html 中