我使用密码加密和解密字节数组在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));”
正如Michael所指出的,问题在于使用NoPadd
。消息大小不适合AES的块大小。填充消息解决了这个问题。
更改:
cipher = Cipher.getInstance("AES_256/CBC/NoPadding");
致:
cipher = Cipher.getInstance("AES_256/CBC/PKCS5PADDING");
我在java类中发现了一个解密错误: 我能做些什么来解决这个问题? 更新: 我忘了提到它工作了一次,当第二次我试图再次执行它时,它抛出了上面提到的错误。
TCP客户端代码: 对于相同的代码,当消息很小时,它会被正确解密。但是当消息很长时,我会得到illegalBlocksize异常。我尝试使用aes/cbc/pkcs5padding来填充消息,并且blocksize是16的倍数。但我还是得到了相同的错误或BadPaddingException。如果am指定PKCS5Padding作为填充技术,那么应该正确填充消息,而不应该给出此错误。为什么不起作用
我有一个安全课程的项目,但我有一个问题。 基本上,我试图加密然后解密一个密码,但我得到这个解密错误。 我这样做对吗。我在关注2012年的一篇文章。还安全吗? 我还尝试替换算法,但似乎没有任何效果: “AES”、“RSA/ECB/PKCS1Padding”、“PbeWithHMACSHA256andDesede”..以及更多
服务器端: 客户端(解密):
所有人。我基本上是试图加密和解密一个字符串类型的密码。我得到的错误是javax . crypto . illegalblocksizeexception:使用填充密码解密时,输入长度必须是8的倍数。 我尝试用指定的填充做其他算法,例如AES/CBC/NoPadding。但得到不同的错误是Java . security . invalidkeyexception:无效的AES密钥长度:5个字节。
我创建了一个函数,它使用: 如果我试着运行这个,比如: 我得到这个错误: 如果我尝试改变: 到 我得到: 如何将此输入字符串最小值强制为8?