자바 암호 프로그래밍 Java Cryptography Programming

Slides:



Advertisements
Similar presentations
Chapter | 4 암호화 기술 Ⅱ암호화. ❖ 암호  통신문의 내용을 제 3자가 판 독할 수 없는 글자 · 숫 자 · 부호 등으로 변경 시킨 것 2/16 암호? 철수 영희 Plaintext attack attack ? ? Cryptography 개방통신로 모레 3.
Advertisements

암호 알고리즘을 이용한 “ 단문 암호화 프로그램 ” 제작 주제탐구학습발표대회 발표자료 교과영역학교학년성명 수학하안초등학교 6 윤승환 지도교사 : 김 지 민 선생님 경기도광명교육지원청부설영재교육원.
최성락 최인석 나주한. 특징 : 공개키 n, g 를 사용하여 키 분배가 가능. (g 는 Zn 의 primitive element) Discrete logarithm 에 기반. 두 명 이상의 경우에도 적용가능. 키 교환 없이도.
8. 현대 대칭키 암호를 이용한 암호화 기법 경일대학교 사이버보안학과 김현성 교수.
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1 정보보안 경일대학교컴퓨터공학과 김 현 성 2 강의구성  교과목 소개 (1 주 )  산업체 전문가 특강실시 (2 주 )  소프트웨어 공학 (3 주 ~7 주 : 5 주 )  산업체 전문가 특강실시 (8 주 )  팀 프로젝트 (9 주.
순천향대학교 정보보호연구회 김현민 DES (Data Encryption Standard)
HTTPS Packet Capture Tutorial
Chapter 8 현대 대칭키 암호를 이용한 암호화 기법
목 차 C# 언어 특징 .NET 프레임워크 C# 콘솔 프로그램 C# 윈도우 프로그램 실습 프로그래밍세미나 2.
목차 Contents 무선인터넷용 비밀번호 설정방법 Windows 7 Windows 8 Windows XP MAC OS.
제3장 관용암호: 현대적 암호기법
자바 암호화 프로그래밍 전자상거래보안.
자바 암호 프로그래밍 Java Cryptography Programming
Ch.07-5 xml-rpc 사용하기 김상엽.
Chapter 3 Symmetric Key Crypto
제 9 장 구조체와 공용체.
자바 암호 프로그래밍 Java Cryptography Programming
10장 예외 Lab 10-1.
자바 암호 프로그래밍 Java Cryptography Programming
자바 암호 프로그래밍 Java Cryptography Programming
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
자바 암호 프로그래밍 Java Cryptography Programming
제 4장 블록 암호 모드.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
교과목 소개 정보보호.
암호학 응용 Applied cryptography
10장 SafeTalk 시스템 소프트웨어 연구실 성순화 이재일
Lesson 9. 예외처리.
5장. 참조 타입.
제 1장 소 개 컴퓨터네트워크실험실 우 준.
File Depender 중간 발표.
공개키 암호화 프로그래밍 전자상거래보안.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
전자상거래 보안 (암호학과 네트워크보안) Chul Ho Rhee
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Error Detection and Correction
정보화 사회와 컴퓨터 보안.
2 : 대칭암호화 소제목 : 기본적인 대칭암호화.
13장 고급 입출력 함수 박사 4학기 최 성자.
TCP/IP Socket Programming…
10장. 예외처리.
전자상거래 보안 (암호학과 네트워크보안) ) Chul Ho Rhee
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
웹어플리케이션보안 암호프로그래밍, crypto-js
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
자바스크립트 암호 프로그래밍 Javascript Cryptography Programming
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
비대칭 암호화 알고리즘 공개키 암호화 알고리즘 소속 : 한세사이버보안고등학교 조장 : 안도현
CHAP 21. 전화, SMS, 주소록.
VHDL를 이용한 DES 설계 정보통신컴퓨터공학부 5조 김인옥, 백미숙
암호학 응용 Applied cryptography
암호학 응용 Applied cryptography
DA :: 퀵 정렬 Quick Sort 퀵 정렬은 비교방식의 정렬 중 가장 빠른 정렬방법이다.
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
JSP Programming with a Workbook
5.2.3 교환방식의 비교 학습내용 교환방식의 비교.
MIDP 네트워크 프로그래밍 ps lab 김윤경.
발표자 : 이지연 Programming Systems Lab.
Numerical Analysis Programming using NRs
(c) Byoungcheon Lee, Joongbu Univ.
JSP Programming with a Workbook
암호 시스템 (Crypto system) 신효철
암호-3장. 대칭키 암호 ㅎㅎ 정보보호 기능의 가장 핵심적 기술인 암호를 다룬다. 흥미로운 암호의 역사를 소개하고, 고전적인 암호체계로부터 현대적인 디지털 암호체계에 이르는 기술의 발전을 살펴보고 현대의 고급 암호분석 기법을 소개한다. 한빛미디어(주)
7 생성자 함수.
자바 암호 프로그래밍 Java Cryptography Programming
Presentation transcript:

자바 암호 프로그래밍 Java Cryptography Programming 2017. 3. 중부대학교 정보보호학과 이병천 교수

차례 1. 강의 개요 2. 암호와 정보보호 3. 자바프로그래밍 기초 4. 자바 네트워크 프로그래밍 5. JCA/JCE 암호 프로그래밍 6. 해쉬함수, MAC, 패스워드 기반 키생성 7. 대칭키 암호 8. 공개키 암호 9. 전자서명 10. 인증서와 공개키기반구조(PKI) 11. 암호 알고리즘/프로토콜 구현

7. 대칭키암호

1. 대칭키 암호 개요 대칭키 암호화(symmetric encryption)는 암호화에 사용하는 키 와 복호화에 사용하는 키가 동일 송신자와 수신자 모두 동일한 키를 공유해야 함 비밀키는 송신자와 수신자 이외에는 알지 못하도록 해야 함

대칭키 암호 방식

대칭키 암호 방식 데이터를 변환하는 단위에 따라 블록 암호와 스트림 암 호로 분류 블록암호: 고정된 크기의 블록 단위로 암호화/복호화 스트림암호: 난수열을 생성하여 비트단위, 글자단위로 암호화/복 호화 블록암호 스트림암호

대칭키 암호 방식 블록 암호 vs. 스트림 암호

커크호프의 원리(Kerckhoffs' Principle) A cryptosystem should be secure even if everything about the system, except the key, is public knowledge. 키를 제외한 시스템의 다른 모든 내용이 알려지더라도 암호체계 는 안전해야 한다. 비밀 암호시스템은 오히려 안전하지 않을 수 있음 많은 전문가들의 공격시도를 견뎌야 안전성을 인정받음

블록 암호 알고리즘 DES 3DES (DESede) AES 1977년 NBS(미국 표준국)에서 미국 표준 알고리즘으로 채택 64비트 블록단위 암호화, 56비트 키길이 짧은 키길이로 인한 취약성으로 현재는 사용하지 않음 Feistel 구조 3DES (DESede) DES 암호를 암호화->복호화->암호화 순으로 3번 반복 블록 크기가 64비트, 느린 속도 AES 2001년 DES를 교체하기 위해 새롭게 제정한 암호 표준 128/192/256 비트의 키길이, 10/12/14 라운드 사용 SPN(Substitution Permutation Network) 구조

블록 암호 알고리즘 SEED ARIA 1999년 2월 국내에서 개발한 128비트 블록암호알고리즘 국내 표준, ISO/IEC 국제 표준 SEED128, SEED256 ARIA 경량 환경, 하드웨어 구현 최적화된 128비트 블록암호알고리즘 128/192/256비트의 키길이, 12/14/16 라운드

DES, AES DES AES

블록 암호 알고리즘

암호 알고리즘의 키길이와 안전성

블록암호의 운영모드 전자 코드북(electronic codebook, ECB) 모드 암호 블록 체인 (cipher-block chaining, CBC) 모드 암호 피드백(cipher feedback, CFB) 모드   출력 피드백(output feedback, OFB) 모드 카운터(Counter, CTR) 모드

ECB (Electronic Codebook) 모드 - 가장 단순한 모드로 블록단위로 순차적으로 암호화 하는 구조이다. - 한 개의 블록만 해독되면 나머지 블록도 해독이 되는 단점이 있다. - 각 블록이 독립적으로 동작하므로 한 블록에서 에러가 난다고 해도 다른 블록에 영향을 주지 않는다.

CBC (Cipher Block Chaining) 모드 - 블록 암호화 운영 모드 중 보안 성이 제일 높은 암호화 방법으로 가장 많이 사용된다. - 평문의 각 블록은 XOR연산을 통해 이전 암호문과 연산되고 첫번째 암호문에 대해서는  IV(Initial Vector)가 암호문 대신 사용된다. 이 때, IV는 제 2의 키가 될 수 있다. - 암호화가 병렬처리가 아닌 순차적으로 수행되어야 한다. 

CFB (Cipher Feedback) 모드 - 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같다(패딩이 필요 없다) - 최초의 키생성 버퍼로 IV가 사용되며, 이때 IV는 제2의 키가 될수 있다. - 스트림의 기본단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 CFB8~CFB128로 쓰인다. - 암호화, 복호화 모두 암호화로만 처리할 수 있다. - CBC모드와 마찬가지로 암호화는 순차적이고, 복호화는 병렬적으로 처리할 수 있다. 

OFB (Output Feedback) 모드 - 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같다.(패딩이 필요없다) - 암호화 함수는 키 생성에만 사용되며, 암호화 방법과 복호화 방법이 동일해 암호문을 한번 더 암호화하면 평문이 나온다. (복호화시에 암호화) - 최초의 키생성 버퍼로 IV가 사용되며, 이 때 IV는 제2의 키가 될수 있다. - 스트림의 기본 단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 OFB8~OFB128로 쓰인다.

CTR (Counter) 모드 - 블록을 암호화할 때마다 1씩 증가해 가는 카운터를 암호화 해서 키스트림을 만든다. 즉 카운터를 암호화한 비트열과 평문블록과의 XOR를 취한 결과가 암호문 블록이 된다. - CTR모드는 OFB와 같은 스트림 암호의 일종이다. - CTR모드의 암/복호화는 완전히 같은 구조가 되므로 구현이 간단하다.(OFB와 같은 스트림 암호의 특징) - CTR모드에서는 블록의 순서를 임의로 암/복호화 할 수 있다.(블록번호로부터 카운터를 구할 수 있음) - 블록을 임의의 순서로 처리 할 수 있다는 것은 처리를 병행 할 수 있다는 것을 의미한다.(병렬처리 가능)

암호화와 인증을 결합한 블록암호 운영모드 CCM (Counter with CBC-MAC) 암호화와 메시지 인증 기능을 동시에 제공하는 운영 모드 메시지 인증을 위해 CBC-MAC 모드를 사용하고, 메시지 암호화 를 위하여 CTR 모드를 사용 GCM (Galois/Counter Mode) CTR 모드와 GHASH 를 함께 사용하는 운영 모드

패딩 (padding) 블록암호는 정해진 길이의 블록단위로 암호화 수행 암호화할 메시지의 길이는 제각각 패딩된 데이터에서 원래 데이터를 복구할 수 있어야 함

2. 키생성 비밀키 생성 Key Spec 변환 채우기 (Padding) 암호화 모드 (Mode of operation) Cipher 객체의 선언 및 초기화 암호화/복호화

비밀키의 생성 KeyGenerator(javax.crypto.KeyGenerator) 클래스 이용 객체 생성: KeyGenerator kg = KeyGenerator.getInstance("AES"); 키생성 방법 지정: keyGenerator.init(128); 키 생성: SecretKey key = keyGenerator.generateKey(); KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128); SecretKey key = keyGenerator.generateKey();

비밀키의 생성 비밀키는 알고리즘에 따라 키 길이가 다르다. 자바에서는 사용자가 키 길이를 별도로 제시하지 않아 도 선택한 알고리즘에 필요한 비밀키를 생성하여 준다. 필요하면 특정한 알고리즘을 사용하여 키를 생성하도록 설정할 수도 있다. (init 메소드 이용) init(int keySize) init(SecureRandom random) init(int keySize, SecureRandom random)

키생성 알고리즘

KeySpec 변환 KeySpec 변환이 필요한 경우 javax.crypto.spec.SecretKeySpec 엔진을 사용 파일로 저장된 키를 불러와서 사용하는 경우 (비밀키를 파일로 저장할 경우에는 byte array 형태로 저장) 난수를 생성하여 비밀키로 사용하려고 하는 경우 javax.crypto.spec.SecretKeySpec 엔진을 사용 public SecretKeySpec(byte[] key, String algorithm) 주어진 byte array로부터 주어진 알고리즘에 맞는 비밀키를 구성 함. SecureRandom random = new SecureRandom(); byte[] keyData = new byte[16]; random.nextBytes(keyData); SecretKey secretKey = new SecretKeySpec(keyData, "AES");

비밀키를 파일로 저장하기/읽어오기 KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128); SecretKey secretKey = keyGenerator.generateKey(); byte[] keyData = secretKey.getEncoded(); System.out.println("Algorithm : " + secretKey.getAlgorithm()); System.out.println("Format : " + secretKey.getFormat()); File keyFile = new File("secretKey.raw"); OutputStream out = new BufferedOutputStream(new FileOutputStream(keyFile)); try { out.write(keyData); } finally { out.close(); }

3. Cipher 클래스를 이용한 암호화/복호화 이 엔진을 사용하기 위해서는 먼저 사용할 알고리즘을 지정하여 야 한다. 이 때 알고리즘 이름 뿐만 아니라 암호화 모드, 채우기 방식을 함 께 지정할 수 있다. 암호화 모드와 채우기 방식을 지정하지 않으면 제공자에 의해 결 정된 모드와 채우기 방식으로 암호화가 이루어진다. Cipher DESCipher = Cipher.getInstance("DES"); Cipher DESCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

Cipher 엔진 객체의 초기화 Cipher 엔진의 동작모드 (opmode) public void init(int opmode, Key key) Cipher 엔진의 동작모드 (opmode) Cipher.ENCRYPT_MODE: 암호화 연산을 사용하고자 할 때 Cipher.DECRYPT_MODE: 복호화 연산을 사용하고자 할 때

채우기 (padding) 채우기 암호화 모드 블록 암호 방식에서는 마지막 블록을 완전 블록으로 만들기 위해 채우기가 필요하다. 블록 암호 방식에서는 마지막 블록을 완전 블록으로 만들기 위해 채우기가 필요하다. JCE는 4가지 채우기 방법을 제공 none: 사용자가 완전 블록임을 보장해 주어야 한다. PKCS5Padding SSL3Padding (예약만 되어 있고, 실제 구현되어 있지 않음) OAEPWith<digest>And<mgf>Padding 암호화 모드 ECB, CBC, CFB, CTR 모드 제공

암호화 방법1. doFinal() 메소드만 호출 암호화하고자 하는 평문의 크기가 작을 경우 방법2.일련의 update() 메소드를 호출한 후에 doFinal() 메소드 호출 암호화하고자 하는 평문의 크기가 크거나 나누어져 있을 경우 String plaintext = "This is a secret message!"; byte[] ciphertext = cipher.doFinal(plaintext.getBytes()); byte[] ciphertext = new byte[cipher.getOutputSize(input.length)]; int ctLength = cipher.update(myByteArray01, 0, myByteArray01.length, ciphertext, 0); ctLength += cipher.update(myByteArray02, 0, myByteArray02.length, ciphertext, ctLength); ctLength += cipher.doFinal(ciphertext, ctLength);

DES 암호화 예제 SymEncryption.java try{ KeyGenerator kg = KeyGenerator.getInstance("DES"); SecretKey key = kg.generateKey(); SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), "DES"); Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, keySpec); String plaintext = "This is a secret message!"; byte[] ciphertext = cipher.doFinal(plaintext.getBytes()); for(int i=0; i<ciphertext.length; i++){ System.out.printf("%02X ", ciphertext[i]); } System.out.println(); cipher.init(Cipher.DECRYPT_MODE,keySpec); byte[] cleartext = cipher.doFinal(ciphertext); for(int i=0; i<cleartext.length; i++){ System.out.print((char)cleartext[i]); catch(){

AES 암호화 예제 AESTest.java AES 암호화 테스트 비밀키: 2b37e20db0df7bdee53fb26a846d7677 비밀키 길이: 128 bits 평문: 오늘도 별이 바람에 스치운다. 암호문: cb00d7e6d3dfc950896ea1aefbb1f1edfb9eac43da4cdc1790 135c09c31cd9343e15ba6a720394b033b8114de85199e4 복호문 :오늘도 별이 바람에 스치운다.

AES/CBC모드 예제 AESCBCTest.java 초기벡터 IV 생성 필요 // IV 생성 SecureRandom random = new SecureRandom(); byte[] ivData = new byte[16]; // 128 bit random.nextBytes(ivData); IvParameterSpec ivParameterSpec = new IvParameterSpec(ivData); Charset charset = Charset.forName("UTF-8"); public static byte[] encrypt(SecretKey secretKey, IvParameterSpec ivParameterSpec, byte[] plainData) throws GeneralSecurityException { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec); byte[] encryptData = cipher.doFinal(plainData); return encryptData; }

4. 파일 암호화/복호화 대량의 데이터를 암/복호화하는 경우 CipherStream 클 래스를 이용 평문 파일의 암호화 평문 파일 입력: BufferedInputStream 이용 암호화 파일 출력: CipherOutputStream 이용 암호화 파일의 복호화 암호문 파일 입력: CipherInputStream 이용 복호화 평문 파일 출력: BufferedOutputStream 이용 예제: CipherStreamExample.java

파일 암호화/복호화 프로젝트 폴더에 암호화할 파일 준비 // 암호화할 텍스트 파일 File plainFile = new File("plain.txt"); // 암호화하여 저장할 파일 File encryptFile = new File("encrypt.txt"); // 복호화하여 저장할 파일 File decryptFile = new File("decrypt.txt");

파일 암호화/복호화 파일 암호화 try { input = new BufferedInputStream(new FileInputStream(plainFile)); output = new CipherOutputStream(new BufferedOutputStream(new FileOutputStream(encryptFile)), cipher); int read = 0; byte[] buffer = new byte[1024]; while ((read = input.read(buffer)) != -1) { output.write(buffer, 0, read); } } finally { if (output != null) try {output.close();} catch(IOException ie) {} if (input != null) try {input.close();} catch(IOException ie) {}

파일 암호화/복호화 파일 복호화 try { input = new CipherInputStream(new BufferedInputStream(new FileInputStream(encryptFile)), cipher); output = new BufferedOutputStream(new FileOutputStream(decryptFile)); int read = 0; byte[] buffer = new byte[1024]; while ((read = input.read(buffer)) != -1) { output.write(buffer, 0, read); } } finally { if (output != null) try {output.close();} catch(IOException ie) {} if (input != null) try {input.close();} catch(IOException ie) {}