2012-11-21 2 views
12

PKI를 구현하려고합니다. 탄력성을 사용하지 않고 자바에서 RSA를 사용하여 큰 문자열을 암호화하고 싶습니다. 내가 얻는 문제는 데이터가 117 바이트보다 길면 안된다. 내가 실패한 솔루션에 대한 검색을 시도했습니다. 나는이 암호화에 초보자입니다. 예를 들어 큰 끈을 주면서 설명하고 설명해주십시오.RSA를 사용하여 Java에서 큰 문자열 암호화 및 암호 해독

+2

보안 및 특히 암호화는 ** 어렵습니다 **. 원시 crypto API 대신 기존의 고급 패키지를 사용하거나 작동 방식에 대한 세부 정보를 알아야합니다. 그렇지 않으면 안전하지 않은 코드를 작성할 가능성이 있습니다. – SLaks

+1

상위 수준 패키지 란? –

+1

코드를 게시하십시오. 우리는 거기에서 일할 수 있습니다. – Frank

답변

25

한 번에 약 128 바이트를 초과하는 RSA 암호화 암호 해독을 사용할 수 없습니다. 당신은 데이터를 나눠서 문자열로 배열을 작성하는 루프에서 처리해야합니다. 유일한 문제가 데이터의 크기라면, 더 이상 갈 필요가 없을 것입니다. 그냥 데이터를 분할.

좋은 예는 128 바이트보다 큰 문자열을 처리, 당신을 위해 가능성이 더 완전한 : 당신은 일반적으로 RSA 암호화에 대한 자세한 설명이 필요하면 http://coding.westreicher.org/?p=23

:

다음 코드는 방법을 보여줍니다

// Get an instance of the RSA key generator 
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
// Generate the keys — might take sometime on slow computers 
KeyPair myPair = kpg.generateKeyPair(); 

이 당신에게 두 개의 키를 보유하고 키 쌍 개체를 줄 것이다 : 자바에서 RSA 키 쌍을 생성하는 KeyPairGenerator의를 사용하여 개인과 1802 년을 ic. 이러한 키를 사용하려면 네트워크를 통해 끝낼 데이터를 암호화하기 위해 SealedObject와 함께 사용할 Cipher 객체를 만들어야합니다. 방법은 다음과 같습니다.

// Get an instance of the Cipher for RSA encryption/decryption 
Cipher c = Cipher.getInstance("RSA"); 
// Initiate the Cipher, telling it that it is going to Encrypt, giving it the public key 
c.init(Cipher.ENCRYPT_MODE, myPair.getPublic()); 

암호를 초기화 한 후에는 데이터를 암호화 할 준비가되었습니다. 암호화 후에는 결과 데이터가 "알몸"으로 보게되면 의미가 없기 때문에 다른 객체에 캡슐화해야합니다. 자바는 SealedObject 클래스에 의해 이것을 제공한다. SealedObject는 암호화 된 객체의 컨테이너이며, Cipher 객체를 사용하여 내용을 암호화하고 해독합니다.

// Create a secret message 
String myMessage = new String("Secret Message"); 
// Encrypt that message using a new SealedObject and the Cipher we created before 
SealedObject myEncryptedMessage= new SealedObject(myMessage, c); 

결과 객체 두려움없이 네트워크를 통해 전송 될 수 있으며,이 암호화되기 때문에 :

다음 예 만들고를 씰의 내용을 암호화하는 방법을 보여준다. 해독하고 데이터를 얻을 수있는 유일한 사람은 개인 키를 보유한 사람입니다. 일반적으로 이것은 서버 여야합니다. 메시지를 해독하려면 Cipher 객체를 다시 초기화해야하지만 이번에는 다른 모드로 해독하고 공개 키 대신 개인 키를 사용하십시오.

이것은 자바에서이 작업을 수행하는 방법입니다

// Get an instance of the Cipher for RSA encryption/decryption 
Cipher dec = Cipher.getInstance("RSA"); 
// Initiate the Cipher, telling it that it is going to Decrypt, giving it the private key 
dec.init(Cipher.DECRYPT_MODE, myPair.getPrivate()); 

을 이제 암호가 해독 할 준비가되어 있음을, 우리는 열린 데이터를 해독하기를 씰 알려야합니다. GetObject 메서드를 사용 때, 그리고 그것을 암호화하기 전에이었다 클래스의 인스턴스 (이 실제로 문자열의 인스턴스 인 경우에도) 객체의 인스턴스를 반환하기 때문에

// Tell the SealedObject we created before to decrypt the data and return it 
String message = (String) myEncryptedMessage.getObject(dec); 
System.out.println("foo = "+message); 

', 당신 때문에 조심 그것을 이전 형태로 캐스팅해야합니다. http://andreas.louca.org/2008/03/20/java-rsa-encryption-an-example/

6

RSA 벌크 데이터 암호화를 위해 의도되지 않는다 :

에서

위이다. 대신 AES와 같은 대칭 암호를 사용하여 "큰 문자열"을 암호화하십시오. 그런 다음 RSA 키로 AES에 사용되는 대칭 키를 암호화하십시오.

BouncyCastle은 S/MIME 및 PGP의 두 가지 프로토콜을 지원합니다. 모든 민감한 프라이버시 프로토콜은 이러한 방식으로 키 전송 또는 키 교환을위한 비대칭 알고리즘을 사용한다.

RSA로 암호화 할 수있는 메시지 크기는 키의 모듈러스에 따라 다르며 메시지를 안전하게 패딩하는 데 필요한 바이트 수는 적습니다.

+0

이와 같은 하이브리드 암호화가 가장 좋은 방법입니다. – CodesInChaos

+14

관련 API에 대한 코드 예제 또는 링크가 아프지 않습니다. – CodesInChaos