Presentation is loading. Please wait.

Presentation is loading. Please wait.

암호학 응용 Applied cryptography

Similar presentations


Presentation on theme: "암호학 응용 Applied cryptography"— Presentation transcript:

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

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

3 3. Crypto

4 Node.js crypto Node.js에 내장된 기본 암호 라이브러리
API 별도로 패키지 설치할 필요없이 node.js 프로그래밍에 적용 가능

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

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

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

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

9 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: 077ee0fe3fdbcd a2e2c2 SHA1: f07c2990ab83da4e2026b600a6045ab43afa6a6e SHA256: f9d06a6c534e312190f2715b1d7feacc5c6c7edd39200a89aa47b7eaf42ce131 SHA384: 3ea5799fb18c61a2c9d4b66b28aa12ebed46c6c945d6f99dc990b769f867a7db c4ec5ce4cad5d a2f SHA512: fa3e05f8e45c de0bb2f8f9852ab96cc530700e9898e5230f93628a1a4109f0488c4d36e4aec0cc25aec9bb010e13270d5e91a8755cead120e10e7b3 SHA256(hex): f9d06a6c534e312190f2715b1d7feacc5c6c7edd39200a89aa47b7eaf42ce131 SHA256(base64): +dBqbFNOMSGQ8nFbHX/qzFxsft05IAqJqke36vQs4TE= SHA256(latin1): ùÐjlSN1!òq[êÌ\l~Ý9 ‰ªG·êô,á1

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

11 MAC

12 Hash와 MAC의 비교 Hash MAC

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

14 HMAC 알고리즘 From Wikipedia

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

16 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: 2be3467e078e92f2e46e74852e dd7ce6d HMAC-SHA256: 8e4f8d27c5e5f9feafc1101ba18b2b03925aa20f62d7be49c16c9d1f466a41a7 HMAC-SHA384: 469d53d9bff b760b9685fd888b0adbb896f45c1540feade41d533fdf3ab1d7198dc43570f1dc5f2335d12ac4f HMAC-SHA512: 43495db2283c7b13cebaa8e2960b20eb19b99822b4f552f16bd3c edd77454d761d38d4c74f535a4bc3838f050b3098fedbe87a3f4077f7369b1480e7c

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

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

19 Pbkdf2 – 패스워드기반 키생성 // pbkdf2.js const crypto = require('crypto');
// Asynchronous key generation // crypto.pbkdf2(password, salt, iterations, keylen, digest, callback) crypto.pbkdf2('secret', 'salt', , 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', , 256, 'sha512'); console.log('Generated key (sync): '+key.toString('hex')); // '3745e48...aa39b34'

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

21 난수 생성 // 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')}`);

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

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

24 대칭키 암호 방식

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

26 블록 암호 알고리즘 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) 구조

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

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

29 대칭키 암호 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. 반갑습니다...

30 대칭키 암호 난수로 생성된 세션키 이용 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);

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

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

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

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

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

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

37 전자서명이란? 전자서명

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

39 공개키 암호, 전자서명 공개키 암호, 전자서명 관련 함수 제공 그러나 키생성 함수를 제공하지 않음
키쌍을 다른 방식으로 생성하여 사용할 수는 있음 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

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

41 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'); }

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


Download ppt "암호학 응용 Applied cryptography"

Similar presentations


Ads by Google