使用socket server和des算法加解密

encryption and decryption using socket server and des algorithm

创建服务器-客户端 java 使用 DES 算法进行加密和解密的应用程序和一个用于保存我的密钥的文件,用于客户端服务器通信的套接字 我的解密函数有问题

这是我的服务器代码

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import javax.crypto.*;
import java.security.*;
import java.util.Arrays;
import java.util.Base64;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.spec.SecretKeySpec;

/**
 *
 * @author ASUS
 */


 public class Server {
    
        public static void main(String[] args) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
            try (ServerSocket listener = new ServerSocket(3001)) {
                System.out.println("The date server is running...");
                while (true) {
    
                    try (Socket socket = listener.accept()) {
                        Key k = Client.getkey("D://key.txt");
    
                        DataInputStream in = new DataInputStream(socket.getInputStream());
                        String x = in.readUTF();
    
                        System.out.println(k);
                        System.out.println(x);
                        System.out.println(Decrypt(x, k));
    
                    }

            }
        }

    }

 

   public static String Decrypt(String cipherText, Key k) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, k);
      
   return new String (cipher.doFinal(Base64.getDecoder().decode(cipherText)),"UTF-8");
    }

    public static void gen_key() throws NoSuchAlgorithmException {
        KeyGenerator kg = KeyGenerator.getInstance("DES");
        Key k = kg.generateKey();
        String encodedKey = Base64.getEncoder().encodeToString(k.getEncoded());
        try {
            FileWriter myWriter = new FileWriter("D://key.txt");
            myWriter.write(encodedKey);

            myWriter.close();
            System.out.println("Successfully wrote  key to the file.");
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }

    public static Key getkey(String filename) throws FileNotFoundException, IOException {
        InputStream is = new FileInputStream(filename);
        BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
        String line = buffer.readLine();
        StringBuilder sb = new StringBuilder();
        while (line != null) {
            sb.append(line);
            line = buffer.readLine();
        }
        String fileAsString = sb.toString();
        byte[] decodedkey = Base64.getDecoder().decode(fileAsString);
        SecretKey originkey = new SecretKeySpec(decodedkey, 0, decodedkey.length, "DES");
        return originkey;
    }
}

这是客户端代码

import java.io.BufferedReader;
import java.io.File;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Scanner;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import javax.crypto.*;
import  java.security.*;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.spec.SecretKeySpec;
/**
 *
 * @author ASUS
 */



  public class Client {
    
        
         public static void main(String[] args) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
          gen_key();
         byte[] r;     
    Key k=getkey("D://key.txt");
         r = encrypt("fatimaalzahrasha",k);
       
               Socket socket = new Socket("127.0.0.1", 3001);
            DataOutputStream os=new  DataOutputStream(socket.getOutputStream());
            os.writeUTF(r.toString());
         }
    
         public static Key getkey(String filename) throws FileNotFoundException, IOException{
             InputStream is=new FileInputStream(filename);
             BufferedReader buffer=new BufferedReader(new InputStreamReader(is));
      String line=buffer.readLine();
      StringBuilder sb=new StringBuilder();
    while(line!=null)
    {sb.append(line);
    line=buffer.readLine();}
    String fileAsString=sb.toString();
    byte[] decodedkey=Base64.getDecoder().decode(fileAsString);
    SecretKey originkey=new SecretKeySpec(decodedkey, 0,decodedkey.length,"DES");
       return originkey;}
    
    
    
         public static void gen_key() throws NoSuchAlgorithmException{
         KeyGenerator kg=KeyGenerator.getInstance("DES");
         Key k=kg.generateKey();
         String encodedKey=Base64.getEncoder().encodeToString(k.getEncoded());
       try {
          FileWriter myWriter = new FileWriter("D://key.txt");
          myWriter.write(encodedKey);
    
          myWriter.close();
          System.out.println("Successfully wrote  key to the file.");
        } catch (IOException e) {
          System.out.println("An error occurred.");
          e.printStackTrace();
        }   

    }
         public static byte [] encrypt(String plain,Key k ) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException
         {        
             Cipher cipher = Cipher.getInstance("DES"); 
            cipher.init(Cipher.ENCRYPT_MODE, k); 
             byte[] data = plain.getBytes(); 
            byte[] result = cipher.doFinal(data); 
           return result;
         } 
    }

当我 运行 服务器然后客户端我有这个输出

The date server is running...
javax.crypto.spec.SecretKeySpec@fffe78c8
[B@1412c2f
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character 5b
    at java.util.Base64$Decoder.decode0(Base64.java:714)
    at java.util.Base64$Decoder.decode(Base64.java:526)
    at Server.Decrypt(Server.java:60)
    at Server.main(Server.java:48)
C:\Users\ASUS\AppData\Local\NetBeans\Cache.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 11 seconds)

不同格式密文(“密文”)的错误结果。在客户端,加密方法的输出是一个字节数组,它通过套接字传输到服务器。在服务器端,解密方法的输入等待 Base64 编码字符串

因此您可以将加密数据作为字节数组发送并省略解码部分,或者您在客户端使用 Base64 对字节数组进行编码,例如

byte[] r;
r = encrypt("fatimaalzahrasha",k);
String rBase64 = Base64.getEncoder().encodeToString(r);
os.writeUTF(rBase64);