2017-03-15 60 views
0

我试图解密的服务器的消息 - 我得到的错误是使用javax.crypto.BadPaddingException:鉴于最终块未正确填充 - DES Decrytion

加密技术 - DES。

螺纹--Exception“主” javax.crypto.BadPaddingException:鉴于最终块未正确填充

我有一个非常困难的时间试图解决这个问题, 任何帮助将是理解

class TCPClient { 
public static void main(String argv[]) throws Exception { 
    byte[] sentence, textEncrypted; 
    String modifiedSentence; 
    String password; 
    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
    Socket clientSocket = new Socket("localhost", 6789); 
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
    password = "Passcode"; 
    byte[] salt = new byte[64]; 
    Random rnd = new Random(); 
    rnd.nextBytes(salt); 
    byte[] data = deriveKey(password, salt, 64); 

    // BufferedReader inFromServer = new BufferedReader(new 
    // InputStreamReader(clientSocket.getInputStream())); 
    System.out.println("Enter the Data to be transmisted to server\n"); 
    sentence = inFromUser.readLine().getBytes(); 
    SecretKey desKey = SecretKeyFactory.getInstance("DES").generateSecret(new DESKeySpec(data)); 
    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
    cipher.init(Cipher.ENCRYPT_MODE, desKey); 
    textEncrypted = cipher.doFinal(sentence); 
    outToServer.writeBytes(new String(textEncrypted) + '\n'); 
    clientSocket.close(); 
} 

public static byte[] deriveKey(String password, byte[] salt, int keyLen) { 
    SecretKeyFactory kf = null; 
    try { 
     kf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    KeySpec specs = new PBEKeySpec(password.toCharArray(), salt, 1024, keyLen); 
    SecretKey key = null; 
    try { 
     key = kf.generateSecret(specs); 
    } catch (InvalidKeySpecException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return key.getEncoded(); 
} 
} 

服务器端代码

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

    while (true) { 
     Socket connectionSocket = welcomeSocket.accept(); 
     BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
     password = "Passcode"; 
     byte[] salt = new byte[64]; 
     Random rnd = new Random(); 
     rnd.nextBytes(salt); 
     byte[] data = deriveKey(password, salt, 64); 
     byte [] EncyptedText = inFromClient.readLine().getBytes(); 
     System.out.println("Received Encrypted message " + EncyptedText); 
     SecretKey desKey = SecretKeyFactory.getInstance("DES").generateSecret(new DESKeySpec(data)); 
     Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, desKey); 
     // Decrypt the text 
     System.out.println("Text Received " + EncyptedText); 
     byte[] textDecrypted = cipher.doFinal(EncyptedText); 
     System.out.println("Text Decryted : " + new String(textDecrypted)); 

    } 
} 

public static byte[] deriveKey(String password, byte[] salt, int keyLen) { 
     SecretKeyFactory kf = null; 
     try { 
      kf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     KeySpec specs = new PBEKeySpec(password.toCharArray(), salt, 1024, keyLen); 
     SecretKey key = null; 
     try { 
      key = kf.generateSecret(specs); 
     } catch (InvalidKeySpecException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return key.getEncoded(); 
} 
} 
+0

只是在这里头脑风暴,但你的客户端盐是从服务器端不同。这不会导致任何问题吗? –

+0

我曾尝试使用盐,但我最终以相同的错误:( –

回答

0

这样做会丢失数据:

outToServer.writeBytes(new String(textEncrypted) + '\n'); 

除此之外,没有必要。密文不是现代密码的真正文本,它是二元的。由于套接字提供二进制InputStream s和OutputStream s,所以根本没有理由将密文转换为字符串。所需要的只是将可能的输入字符串转换为二进制(当然,在客户端和服务器上都使用相同的编码,现在首选UTF-8)。

+0

在修改的代码中,我写字节,而不是通过TCP发送字符串。唯一的问题是我面临的是在服务器上派生密钥,请建议我的方式如何在系统之间共享密钥 –

+0

嗯,在这种情况下,您可能希望共享一个包含密钥的二进制文件,我的意思是,没有任何内容是安全的,所以我认为这只是测试。SecretKey.getEncoded(), KeyFactory ...但这是另一个问题。为了安全起见,请使用TLS和PKI方案。 –

相关问题