2014-04-02 62 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"); 
相关问题