使用對稱 AES 加密實作 UDP 聊天應用程式。我從客戶端開始,將訊息加密(密文)發送到服務器端。然后服務器端用固定密鑰和密文解密得到原始訊息。服務器端和客戶端都會使用這個密鑰進行加密和解密
client.sentThenReceive(" P@ssword123@@24".getBytes(StandardCharsets.UTF_8));
server.receiveThenSend(" P@ssword123@@24".getBytes(StandardCharsets.UTF_8));
一切正常,直到我嘗試使用密文在服務器端解密方法并在這行代碼中給出導致以下錯誤的密鑰
byte[] originalMessage = cipher.doFinal(message);
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
at java.base/com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:858)
at java.base/com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:938)
at java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:734)
at java.base/com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:434)
at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2206)
at Server.Decryption(Server.java:45)
at Server.receiveThenSend(Server.java:63)
at Server.main(Server.java:81)
這里是客戶端的加密方式,客戶端加密訊息后發送給客戶端
public byte[] Encryption(byte[] message, byte[] keyBytes)throws InvalidKeyException, NoSuchPaddingException,
NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException {
// Step 5: Create a Cipher object
Cipher cipher = Cipher.getInstance("AES");
SecretKey secrekey = new SecretKeySpec(keyBytes, "AES");
cipher.init(cipher.ENCRYPT_MODE, secrekey);
byte[] Encryption = cipher.doFinal(message);
return Encryption;
}
當Server端收到來自Client端的加密訊息后,會使用decrypte方法進行解密。這行代碼引發的錯誤:byte[] originalMessage = cipher.doFinal(message);
public String Decryption(byte[] message, byte[] keyBytes)throws InvalidKeyException, NoSuchPaddingException,
NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance("AES");
SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");
cipher.init(cipher.DECRYPT_MODE, secretKey);
byte[] originalMessage = cipher.doFinal(message);
return new String(originalMessage);
}
這是客戶端的發送方法,用于將密文發送到服務器端
public void sentThenReceive(byte[] key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
Scanner scanner = new Scanner(System.in);
while (true) {
try {
String messageToSend = scanner.nextLine();
byte[] message = messageToSend.getBytes();
DatagramPacket datagramPacket = new DatagramPacket (message, message.length, inetAddress, 2468);
datagramSocket.send(datagramPacket);
這是服務器端的接收方法,用于從客戶端接收訊息
public void receiveThenSend(byte[] key) throws NoSuchPaddingException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException {
while (true) {
try {
DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length);
datagramSocket.receive(datagramPacket);
System.out.println(Decryption(datagramPacket.getData(),key));
InetAddress inetAddress = datagramPacket.getAddress();
int port = datagramPacket.getPort();
datagramPacket = new DatagramPacket(buffer, buffer.length, inetAddress, port);
datagramSocket.send(datagramPacket);
我是一名學習者,所以任何人都可以隨時教我我的代碼有什么問題以及如何修復它。非常感謝您的意見!
uj5u.com熱心網友回復:
Bad Padding 例外有兩個一般原因,要么是不同的模式設定,要么是解密失敗。
首先檢查您是否已明確將兩側的填充模式設定為相同。
如果不是那樣,那么你需要檢查整個解密沒有失敗,導致垃圾而不是格式良好的填充。暫時將解密端設定為“NoPadding”,看看結果如何。完全垃圾意味著您有更普遍的解密失敗。一個很好的解密,最后有一些額外的位元組是一個很好的解密,添加了填充。您需要將解密端設定為期望該型別的填充。不要保留“NoPadding”設定,因為它不太安全。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/534413.html
標籤:爪哇例外加密密码学UDP
上一篇:指定的轉換對于可觀察集合無效
下一篇:掙扎于簡單的回圈
