2014-08-30 3 views
-4

Java에서 3 가지 다른 비대칭 암호 알고리즘을 비교하는 프로그램을 작성해야합니다. 키 크기와 메시지 크기 (무작위로 생성됨)를 선택하고 모든 알고리즘이 동일한 텍스트를 동일한 차원의 키로 암호화하는 데 걸리는 시간을 보여주고 싶습니다.타원 곡선 Java

RSA, DSA 및 ECIES를 비교하고 싶습니다. 처음 두 가지는 아무런 문제가 없지만 마지막 하나는 무엇을해야할지 모르겠습니다.

주요 문제는 다음과 같습니다

타원 곡선을 사용하는 것이 안전
  1. ?
  2. 다른 키 크기에 대해 동일한 곡선을 사용할 수 있습니까?
  3. "ECIES"을 사용하는 Java에서 Cipher을 어떻게 만들 수 있습니까? 존재하지 않는 것 같습니다.

답변

2

ECIES는 적어도 현재 날짜까지는 정상적인 Java 라이브러리에는 없습니다. Bouncy Castle과 같은 도서관을 이용해야합니다.

커브의 품질을 보려면 http://safecurves.cr.yp.to (위가있는 경우)을 살펴보십시오. 도메인 매개 변수의 각 세트는 항상 키 크기에 직접 연결됩니다. 나는 Brainpool이 나 자신을 좋아한다는 것을 좋아한다. 그들은 당신이 그들을 약간주의해서 사용한다면 비교적 표준적이고 상대적으로 안전합니다.

참고 : RSA, DSA 또는 ECIES로 일반 텍스트를 직접 암호화하지 마십시오. 항상 하이브리드 암호화를 사용해보십시오. 최대 128, 192 또는 256 비트의 입력 크기와 비교하십시오.

그럼, 그만.

public static void main(String[] args) throws Exception { 
    Security.addProvider(new BouncyCastleProvider()); 

    KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECIES"); 
    ECGenParameterSpec brainpoolP256R1 = new ECGenParameterSpec(
      "brainpoolP256R1"); 
    kpg.initialize(brainpoolP256R1); 
    KeyPair kp = kpg.generateKeyPair(); 

    Cipher c = Cipher.getInstance("ECIES"); 
    c.init(Cipher.ENCRYPT_MODE, kp.getPublic()); 

    final byte[] aesKeyData = new byte[16]; 
    SecureRandom rng = new SecureRandom(); 
    rng.nextBytes(aesKeyData); 

    byte[] wrappedKey = c.doFinal(aesKeyData); 
    SecretKey aesKey = new SecretKeySpec(aesKeyData, "AES"); 
    Arrays.fill(aesKeyData, (byte) 0); 
} 
+0

구아바에는 멋진 'StopWatch' 클래스가 있습니다. –

+0

ECIES는 이미 하이브리드 암호화 방식이며 AES 암호화를 실행할 것입니다. 따라서 예제 코드는 몇 가지 추가 작업을 수행합니다. –

+0

@ RomanPlášil 예, ECIES *는 정의에 의한 것입니다. * 하이브리드 암호 시스템입니다. 기본적으로 ECDH를 사용하여 대칭 키를 설정합니다 (그리고 "보낸 사람"이 사용하는 일시적 개인 키를 버립니다). 따라서 ECIES 내의 비대칭 연산의 결과는 간단히 암호문이 아니라 비밀 키입니다. –