'비대칭'에 해당되는 글 2건

  1. 2015.11.05 Session key
  2. 2015.11.05 대칭 비대칭 암호화

Session key

UP!/Crypto 2015. 11. 5. 10:56

세션 키 암호화

 

     개념

가)    비대칭 암호화는 대칭 암호화보다 1000배 느림

나)    메시지는 대칭 키로 암호화하고 이 대칭 키가 수신자의 공개키로 암호화됨

다)    암호화된 공개 키는 메시지에 덧붙여서 수신자에게 전달됨

 

 

     예제

 

 import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class SimpleRSAExample {
 public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
  String plainText = "iloveyou";
  // 대칭 키 생성
  KeyGenerator keyGenerator = KeyGenerator.getInstance("Blowfish");
  keyGenerator.init(128);
  Key blowfishKey = keyGenerator.generateKey();
  
  Cipher blowfishCipher = Cipher.getInstance("Blowfish/ECB/PKCS5padding");
  blowfishCipher.init(Cipher.ENCRYPT_MODE, blowfishKey);
  
  byte[] ciphertext = blowfishCipher.doFinal(plainText.getBytes());
  
  System.out.println("암호화된 문서 : " + ciphertext);
  
  // RSA 키 쌍 생성
  KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  keyPairGenerator.initialize(1024);
  KeyPair keyPair = keyPairGenerator.genKeyPair();
  
  Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
  rsaCipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
  
  //대칭 키의 바이트 획득
  byte[] blowfishKeyBytes = blowfishKey.getEncoded();
  
  // 대칭 키 바이트를 RSA 개인키로 암호화
  byte[] cipherKeyBytes = rsaCipher.doFinal(blowfishKeyBytes);
  
  // 수신측에서 동작한다고 가정
  // 암호화된 문서와 암호화된 대칭키가 전달된다고 가정
  // 수신자의 공개키로 키 복호화
  rsaCipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
  byte[] decryptedKeyBytes = rsaCipher.doFinal(cipherKeyBytes);
  SecretKey newBlowfishKey = new SecretKeySpec(decryptedKeyBytes, "Blowfish");
  
  // 복호화된 대칭키로 전달된 암호문 복호화
  blowfishCipher.init(Cipher.DECRYPT_MODE, newBlowfishKey);
  byte[] decryptedText = blowfishCipher.doFinal(ciphertext);
  
  System.out.println("복호화된 문서 : " + new String(decryptedText));
 }

}

 

'UP! > Crypto' 카테고리의 다른 글

MAC  (0) 2015.11.05
MessageDigest  (0) 2015.11.05
대칭키 암호화  (0) 2015.11.05
패스워드 기반 암호화  (0) 2015.11.05
JCA, JCE  (0) 2015.11.05
Posted by 으랏차
,
 

암호화(Encryption) : 메시지를 숨겨 그 메시지의 수신자 외에는 아무도 못 읽게 하는 것.

인증(Authentication) : 메시지가 바뀌지 않았는지, 혹은 발신자, 수신자가 맞는지 확인하는 것

JCA : Java Cryptography Architecture

JCE : Java Cryptography Extension

 

대칭 암호화 알고리즘

 

     블록암호와 스트림 암호

가)    블록암호화 방식

     한번에 정해진 크기의 데이터를 암호화 하는 방식

     64bit or 128 bit 크기 단위로 적용

나)    스트림 암호화 방식

     1bit or 1btye의 데이터를 암호화 하는 방식

     소켓 같은 정보의 일정한 스트림을 암호화할 때 적당

 

     대칭 암호화 깨는 방법에 대해

가)    단문 무식하게 모든 가능한 키를 시도

나)    키 스페이스 : 후보 키들의 집합이며  만큼의 후보 키가 존재한다.

 

     대칭 암호화에 사용되는 알고리즘

가)    DES(Data Encryption Standard)

     가장 널리 알려진 대칭 암호화 기법

     56bit 키 사용

     DES의 변형으로 TripleDES(DESede)가 고안됨.

나)    TripleDES(DESede)

     DES를 다른 키에 세 번 적용시키는 방식

     암호화 / 복호화 / 또 다른 암호화 -> ede(encryption, decryption, encryption)

     키는 2개 또는 3개가 사용될 수 있음

다)    Blowfish

     DES보다 더 빠르고 안전한 블록 암호

     448비트 키 사용 가능

라)    RC4(Rivest’s Code 4)

     스트림 암호의 일종으로 SSL 구현에 많이 사용됨

     40bit or 128bit

마)    AES(Advanced Encryption Standard)

     Rijndael 알고리즘 사용

     128, 192, 256 bit 사용 가능

 

     대칭 암호화의 한계

가)    암호화 복호화에 같은 키가 적용됨

나)    ·수신자 모두 동일한 키를 가지고 있어야 함

다)    키를 안전하게 전달할 수 있는 방법은 무엇인가?

 

 

비대칭 암호화

 

     기능

가)    암호화에 쓰이는 공개 키와 복호화에 쓰이는 개인 키 2개를 사용

 

     비대칭 암호화 알고리즘

가)    RSA

     키 교체가 가능 즉, 개인키로 암호화하면 공개키로 복호화 가능

나)    EIGamal

     PGP SSL에 사용

 

     약점

가)    개인 키가 쉽게 공격 받을 수 있다.

     공개 키를 다른 사람의 것으로 바꿔치기 하는 방법에 허점이 발생

     공개 키에 대한 증명서를 첨부해서 해결함

나)    속도가 느리다.

     대칭 암호화에 비해 1000배 느림

 

     세션 키 암호화

가)    세션 키를 암호화 하는데 사용하고 세션 키는 공개 키를 이용하여 암호화 함

나)    세션 키는 대칭 암호화 방법을 사용

다)    생성한 세션 키를 상대방에게 전달해야 함

라)    PGP : 이메일을 암호화하는데 사용됨

마)    S/MIME : 안전한 이메일 전송을 위해 RSA가 고안한 방법

바)    SSL/TLS : Secure Socket Layer Transport Layer Security TCP/IP 트래픽을 보안하기 위해 만들어짐

 

     키 일치(Key Agreement)

가)    상대방의 공개 키와 자신의 개인 키를 이용하여 암호화를 위한 키 생성

나)    공유 비밀 키(shared secret key)를 만들어 암호화와 복호화에 사용

다)    상대방에게 공유 비밀 키를 전달할 필요 없음

라)    Diffie-Hellman 키 일치 알고리즘

     공개-개인 키 쌍을 이용한 첫번째 알고리즘

  

암호화 알고리즘 요약

  

     암호화 알고리즘 요약

가)    알고리즘의 능력 판단 기준

     알고리즘 종류 및 키의 크기

 

나)    대칭 암호화

알고리즘

종류 

키의 크기 

참고 

 DES

블록 

56 

 가장 많이 사용되지만 너무 취약함

 TripleDES

블록

 158(유효 112)

 DES의 강화버전

 Blowfish

블록

 488까지 임의 길이

 훌륭한 보안 제공

 RC4

스트림

 보통 40 또는 128

 빠른 스트림 암호화, 대부분의 SSL 구현에 사용됨

 AES

블록

 128, 192, 256

 DES 대용의 비교적 최근 암호화 기법

 

다) 비대칭 암호화

 알고리즘

종류 

키의 크기 

참고 

 RSA

블록 

512, 1024, 2048 

가장 많이 사용되는 공개 키 알고리즘

2000년도 특허 만료 

 EL Gamal

 블록

512, 1024, 2048 

 PGP 같은 프로토콜에 널리 사용됨

 

라) 키 일치 알고리즘

 알고리즘

종류 

키의 크기 

참고 

 Diffie-Hellman

키 일치 

보통 512, 1024 

최초의 공개 키 암호 작성 알고리즘 

 

 

출처 : http://blog.naver.com/xxrcn11?Redirect=Log&logNo=20134786143

'UP! > Crypto' 카테고리의 다른 글

패스워드 기반 암호화  (0) 2015.11.05
JCA, JCE  (0) 2015.11.05
인증, 전자서명  (0) 2015.11.05
블록 Padding  (0) 2015.11.05
base64 인코딩, 디코딩의 원리  (0) 2015.11.05
Posted by 으랏차
,