2014-04-05 3 views
0

자바에서 RSA를 수동으로 구현하고 있습니다 (예, 최선의 방법은 아니지만 대학 목적으로 사용하는 것으로 알고 있습니다). 내 알고리즘은 작은 텍스트로도 충분히 잘 작동하지만 빅 텍스트가 고려 될 때 알고리즘의 비트 수가 내 키보다 뛰어남에 따라 알고리즘이 중단됩니다.수동 구현 RSA java.

평범한 텍스트를 작은 것으로 조각 내고 암호화하기 위해 패딩 구성표를 구현할 수있는 가능성을 찾고 있습니다.

패딩 방법에 대한 제안 사항이 있습니까?

미리 감사드립니다.

+0

일반 텍스트를'BigInteger'로 표현하고'BigInteger'에 대해 RSA-scheme 연산을하는 것은 어떻습니까? – Drew

+0

이것은 내가 뭘하는지 .. 바이트에 문자열을 사용하여 biginteger 문자열을 만들고 다음 배열을 읽고.긴 텍스트의 경우 biginteger의 비트가 N보다 많아서 올바르게 암호화되지 않습니다. –

+0

OAEP를 포함하여 RSA 블록을 채우기위한 다양한 체계에 대해 [PKCS1 패딩] (http://tools.ietf.org/html/rfc3447)을 찾으십시오. –

답변

2

저는 divanov의 대답과 기본적으로 동일한 정보가 포함되어있는 답변을 작성하고 있지만 유감스럽게 생각합니다.하지만 중요한 부분을 모두 추가하는 편집은 답변을 완전히 다시 작성하는 것입니다.

일반적으로 데이터를 직접 비대칭으로 암호화하는 대신 RSA를 사용하여 데이터를 대칭 적으로 암호화하는 데 사용되는 대칭 키를 교환 할 수 있습니다. 당신은 ("Cryptography Engineering" by Ferguson, Kohno and Schneier에서 가져온 생각 나는 진심으로 추천 할 수있는 책) 이런 식으로 작업을 수행 할 수 있습니다

  1. l이 계수 n의 비트 길이라고 가정을 l-1 비트 길이의 난수 r를 생성합니다. r을 RSA 공개 키로 암호화하십시오.
  2. r 중에서 대칭 키 k을 생성하려면 암호화 해시 함수를 사용하십시오. 내가 sha256의 사용을 조언 할 것이다 : k=sha256(r)
  3. CBC과 같은 적절한 "모드"를 사용하여 AES256과 같은 블록 암호로 데이터를 암호화한다.

이 절차의 장점은 RSA 패딩에 전혀 신경 쓸 필요가 없다는 것입니다. 을 해독 후 r의 구조를 확인하십시오. 해시 기능을 사용하는 경우 내 답변의 범위를 벗어나는 패딩 오라클 공격 (this one과 유사)까지 자신을 열 수도 있습니다.

실제 시나리오의 경우 데이터의 authenticity도 신경 써야합니다. 암호화가 대부분을 차지하는 유일한 유스 케이스는 "데이터 at rest"입니다. 즉 데이터가 네트워크를 통해 전송되지 않고 데이터의 물리적 절도에만 관심이있는 경우입니다.

+0

도서 추천 및 알고리즘 설명에 대해 감사드립니다. 나는 구현하기를 고대하고 있습니다. 다시 한 번 감사드립니다! –

0

비대칭 키보다 긴 일반 텍스트를 암호화해야하는 경우 일반적으로 AES128과 같은 임의 대칭 암호화 블록 키가 생성 된 다음 데이터를 암호화하는 데 사용됩니다. 프로세스가 끝나면 대칭 키가 RSA 공개 키로 암호화되고 암호 텍스트와 함께 저장됩니다.

복호화는 개인 RSA 키로 대칭 키를 복구 한 다음 전자를 사용하여 긴 메시지를 암호 해독하는 것으로 구성됩니다.

이렇게하는 이유 중 하나는 RSA가 예를 들어 AES보다 훨씬 느리다는 것입니다. 또 다른 하나는 블록 암호가 메시지의 크기에 제한이 없다는 것입니다.