当前位置: 首页 > 知识库问答 >
问题:

加密/解密字节数组时出错:IllegalBlockSizeException:数据不是块长度的倍数

周辉
2023-03-14

我使用密码加密和解密字节数组在Android发送到服务器。我没有使用字符串,但我仍然收到非法块大小异常。

                try {
                    byte[] cipherNameText = {};

                    KeyGenerator keygen = null;
                    keygen = KeyGenerator.getInstance("AES");
                    keygen.init(256);
                    SecretKey key= keygen.generateKey();

                    String name = nameEdit.getText().toString();

                    Cipher cipher = null;
                    cipher = Cipher.getInstance("AES_256/CBC/NoPadding");
                    SecureRandom iv = new SecureRandom();
                    cipher.init(Cipher.ENCRYPT_MODE, key, iv);
                    cipherNameText = cipher.doFinal(name.getBytes(StandardCharsets.UTF_8));
                    byte[] iv1 = cipher.getIV();

                    HashMap<String, byte[]> map = new HashMap<>();
                    map.put("name",key.toString().getBytes(StandardCharsets.UTF_8));

                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                } catch (NoSuchPaddingException e) {
                    e.printStackTrace();
                } catch (BadPaddingException e) {
                    e.printStackTrace();
                } catch (IllegalBlockSizeException e) {
                    e.printStackTrace();
                } catch (InvalidKeyException e) {
                    e.printStackTrace();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }

2021-08-12 20:55:17.606 15222-15222/com.example.packageW/System.err:javax.crypto.IllegalBlockSizeExcture:错误:1e00006a:密码函数:OPENSSL_internal:DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH

2021-08-12 21:51:47.32215606-15606/com。实例带系统的包装。错误:在com上。实例服务器教程。主要活动4美元。onClick(MainActivity.java:212)

^这指向“cipherNameText=cipher.doFinal(name.getBytes(StandardCharsets.UTF_8));”

共有1个答案

章景同
2023-03-14

正如Michael所指出的,问题在于使用NoPadd。消息大小不适合AES的块大小。填充消息解决了这个问题。

更改:

                    cipher = Cipher.getInstance("AES_256/CBC/NoPadding");

致:

                            cipher = Cipher.getInstance("AES_256/CBC/PKCS5PADDING");
 类似资料: