2014-04-02 104 views
0

此代碼在服務器端提供無效的AES密鑰長度錯誤。我該如何糾正它?服務器在此之後被創建時,從客戶端服務器發送msg錯誤。服務器上的AES密鑰長度錯誤無效

Server代碼:

import java.io.*; 
import java.net.*; 
import javax.crypto.*; 
import javax.crypto.spec.SecretKeySpec; 
import org.apache.commons.codec.binary.Base64; 

class TCPServer 
{ 
    public static void main(String argv[]) throws Exception 
     { 
     String clientSentence; 
     String capitalizedSentence; 
     ServerSocket welcomeSocket = new ServerSocket(6808); 

     while(true) 
     { 
      Socket connectionSocket = welcomeSocket.accept(); 
      BufferedReader inFromClient = 
       new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      clientSentence = inFromClient.readLine(); 
      System.out.println("Received: " + clientSentence); 

      byte[] raw = new byte[]{'T', 'h', 'i', 's', 'I', 's', 'A', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'}; 
      //SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
      SecretKeySpec skeySpec = new SecretKeySpec(Base64.decodeBase64(raw), "AES"); 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(skeySpec.getEncoded(),"AES")); 
      byte[] original = cipher.doFinal(Base64.decodeBase64(clientSentence)); 
      original.toString(); 

      System.out.println("Sent: " + original); 

      capitalizedSentence = (new String(original)).toUpperCase() + '\n'; 
      System.out.println("Sent: " + capitalizedSentence); 
      outToClient.writeBytes(capitalizedSentence); 
     } 
     } 
} 

客戶端代碼:

import java.io.*; 
import java.net.*; 
import javax.crypto.*; 
import javax.crypto.spec.SecretKeySpec; 



class TCPClient 
{ 

    public static void main(String argv[]) throws Exception 
    { 
     String sentence; 
     String modifiedSentence; 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     Socket clientSocket = new Socket("localhost", 6808); 
     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     sentence = inFromUser.readLine(); 

     byte[] raw = new byte[]{'T', 'h', 'i', 's', 'I', 's', 'A', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'}; 
     SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
     byte[] encrypted = cipher.doFinal(sentence.getBytes()); 
     System.out.println("encrypted string:" + (new String(encrypted))); 

     outToServer.writeBytes(new String(encrypted) + '\n'); 
     modifiedSentence = inFromServer.readLine(); 
     System.out.println("FROM SERVER: " + modifiedSentence); 
     clientSocket.close(); 
    } 
} 

任何幫助表示讚賞。

+0

爲了將來的參考,包括堆棧跟蹤在你的問題是非常重要的。 –

回答

1

取消註釋skeySpec並直接使用raw鍵,就像在客戶端中一樣。

//SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
SecretKeySpec skeySpec = new SecretKeySpec(Base64.decodeBase64(raw), "AES"); 
相關問題