전자 문서 전송 시스템 보안 - 진행 상황 2
- 지난 주 작업 완료 사항 (코드 링크, 작성된 문서 등)
- 이번 주 계획
지난 주 작업 완료 사항
- SM2 알고리즘을 사용하여 사용자 계정 생성 시 공개/비밀 키 쌍 생성
try {
// SM2 곡선 파라미터 설정
ECGenParameterSpec ecParam = new ECGenParameterSpec("sm2p256v1");
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());
keyGen.initialize(ecParam, new SecureRandom());
// 키 쌍 생성
KeyPair kp = keyGen.generateKeyPair();
PublicKey pubKey = kp.getPublic();
String userPath = System.getProperty("user.home") + "/Desktop/";
String fileNm = userId +"_private_key.pem";
// 비밀키를 PEM 파일로 저장
try (PEMWriter pemWrt = new PEMWriter(new FileWriter(userPath + fileNm))) {
pemWrt.writeObject(kp.getPrivate());
}
} catch (Exception e) {
e.printStackTrace();
}
try {
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(pwd.toCharArray(), pwd.getBytes(), 65536, 128);
SecretKey tmp = skf.generateSecret(spec);
SecretKey sm4Key = new SecretKeySpec(tmp.getEncoded(), "SM4");
byte[] encData = encryptSM4(docContent, sm4Key);
String hash = generateSM3Hash(encData);
} catch (Exception e) {
e.printStackTrace();
}
- 수신자의 공개 키를 사용하여 SM4 키 암호화
String query = "SELECT public_key FROM users WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(query)) {
pstmt.setString(1, recId);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
String pubKeyStr = rs.getString("public_key");
byte[] pubBytes = Base64.getDecoder().decode(pubKeyStr);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubBytes);
KeyFactory kf = KeyFactory.getInstance("EC");
PublicKey pubKey = kf.generatePublic(keySpec);
byte[] sm4KeyBytes = sm4Key.getEncoded();
byte[] encSm4Key = encrypt(sm4KeyBytes, pubKey);
String encSm4KeyBase64 = Base64.getEncoder().encodeToString(encSm4Key);
}
}
}
- 수신자가 자신의 개인 키를 사용하여 대칭 키 복호화 및 문서 내용 복호화
byte[] encSm4Key = Base64.getDecoder().decode(encKey);
byte[] decSm4KeyBytes = decrypt(encSm4Key, privKey);
SecretKey decSm4Key = new SecretKeySpec(decSm4KeyBytes, "SM4");
byte[] docDecrypted = decryptSM4(encDocContent, decSm4Key);
response.sendRedirect("view.jsp?docId=" + docId + "&content=" + new String(docDecrypted));
이번 주 계획
- 관련 인터페이스 개선
- 코드 추가 간소화 및 개선