본문 바로가기

Spring Boot

[JAVA] TCP/IP 데이터통신 파일암호화 전송 서버,클라이언트

반응형

데이터 암호화 기능과 함께 파일 전송 기능을 포함하는 업데이트된 클라이언트 코드입니다.

Server

import java.io.*;
import java.net.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;
import java.util.Base64;

class TCPServer {
    public static void main(String argv[]) throws Exception {
        ServerSocket welcomeSocket = new ServerSocket(6789);
        SecretKeySpec secretKey;
        Cipher cipher;
        try {
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(128);
            secretKey = new SecretKeySpec(keyGenerator.generateKey().getEncoded(), "AES");
            cipher = Cipher.getInstance("AES");
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            System.out.println("Encryption error: " + e.getMessage());
            return;
        }
        while (true) {
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            int messageLength = inFromClient.read();
            if (messageLength == -1) {
                continue;
            }
            byte[] encryptedFileBytes = new byte[messageLength];
            inFromClient.read(encryptedFileBytes);
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] decryptedFileBytes = cipher.doFinal(encryptedFileBytes);
            FileOutputStream fileOutputStream = new FileOutputStream("received_file.txt");
            fileOutputStream.write(decryptedFileBytes);
            fileOutputStream.close();
            System.out.println("File received");
            String sentence = inFromClient.readLine();
            if (sentence == null) {
                continue;
            }
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] decryptedMessage = Base64.getDecoder().decode(sentence);
            String decryptedSentence = new String(cipher.doFinal(decryptedMessage));
            System.out.println("Received: " + decryptedSentence);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] encryptedMessage = cipher.doFinal(decryptedSentence.getBytes());
            String encryptedSentence = Base64.getEncoder().encodeToString(encryptedMessage) + '\n';
            outToClient.writeBytes(encryptedSentence);
        }
    }
}

코드는 포트 6789에서 수신 연결을 수신하고 클라이언트로부터 텍스트 메시지 또는 파일을 수신합니다. 메시지 길이가 -1이 아닌 경우 메시지를 파일로 간주하고 암호를 해독합니다. 메시지 길이가 -1인 경우 메시지를 텍스트 메시지로 간주하고 암호를 해독한 후 응답을 암호화하여 클라이언트로 다시 보냅니다.

Client

import java.io.*;
import java.net.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;
import java.util.Base64;

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("hostname", 6789);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        SecretKeySpec secretKey;
        Cipher cipher;
        try {
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(128);
            secretKey = new SecretKeySpec(keyGenerator.generateKey().getEncoded(), "AES");
            cipher = Cipher.getInstance("AES");
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            System.out.println("Encryption error: " + e.getMessage());
            return;
        }
        System.out.print("Enter a sentence: ");
        sentence = inFromUser.readLine();
        if (sentence.equals("file")) {
            System.out.print("Enter the file path: ");
            String filePath = inFromUser.readLine();
            File file = new File(filePath);
            if (!file.exists() || !file.isFile()) {
                System.out.println("Error: Not a valid file");
                return;
            }
            FileInputStream fileInputStream = new FileInputStream(file);
            byte[] fileBytes = new byte[(int) file.length()];
            fileInputStream.read(fileBytes);
            fileInputStream.close();
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] encryptedFileBytes = cipher.doFinal(fileBytes);
            outToServer.writeInt(encryptedFileBytes.length);
            outToServer.write(encryptedFileBytes);
            System.out.println("File sent");
        } else {
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] encryptedMessage = cipher.doFinal(sentence.getBytes());
            String encryptedSentence = Base64.getEncoder().encodeToString(encryptedMessage) + '\n';
            outToServer.writeBytes(encryptedSentence);
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] decryptedMessage = Base64.getDecoder().decode(inFromServer.readLine());
            modifiedSentence = new String(cipher.doFinal(decryptedMessage));
            System.out.println("From server: " + modifiedSentence);
        }
        clientSocket.close();
    }
}
반응형