gpt4 book ai didi

javax.crypto.IllegalBlockSizeException : Input length must be multiple of 16 when decrypting with padded cipher in tcp

转载 作者:行者123 更新时间:2023-12-02 03:21:48 34 4
gpt4 key购买 nike

我正在使用此 AES 加密和解密方法来加密我的数据。 udp 没有问题,但是当我使用 tcp 时,我收到此错误“javax.crypto.IllegalBlockSizeException:使用填充密码解密时输入长度必须是 16 的倍数”

AES加密/解密代码:

    public class AESEncDec {

private static final String ALGO = "AES";
private static final byte[] keyValue = new byte[] { 'T', 'h', 'e', 'B','e', 's', 't','S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };


public static String encrypt(String Data) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = c.doFinal(Data.getBytes());
String encryptedValue = new BASE64Encoder().encode(encVal);
System.err.println("encVal: "+encryptedValue.length());

return encryptedValue;
}

public static String decrypt(String encryptedData) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
byte[] decValue = c.doFinal(decordedValue);
//byte[] decValue = c.doFinal(encryptedData.getBytes());
String decryptedValue = new String(decValue);
System.err.println("decVal: "+decryptedValue.length());

return decryptedValue;
}
private static Key generateKey() throws Exception {
Key key = new SecretKeySpec(keyValue, ALGO);
return key;
}

}

TCP 服务器代码:

    class TCPServer
{
public static void main(String argv[]) throws Exception
{
AESEncDec edData= new AESEncDec();
// AES edData= new AES();

String msg="Message_";
String clientSentence="";
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
Socket connectionSocket = welcomeSocket.accept();
for (int i = 0; i < 10; i++)
{
clientSentence=edData.encrypt(msg+i)+"\n";
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
outToClient.writeBytes(clientSentence);
Thread.sleep(100);
}
}
}

TCP 客户端代码:

    class TCPClient {

public static void main(String argv[]) throws Exception {

AESEncDec edData= new AESEncDec();
String modifiedSentence;
String DecData="";
Socket clientSocket = new Socket("localhost", 6789);
while(true){
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
modifiedSentence = inFromServer.readLine();
DecData=edData.decrypt(modifiedSentence);
System.out.println("FROM SERVER: " + DecData);
}

//clientSocket.close();
}
}

对于相同的代码,当消息很小时,它会被正确解密。但是当消息很长时,我会收到非法 block 大小异常。我尝试使用 AES/CBC/PKCS5Padding 来填充消息,并且 block 大小为 16 的倍数。但我仍然收到相同的错误或 BadPaddingException。如果我指定 PKCS5Padding 作为填充技术,则应正确填充消息,并且不应给出此错误。为什么那不起作用。我该怎么做才能正确解密数据。请帮忙..

最佳答案

问题在于 TCP 为您提供了一个流。如果您读取一个 block 并尝试解密它,则可能会失败,因为该 block 的大小可能不是 16(或 128)的倍数。 AES 适用于 16 字节或 128 字节数据 block 。因此,您可能需要等待一段时间,直到收集到足够多的数据才能解密。

由于UDP是面向消息的,因此不会面临这样的问题。

@Kiara,请使用 Java8 的内置编码并看看它是如何工作的。请参阅here用于文档。示例:

String asB64 = Base64.getEncoder().encodeToString(data.getBytes("utf-8")); 

经过测试,该方法可以很好地处理长度高达 7 MB 的消息。它没有在编码消息中引入换行符。

关于javax.crypto.IllegalBlockSizeException : Input length must be multiple of 16 when decrypting with padded cipher in tcp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39498722/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com