암호학 응용 Applied cryptography

Slides:



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

8. 현대 대칭키 암호를 이용한 암호화 기법 경일대학교 사이버보안학과 김현성 교수.
1 정보보안 경일대학교컴퓨터공학과 김 현 성 2 강의구성  교과목 소개 (1 주 )  산업체 전문가 특강실시 (2 주 )  소프트웨어 공학 (3 주 ~7 주 : 5 주 )  산업체 전문가 특강실시 (8 주 )  팀 프로젝트 (9 주.
HTTPS Packet Capture Tutorial
Chapter 8 현대 대칭키 암호를 이용한 암호화 기법
목 차 C# 언어 특징 .NET 프레임워크 C# 콘솔 프로그램 C# 윈도우 프로그램 실습 프로그래밍세미나 2.
목차 Contents 무선인터넷용 비밀번호 설정방법 Windows 7 Windows 8 Windows XP MAC OS.
표준 SSL Server Identification
Chapter 8 네트워크 보안 Computer Networking: A Top Down Approach , 5th edition. Jim Kurose, Keith Ross Addison-Wesley, April 2009.
웹 어플리케이션 보안 2016년 2학기 12. Cryptography.
(c) Byoungcheon Lee, Joongbu Univ.
제 8장 메시지 인증 코드 메시지가 보낸 그대로 왔는가?.
Chapter 3 Symmetric Key Crypto
Chapter 17 전송층 보안: SSL과 TLS
전자계산학과 대학원 그룹웨어 연구실 진 훈 Code and RSA 전자계산학과 대학원 그룹웨어 연구실 진 훈
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
Secure Socket Layer.
컴퓨터 프로그래밍 기초 [Final] 기말고사
자바 암호 프로그래밍 Java Cryptography Programming
자바 암호 프로그래밍 Java Cryptography Programming
자바 암호 프로그래밍 Java Cryptography Programming
Chapter 8 목차 8.1 네트워크 보안이란 무엇인가? 8.2 암호학의 원리 8.3 메시지 무결성 8.4 종단점 인증
제 4장 블록 암호 모드.
암호학 응용 Applied cryptography
08장 암호의 이해: 숨기고자 하는 이들의 싸움.
교과목 소개 정보보호.
SSL (Secure Sockets Layers Protocol)
File Depender 중간 발표.
공개키 암호화 프로그래밍 전자상거래보안.
23 장 OSI 상위계층 23.1 세션(session)층 23.2 표현(presentation)층
제10장 메시지 인증과 해쉬 함수 Message Authentication and Hash Functions
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
Error Detection and Correction
정보화 사회와 컴퓨터 보안.
9장. 디지털 증거의 무결성 유지.
Chap 4. 공개키 암호.
제 12장 난수 예측 불가능성의 원천.
웹어플리케이션보안 forge – 자바스크립트 암호 라이브러리
Chapter 07. 기본 함수 익히기.
제9장 공개키 암호 (I) Public-key Cryptography
암호화 및 인증.
전자상거래 보안 (암호학과 네트워크보안) ) Chul Ho Rhee
자바 암호 프로그래밍 Java Cryptography Programming
인터넷응용프로그래밍 JavaScript(Intro).
웹어플리케이션보안 암호프로그래밍, crypto-js
자바스크립트 암호 프로그래밍 Javascript Cryptography Programming
전자서명의 형태 수기서명 디지털서명. 전자서명의 형태 수기서명 디지털서명 전자서명의 필요성.
(c) Byoungcheon Lee, Joongbu Univ.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
뇌를 자극하는 Windows Server 장. 원격 접속 서버.
인터넷응용프로그래밍 JavaScript(Intro).
웹디자인
보고서 (due 5/8) 다음과 같은 방식으로 문제를 해결하시오. 문제 분석 알고리즘 작성 프로그램 작성 테스트 및 검증
16 장 네트워크 보안 : 방화벽과 VPN 16.1 개요 16.2 기밀성 16.3 전자 서명 16.4 인터넷 보안
KERBEROS.
제 13장 PGP 암호 기술을 조합하는 기술.
비대칭 암호화 알고리즘 공개키 암호화 알고리즘 소속 : 한세사이버보안고등학교 조장 : 안도현
VHDL를 이용한 DES 설계 정보통신컴퓨터공학부 5조 김인옥, 백미숙
SSL, Secure Socket Layer
암호학 응용 Applied cryptography
Introduction to JSP & Servlet
암호학 응용 Applied cryptography
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
JSP Programming with a Workbook
(c) Byoungcheon Lee, Joongbu Univ.
채팅 및 파일전송 프로그램 권 경 곤 김 창 년.
암호 시스템 (Crypto system) 신효철
6 객체.
자바 암호 프로그래밍 Java Cryptography Programming
Presentation transcript:

암호학 응용 Applied cryptography 2017. 9. 중부대학교 정보보호학과 이병천 교수

차례 1. 강의 개요 2. Javascript Cryptography 3. Node.js crypto 4. CryptoJS 5. Forge 6. Web Crypto API

3. Crypto

Node.js crypto Node.js에 내장된 기본 암호 라이브러리 API https://nodejs.org/dist/latest-v6.x/docs/api/crypto.html 별도로 패키지 설치할 필요없이 node.js 프로그래밍에 적용 가능

해쉬함수 X 해쉬함수(hash function)란? 임의의 길이의 데이터를 입력받아서 고정된 길이의 특징값을 출력하는 함수 임의의 길이의 데이터를 입력받아서 고정된 길이의 특징값을 출력하는 함수 메시지 다이제스트(message digest)라고도 부름 암호키를 사용하지 않는 공개된 함수. 동일한 입력값에 대해 항상 동일한 해쉬값 을 출력함 입력값으로부터 해쉬값을 계산하는 것은 쉽 지만 해쉬값으로부터 그것을 출력하는 입력 값을 찾는 것은 어려움 Message M H X Message Digest D D = H(M)

해쉬함수 해쉬함수의 요구조건 역상 저항성(Pre-image resistance): 주어진 출력에 대하여 입력 값을 구하는 것이 계산상 불가능하다. 제2 역상 저항성(Second pre-image resistance): 주어진 입력에 대하여 같은 출력을 내는 또 다른 입력을 찾아내는 것이 계산상 불가능하다. 충돌저항성(Collision resistance): 같은 출력을 내는 임의의 서로 다른 두 입력 메세지를 찾는 것이 계산상 불가능하다.

해쉬함수의 용도 메시지 다이제스트: 문서의 위조 방지 안전한 난수생성 패스워드 저장 체크섬 생성 및 검증 해쉬값을 생성하여 함께 제공 전자서명과 함께 사용 안전한 난수생성 SecureRandom에서 해쉬함수를 이용 패스워드 저장 사용자의 패스워드를 서버에서는 암호화된 해쉬값으로 저장 패스워드 기반 키생성 알고리즘 (PBKDF2) 체크섬 생성 및 검증 인터넷으로 배포되는 소프트웨어의 원본 보증

해쉬함수 해쉬 알고리즘 Md5 Sha1 Sha256 Sha384 Sha512

const crypto = require('crypto'); const inputText = 'Some data to hash'; console.log('Input Text: '+inputText); var hash; // Hex output hash = crypto.createHash('md5'); hash.update(inputText); console.log('MD5: '+hash.digest('hex')); hash = crypto.createHash('SHA1'); console.log('SHA1: '+hash.digest('hex')); hash = crypto.createHash('SHA256'); console.log('SHA256: '+hash.digest('hex')); hash = crypto.createHash('SHA384'); console.log('SHA384: '+hash.digest('hex')); hash = crypto.createHash('SHA512'); console.log('SHA512: '+hash.digest('hex')); // Output Encoding hash = crypto.createHash('SHA256'); hash.update(inputText); console.log('SHA256(hex): '+hash.digest('hex')); console.log('SHA256(base64): '+hash.digest('base64')); console.log('SHA256(latin1): '+hash.digest('latin1')); F:\AppliedCrypto\crypto>node hash.js Input Text: Some data to hash MD5: 077ee0fe3fdbcd344904950300a2e2c2 SHA1: f07c2990ab83da4e2026b600a6045ab43afa6a6e SHA256: f9d06a6c534e312190f2715b1d7feacc5c6c7edd39200a89aa47b7eaf42ce131 SHA384: 3ea5799fb18c61a2c9d4b66b28aa12ebed46c6c945d6f99dc990b769f867a7db7334584c4ec5ce4cad5d436941320a2f SHA512: fa3e05f8e45c756358998de0bb2f8f9852ab96cc530700e9898e5230f93628a1a4109f0488c4d36e4aec0cc25aec9bb010e13270d5e91a8755cead120e10e7b3 SHA256(hex): f9d06a6c534e312190f2715b1d7feacc5c6c7edd39200a89aa47b7eaf42ce131 SHA256(base64): +dBqbFNOMSGQ8nFbHX/qzFxsft05IAqJqke36vQs4TE= SHA256(latin1): ùÐjlSN1!òq[êÌ\l~Ý9 ‰ªG·êô,á1

MAC (메시지인증코드) MAC(메시지인증코드)란? MAC: Message Authentication Code 해쉬함수와 공유된 비밀키를 이용하여 송수신하는 메시지의 원 본성을 인증하는데 사용 MAC은 대칭키 암호알고리즘처럼 송신자와 수신자 사이의 공유 된 비밀키가 필요 MAC 계산에는 공유된 비밀키를 이용하므로 송신자와 수신자만 계산하고 검증할 수 있음. 송신하는 메시지의 인증성을 제공. 중간에서 공격자가 메시지를 변조하는 것을 방지 가능 송신자는 입력메시지와 비밀키를 이용하여 hmac 계산하여 전송. 수신자는 전송된 메시지와 비밐리를 이용하여 hmac 값이 맞는 지 검증.

MAC

Hash와 MAC의 비교 Hash MAC

MAC의 한계 제3자에게 MAC의 유효성 여부를 증명하지 못함 부인방지 불가 이것을 증명하려면 공유된 비밀키를 제3자에게 공개해야 함 부인방지 불가 송신자가 메시지를 보내지 않았다고 부인하는 경우 분쟁 해결이 어려움. 수신자도 동일한 MAC을 계산할 수 있기 때문 부인방지 기능을 제공하기 위해서는 전자서명을 사용

HMAC 알고리즘 From Wikipedia

HMAC 알고리즘 HMAC keyed-hash message authentication code RFC 2104 일방향 해시함수를 이용하여 메시지 인증코드를 구성하는 방법

Hmac const crypto = require('crypto'); const inputText = 'Some data to compute hmac'; const key = 'supersecretkey'; var hmac; hmac = crypto.createHmac('md5', key); hmac.update(inputText); console.log('HMAC-MD5: '+hmac.digest('hex')); hmac = crypto.createHmac('sha1', key); console.log('HMAC-SHA1: '+hmac.digest('hex')); hmac = crypto.createHmac('sha256', key); console.log('HMAC-SHA256: '+hmac.digest('hex')); hmac = crypto.createHmac('sha384', key); console.log('HMAC-SHA384: '+hmac.digest('hex')); hmac = crypto.createHmac('sha512', key); console.log('HMAC-SHA512: '+hmac.digest('hex')); F:\AppliedCrypto\crypto>node hmac.js HMAC-MD5: 1d49fcc0e2edeaa663c95d57d7c460f9 HMAC-SHA1: 2be3467e078e92f2e46e74852e9477414dd7ce6d HMAC-SHA256: 8e4f8d27c5e5f9feafc1101ba18b2b03925aa20f62d7be49c16c9d1f466a41a7 HMAC-SHA384: 469d53d9bff4268093b760b9685fd888b0adbb896f45c1540feade41d533fdf3ab1d7198dc43570f1dc5f2335d12ac4f HMAC-SHA512: 43495db2283c7b13cebaa8e2960b20eb19b99822b4f552f16bd3c5494493edd77454d761d38d4c74f535a4bc3838f050b3098fedbe87a3f4077f7369b1480e7c

패스워드 기반 키생성 패스워드와 비밀키 패스워드 기반 키생성함수 (PBKDF2) 사용자가 입력하는 패스워드를 직접 암호알고리즘의 비밀키로 사용하는 것은 추측 가능한 키를 사용하게 되므로 위험 무작위 대입공격, 사전공격 가능 난수화된 비밀키를 사용해야 함 패스워드 기반 키생성함수 (PBKDF2) Password-Based Key Derivation Function v2 (1)사용자 입력 패스워드, (2)랜덤한 salt값, (3)반복횟수(iteration) 값을 이용하여 난수처럼 보이는 비밀키를 생성하여 사용 salt값과 반복횟수 값은 공격자의 사전공격을 어렵게 하는 중요 한 요소

Pbkdf2 – 패스워드기반 키생성 사용자 입력의 패스워드로부터 암호키를 생성 Random salt 와 iteration을 사용 Random salt 와 iteration은 최종 pbkdf2 hashed value에 포함됨 서버에서 사용자 패스워드 저장에 사용

Pbkdf2 – 패스워드기반 키생성 // pbkdf2.js const crypto = require('crypto'); // Asynchronous key generation // crypto.pbkdf2(password, salt, iterations, keylen, digest, callback) crypto.pbkdf2('secret', 'salt', 100000, 256, 'sha512', (err, key) => { if (err) throw err; console.log('Generated key (async): '+key.toString('hex')); // '3745e48...aa39b34' }); // Synchronous key generation // crypto.pbkdf2Sync(password, salt, iterations, keylen, digest) const key = crypto.pbkdf2Sync('secret', 'salt', 100000, 256, 'sha512'); console.log('Generated key (sync): '+key.toString('hex')); // '3745e48...aa39b34'

난수 생성 – Random Number Generation 예측할 수 없는 난수 생성이 중요 암호의 안전성을 제공하는 기반기술 의사난수생성기 (pseudo random number generator)

난수 생성 // rand.js const crypto = require('crypto'); // Asynchronous (비동기 콜백 이용) crypto.randomBytes(256, (err, buf) => { if (err) throw err; console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`); }); // Synchronous (동기식 생성) const buf = crypto.randomBytes(256); console.log( `${buf.length} bytes of random data: ${buf.toString('hex')}`);

난수를 이용한 pbkdf2 매번 다른 출력 생성 const crypto = require('crypto'); // Randomized pbkdf2 var salt; salt = crypto.randomBytes(100).toString('hex'); console.log('Salt: '+salt); crypto.pbkdf2('secret', salt, 100000, 256, 'sha512', (err, key) => { if (err) throw err; console.log('Generated key (async): '+key.toString('hex')); }); const key = crypto.pbkdf2Sync('secret', salt, 100000, 256, 'sha512'); console.log('Generated key (sync): '+key.toString('hex')); 매번 다른 출력 생성

대칭키 암호 송신자와 수신자가 동일한 비밀키를 공유 비밀키를 이용한 메시지 암호화 동일한 비밀키를 이용한 암호문 복호화 암호 알고리즘 AES, DES, 3DES

대칭키 암호 방식

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

블록 암호 알고리즘 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 라운드

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

대칭키 암호 Crypto 폴더 생성 예제코드 작성 실행 cipher.js > node cipher.js const crypto = require('crypto'); const plaintext = "hello world. 반갑습니다..."; const key = "supersecretpassword"; const cipher = crypto.createCipher('aes192', key); console.log('Plaintext: '+plaintext); console.log('Key: '+key); let encrypted = cipher.update(plaintext, 'utf8', 'hex'); encrypted += cipher.final('hex'); console.log('Ciphertext: '+encrypted); const decipher = crypto.createDecipher('aes192', key); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); console.log('Decrypted: '+decrypted); Crypto 폴더 생성 예제코드 작성 cipher.js 실행 > node cipher.js F:\AppliedCrypto\crypto>node cipher.js Plaintext: hello world. 반갑습니다... Key: supersecretpassword Ciphertext: e23e431eec17b7f796603d2d07891ee872f3ccc1c60ab75599f16a6ea3ff364b Decrypted: hello world. 반갑습니다...

대칭키 암호 난수로 생성된 세션키 이용 const crypto = require('crypto'); const plaintext = "hello world. 반갑습니다..."; const key = crypto.randomBytes(128).toString('hex'); const cipher = crypto.createCipher('aes192', key); console.log('Plaintext: '+plaintext); console.log('Key: '+key); let encrypted = cipher.update(plaintext, 'utf8', 'hex'); encrypted += cipher.final('hex'); console.log('Ciphertext: '+encrypted); const decipher = crypto.createDecipher('aes192', key); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); console.log('Decrypted: '+decrypted);

공개키 암호 대칭키 암호에서의 키관리 문제 통신의 비밀을 유지하기 위해서는 각 사용자들간의 통신에 서로 다른 비밀키를 사용해야 함 사용자가 n명인 경우 전체 nC2=n(n-1)/2 개의 키가 필요 각 사용자는 n-1개의 키를 관리해야 함, 매우 복잡 b a c d e

공개키 암호의 도입 공개키 암호 (비대칭키 암호) 하나의 쌍이 되는 두 개의 키를 생성하여 하나는 암호화에 사용 하고 다른 하나는 복호화에 사용한다. 암호화에 사용하는 키는 공개할 수 있어서 공개키라고 부르고 복 호화에 사용하는 키는 사용자만이 안전하게 보관해야 하는 키로 개인키(비밀키)라고 부른다. 두 개의 키가 서로 다르므로 비대칭키 암호라고 부르며 하나의 키를 공개하므로 공개키 암호라고도 부른다. 암호화:공개키 복호화:개인키

비밀키 암호와 공개키 암호 비밀키 암호 (대칭키 암호) 공개키 암호 (비대칭키 암호)

RSA 알고리즘 1977년 RSA 알고리즘 등장 Shamir Rivest Adleman

RSA 알고리즘 RSA 알고리즘 키생성 암호화 복호화

전자서명이란? 서명의 변천 전자서명이란? 암호기술을 이용하여 전자문서에 대한 서명기능을 구현한 것

전자서명이란? 전자서명

전자서명의 활용 사용자 인증 메시지 인증 로그인 등에서 사용자 확인을 위해 사용 로그인 메시지를 사용자의 개인키로 서명하여 전송, 서버에서 사 용자의 공개키로 검증 인터넷뱅킹, 전자정부서비스 로그인 메시지 인증 메시지에 전자서명을 부가하여 사용자의 서명 사실을 증명 수신자는 사용자의 공개키로 서명을 검증 부인방지 기능 제공

공개키 암호, 전자서명 공개키 암호, 전자서명 관련 함수 제공 그러나 키생성 함수를 제공하지 않음 키쌍을 다른 방식으로 생성하여 사용할 수는 있음 const crypto = require('crypto'); const sign = crypto.createSign('RSA-SHA256'); sign.update('some data to sign'); const privateKey = getPrivateKeySomehow(); console.log(sign.sign(privateKey, 'hex')); // Prints: the calculated signature const verify = crypto.createVerify('RSA-SHA256'); verify.update('some data to sign'); const publicKey = getPublicKeySomehow(); const signature = getSignatureToVerify(); console.log(verify.verify(publicKey, signature)); // Prints: true or false

Diffie-Hellman 키합의 두 사용자 A, B가 공개통신채널을 통해 비밀키를 합의 공격자가 통신을 도청하더라도 비밀키를 계산하지 못함

Diffie-Hellman 키합의 // dh.js const crypto = require('crypto'); const assert = require('assert'); // Generate Alice's keys... const alice = crypto.createDiffieHellman(1024); const aliceKey = alice.generateKeys(); console.log('Alice Key: '); console.log(aliceKey.toString('hex')); // Generate Bob's keys... const bob = crypto.createDiffieHellman(alice.getPrime(), alice.getGenerator()); const bobKey = bob.generateKeys(); console.log('Bob Key: '); console.log(bobKey.toString('hex')); // Exchange and generate the secret... const aliceSecret = alice.computeSecret(bobKey); const bobSecret = bob.computeSecret(aliceKey); console.log('Alice Secret: '); console.log(aliceSecret.toString('hex')); console.log('Bob Secret: '); console.log(bobSecret.toString('hex')); // OK assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex')); if( aliceSecret.toString('hex') == bobSecret.toString('hex') ) { console.log('Key agreement successful...'); } else { console.log('Something wrong'); }

Node.js crypto 패키지 기본 내장 패키지이므로 별도의 설치 필요 없음 공개키 암호는 키생성 함수 제공하지 않음. 키쌍은 다른 방식으로 생성하여 사용 가능 브라우저의 클라이언트 프로그래밍에서 동일한 함수를 사용하지 못함. 클라이언트 프로그래밍에서 사용하는 암호 함수들과의 호환성 검토/테스트 필요