2011-08-05 4 views
1

자바 표준 라이브러리를 사용하고 싶습니다. 알고있는 것만 큼 기능 입력이 제한됩니다. 그래서이 목적을 위해 두 가지 방법을 구현했습니다. 여기에 그들이있다 :RSA 암호화 및 긴 메시지의 암호 해독

private byte[] RSAenc(String in) throws Exception { 
    Cipher c = Cipher.getInstance("RSA"); 
    c.init(Cipher.ENCRYPT_MODE, privKey); 
    int l = in.length(); 

    byte[] part; 
    byte[] result = new byte[(int)(64*java.lang.Math.ceil(l/20.0))]; 
    int i = 0; 
    while(i*20+20<l) { 
     part = c.doFinal(in.substring(i*20,i*20+19).getBytes("UTF-8")); 
     System.arraycopy(part, 0, result, i*64, part.length); 
     i = i+1; 
    } 
    part = c.doFinal(in.substring(i*20,l-1).getBytes("UTF-8")); 
    System.arraycopy(part, 0, result, i*64, part.length); 
    return result; 

} 

private String RSAdec(byte [] in) throws Exception { 
    Cipher c = Cipher.getInstance("RSA"); 
    c.init(Cipher.DECRYPT_MODE, privKey); 

    String result = ""; 
    byte[] part = new byte[64]; 
    int l = in.length; 
    int i = 0; 
    while(i+64<=l) { 
     System.arraycopy(in, i, part, 0, part.length); 
     result = result + new String(c.doFinal(part), "UTF-8"); 
     i= i+64; 
    } 
    return result; 
} 

그들은 이러한 방식으로 작동 : 암호화를 위해 내가 그들을 암호화 할 암호를 사용 후 최대 20 개 크기의 문자열에 문자열을 중단합니다. 암호 해독을 위해 바이트 배열을 64 바이트 블록으로 나누고 암호 해독을 적용합니다. 이미이 기능이 있습니까? 아니면 적어도 깔끔한 해결책이 있습니까? 나의 접근은 얼마나 안전합니까? 암호화 결과 길이 (result.length)는 JRE의 모든 배포에서 항상 64입니까?

고맙습니다,

+0

참조 [RSA와 같은 비대칭 암호화를 사용하여 임의의 길이의 일반 텍스트를 암호화하는 방법은 무엇입니까?] (http://crypto.stackexchange.com/questions/14/how-can-i-use-asymmetric crypto.stackexchange.com에서 rsa-to-encrypt-any-any-length와 같은 -encryption-such as)를 사용하십시오. –

답변

5

RSA 암호 용 키, 벌크 데이터 암호화에 적합하다.

RSA로 메시지를 암호화하는 대신 대부분의 프로토콜은 AES와 같은 대칭 암호에 대한 키를 생성하고이를 사용하여 메시지를 암호화합니다. 그런 다음 RSA를 사용하여 해당 대칭 키를 암호화하므로 메시지받는 사람 만 RSA를 복구 할 수 있습니다. RSA로 암호화 된 대칭 키가 AES 암호화 된 메시지와 함께 수신자에게 전송됩니다.

+0

감사합니다 ... 대칭 키 (AES 또는 DES의 경우)는 항상 64 (RSA 암호화 기의 최대 값) 바이트보다 작습니까? –

+0

@kvphxga : 좋은 RSA 키는 적어도 2048 비트 여야하므로 64 바이트 이상을 암호화 할 수 있어야합니다. 그러나 그렇습니다.이 모든 암호는 64 바이트 이하의 키를 사용합니다. – erickson

+0

@kvphxga : DES는 56 비트 키를 가지고 있습니다. 이것은 아주 작기 때문에 오늘 사용해서는 안됩니다 (brute-forcing이 그렇게 많은 시간을 소비하지 않기 때문에). AES는 키 크기 128 비트 (16 바이트), 192 비트 (24 바이트) 또는 256 비트 (32 바이트)의 세 가지 변형을 가지고 있으며 안전하다고 간주됩니다. –