공개키 암호화 프로그래밍 전자상거래보안.

Slides:



Advertisements
Similar presentations
Ⅰ. 연산자 Ⅱ. 제어 구조. 연산자 : 할당 연산자 - 사용자가 정의한 변수에 임의의 값을 저장하는 기능 strvar = strVar1+ “ Hello ”
Advertisements

Chapter | 4 암호화 기술 Ⅱ암호화. ❖ 암호  통신문의 내용을 제 3자가 판 독할 수 없는 글자 · 숫 자 · 부호 등으로 변경 시킨 것 2/16 암호? 철수 영희 Plaintext attack attack ? ? Cryptography 개방통신로 모레 3.
최성락 최인석 나주한. 특징 : 공개키 n, g 를 사용하여 키 분배가 가능. (g 는 Zn 의 primitive element) Discrete logarithm 에 기반. 두 명 이상의 경우에도 적용가능. 키 교환 없이도.
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
1 정보보안 경일대학교컴퓨터공학과 김 현 성 2 강의구성  교과목 소개 (1 주 )  산업체 전문가 특강실시 (2 주 )  소프트웨어 공학 (3 주 ~7 주 : 5 주 )  산업체 전문가 특강실시 (8 주 )  팀 프로젝트 (9 주.
Power Java 제6장 조건과 반복.
Chapter 10 비대칭 키 암호 Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
10. 예외 처리.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
(c) Byoungcheon Lee, Joongbu Univ.
(c) Byoungcheon Lee, Joongbu Univ.
현대암호편: RC5,ElGamal,Rabin
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
Chapter 7. 조건문.
전자계산학과 대학원 그룹웨어 연구실 진 훈 Code and RSA 전자계산학과 대학원 그룹웨어 연구실 진 훈
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
자바 암호 프로그래밍 Java Cryptography Programming
자바 암호 프로그래밍 Java Cryptography Programming
1.정보보호 개론(1).
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
KIM HEESANG JDBC Programming 3 KIM HEESANG
교과목 소개 정보보호.
암호학 응용 Applied cryptography
Lesson 9. 예외처리.
File Depender 중간 발표.
P150 문제를 프로그래밍 할 것 Source file (헤더파일포함), 실행화면 (학번_이름_1.txt)
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
Chap 4. 공개키 암호.
2007 1학기 11 프로젝트 기초 실습.
암호학의 기초 ,(월).
제9장 공개키 암호 (I) Public-key Cryptography
Ⅲ. 이 차 방 정 식 1. 이차방정식과 그 풀이 2. 근 의 공 식.
3. while문 반복문의 종류 while 문 while( 조건식 )        문장;.
Lesson 4. 수식과 연산자.
자료구조: CHAP 7 트리 –review 순천향대학교 컴퓨터공학과 하 상 호.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
웹어플리케이션보안 암호프로그래밍, crypto-js
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
전자서명의 형태 수기서명 디지털서명. 전자서명의 형태 수기서명 디지털서명 전자서명의 필요성.
(c) Byoungcheon Lee, Joongbu Univ.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
연산자 (Operator).
Chapter 11 함수 활용.
3D 프린팅 프로그래밍 01 – 기본 명령어 강사: 김영준 목원대학교 겸임교수.
제 3 강.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
16 장 네트워크 보안 : 방화벽과 VPN 16.1 개요 16.2 기밀성 16.3 전자 서명 16.4 인터넷 보안
자바 암호 프로그래밍 Java Cryptography Programming
[INA470] Java Programming Youn-Hee Han
자바 5.0 프로그래밍.
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
1. 2진 시스템.
컴퓨터 개론 √ 원리를 알면 IT가 맛있다 쉽게 배우는 컴퓨터 기본 원리 한빛미디어 교재출판부.
비대칭 암호화 알고리즘 공개키 암호화 알고리즘 소속 : 한세사이버보안고등학교 조장 : 안도현
VHDL를 이용한 DES 설계 정보통신컴퓨터공학부 5조 김인옥, 백미숙
01 로그의 정의 ⑴ 일 때, 양수 에 대하여 을 만족시키는 실수 는 오직 하나 존재한다. 이때 를
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Modulo 연산.
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
Flow Diagram IV While.
문장제 쉽게 풀기 -최소공배수 응용 문제.
(c) Byoungcheon Lee, Joongbu Univ.
수치해석 ch3 환경공학과 김지숙.
적용 가능 시간표 무한 생성 기계 2007/06/18 최석훈.
암호 시스템 (Crypto system) 신효철
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
컴퓨터는 어떻게 덧셈, 뺄셈을 할까? 2011년 10월 5일 정동욱.
자바 암호 프로그래밍 Java Cryptography Programming
Presentation transcript:

공개키 암호화 프로그래밍 전자상거래보안

차례 1. 잉여계에서의 사칙연산 2. Java.math.BigInteger 클래스 이용하기 모듈러승산 계산 (Square-and-Multiply 알고리즘) 모듈러승산 테이블 만들기 두 수의 최대공약수 계산 확장유클리드 알고리즘으로 역수 계산 2. Java.math.BigInteger 클래스 이용하기 BigInteger 클래스를 이용한 사칙연산 RSA 알고리즘 구현 ElGamal 알고리즘 구현 Schnorr 서명 알고리즘 구현

Z23에서의 모듈러 승산 ^ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 1

모듈러 승산 테이블 만들기

두 수의 최대공약수 계산 ======= 최대공약수 ======= 첫 번째 자연수 >> 13 두 번째 자연수 >> 65 최대공약수: 13

확장 유클리드 알고리즘

BigInteger 클래스 Java.math.BigInteger 소수 생성 매우 큰 자릿수의 정수연산을 구현한 클래스 공개키 암호 등에 유용하게 이용됨 소수 생성 BigInteger p = b.nextProbablePrime(); // b보다 큰 첫번째 소 수를 출력 BigInteger c = BigInteger.probablePrime(bit,rnd); 특정 비트수의 임의의 소수 생성

모듈러 연산 r=a.gcd(b); // a와 b의 최대공약수 System.out.println("gcd("+a+","+b+") = "+r); r=a.modPow(b, p); // a^b mod p System.out.println(a+"^"+b+" mod "+p+" = "+r); r=a.modInverse(p); // a^{-1} mod p System.out.println(a+"^-1 mod "+p+" = "+r); BigInteger r; r=a.add(b).mod(p); // a+b mod p System.out.println(a+" + "+b+" mod "+p+" = "+r); r=a.subtract(b).mod(p); // a-b mod p System.out.println(a+" - "+b+" mod "+p+" = "+r); r=a.multiply(b).mod(p); // a*b mod p System.out.println(a+" * "+b+" mod "+p+" = "+r); r=a.divide(b).mod(p); // a/b mod p System.out.println(a+" / "+b+" mod "+p+" = "+r+" ???"); r=a.multiply(b.modInverse(p)).mod(p); // a*b^{-1} mod p System.out.println(a+" * "+b+"^(-1) mod "+p+" = "+r);

RSA 알고리즘 특정 비트수의 임의의 소수 p, q 생성 키생성 BigInteger one = new BigInteger("1"); Random rnd = new Random(); int bitLength = 1024; int certainty = 10; BigInteger p = new BigInteger(bitLength/2, certainty, rnd); BigInteger q = new BigInteger(bitLength/2, certainty, rnd); System.out.println("Key Generation"); System.out.println("p = "+p); System.out.println("q = "+q); BigInteger n = p.multiply(q); System.out.println("n = p*q = "+n); BigInteger pin = (p.subtract(one)).multiply(q.subtract(one)); System.out.println("pi(n) = (p-1)*(q-1) = "+pin); BigInteger e = new BigInteger("17"); System.out.println("e = "+e); System.out.println("gcd(pin,e) = "+pin.gcd(e)); BigInteger d = e.modInverse(pin); System.out.println("d = "+d); System.out.println(" ");

RSA 알고리즘 암호화 복호화 //Encryption System.out.println("Encryption"); BigInteger m = new BigInteger("111111111111111111"); // message System.out.println("Plaintext = "+m); BigInteger c = m.modPow(e, n); System.out.println("c = m^e mod n = "+c); System.out.println(" "); //Decryption System.out.println("Decryption"); BigInteger mm = c.modPow(d, n); System.out.println("m = c^d mod n = "+mm);

ElGamal 암호 이산대수 문제의 어려움을 이용하는 공개키 암호 y  gx mod p g : 원시원소 p : 소수 y 가 주어졌을 때 x를 구하는 문제

ElGamal 암호 방식 (계속) 이산대수 문제 예 Z23 51  5 58  16 515  19 mod 23 18은 5의 몇제곱수인가? - 12 위 표가 없다면 어떻게 알아낼 수 있겠는가?

Z23 에서의 승산표 ^ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 1

ElGamal 암호 이산대수 문제의 어려움을 이용하는 공개키 암호

ElGamal 암호 1. 키생성 (Key Generation) q의 비트수를 입력하세요 (1000비트 이하)>> 100 q = 893969986680457324918139484461 소수 p = 2*q+1 p = 1787939973360914649836278968923 생성자 g는 g^q mod p != 1 인 수를 선정 g = 820174849967448717361379355251 개인키 x 는 임의로 선정 x = 1081656356240988029513654036663 공개키 y = g^x mod p y = 1494755450936895767639472657831 2. 암호화 (Encryption) 평문을 정수로 입력하세요 >>> 11111111111111 평문 M = 11111111111111 암호문 C1 = 1067955265774527936773629838650 암호문 C2 = 1257089196493716866579637835696 3. 복호화 (Decryption) 복호화된 평문 M = C2/C1^x mod p = 11111111111111

ElGamal 암호 좋은 소수 p 선택하기 생성자 g 찾기 소수 q를 선택. p=2q+1가 소수가 되는 경우를 찾음 난수 g를 선택하여 g^q mod p=1이 되는 수를 찾음 q = new BigInteger(bitLength, certainty, sr); // 첫번째 난수 do { p = q.multiply(two).add(one); if (p.isProbablePrime(1)) break; q = q.nextProbablePrime(); i++; } while (i<20); do { g = new BigInteger(bitLength, certainty, sr); if (!g.modPow(q, p).equals(one)) break; i++; } while (i<50);

ElGamal 암호 개인키 x는 임의로 선정. 공개키는 y=g^x mod p 계산 x = new BigInteger(bitLength, certainty, sr); y = g.modPow(x, p); System.out.println("개인키 x 는 임의로 선정 "); System.out.println("x = "+x); System.out.println("공개키 y = g^x mod p "); System.out.println("y = "+y);

ElGamal 암호 암호화 복호화 // ------------------- 암호화 ---------------------- System.out.println("\n2. 암호화 (Encryption) "); BigInteger M, C1, C2, k; System.out.print("평문을 정수로 입력하세요 >>> "); M = s.nextBigInteger(); k = new BigInteger(bitLength, certainty, sr); C1 = g.modPow(k, p); C2 = y.modPow(k, p).multiply(M).mod(p); System.out.println("평문 M = "+M); System.out.println("암호문 C1 = "+C1); System.out.println("암호문 C2 = "+C2); // ------------------- 복호화 ---------------------- System.out.println("\n3. 복호화 (Decryption) "); BigInteger temp = C1.modPow(x,p); BigInteger MM = C2.multiply(temp.modInverse(p)).mod(p); System.out.println("복호화된 평문 M = C2/C1^x mod p = "+MM);

Schnorr 서명 키생성 비밀키 xA 공개키 yA 서명 생성 는 m에 대한 서명 서명 검증

Schnorr 서명 1. 키생성 (Key Generation) q의 비트수를 입력하세요 (160)>> 30 p의 비트수를 입력하세요 (1024)>> 200 q = 785862709 loop = 71 p = 1575099955074729996735332870937559098373766739284997582249719 loop = 0 g = 904745875750278837202552822475586867599799335382239195889315 q|p-1 = 0 g^q mod p = 1 A의 개인키 = 256509342 A의 공개키 = 628276971617374031391797654344696306789765741109045988839154 2. 서명 생성 (Signing) 서명 = (m,U,V) m = This is a simple message for Schnorr signature. U = 336458072206080794537988899705062618778221672594125041907512 V = 489378877 3. 서명 검증 (Signature Verification) Left = 640040391421324111978016650741331607405215793265975221490882 Right = 640040391421324111978016650741331607405215793265975221490882 Schnorr signature is valid