반응형
데이터 암호화 기능과 함께 파일 전송 기능을 포함하는 업데이트된 클라이언트 코드입니다.
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();
}
}
반응형
'Spring Boot' 카테고리의 다른 글
[SpringBoot] Spring Boot에서 Dropbox에 파일을 업로드 (0) | 2023.02.09 |
---|---|
[SpringBoot] Spring Boot에서 Naver Blog 글쓰기를 구현 (0) | 2023.02.09 |
[JAVA] TCP/IP 데이터통신 데이터 암호화 서버,클라이언트 (0) | 2023.02.09 |
[JAVA] TCP/IP 데이터통신 기본 서버,클라이언트 (0) | 2023.02.09 |
[SpringBoot] Apache PDFBox 이용한 PDF to Image 변환처리 (0) | 2023.02.09 |