전자 문서 전송 시스템 보안 - 진행 상황 2

전자 문서 전송 시스템 보안 - 진행 상황 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();
}
  • SM4 알고리즘을 사용하여 전자 문서 암호화
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));

이번 주 계획

  1. 관련 인터페이스 개선
  2. 코드 추가 간소화 및 개선

태그: 전자문서보안 SM2 SM4 BouncyCastle 암호화

8월 3일 22:54에 게시됨