2012-11-21 111 views
12

我正在嘗試實現PKI。我想用java中的RSA加密大字符串而不使用彈性城堡。我得到的問題是數據不能超過117個字節。我試圖尋找失敗的解決方案。我是這個加密的新手。請給我一個大字符串作爲例子並解釋它。使用RSA在java中加密和解密大字符串

+2

安全性,尤其是密碼學,**很難**。您應該使用現有的高級包而不是原始加密API,或者瞭解其工作原理的詳細信息。否則,你可能會編寫不安全的代碼。 – SLaks

+1

高級包意味着什麼? –

+1

請發佈您的代碼。我們可以從那裏工作。 – Frank

回答

25

一次不能使用超過約128個字節的RSA加密解密。你必須拆分數據,並在循環中完成,幾乎將字節寫入String/Array。如果你唯一的問題是數據的大小,你可能沒有更多的要去。只是分割數據。

一個很好的例子,可能是更完整的你,擁有超過128個字節的字符串處理:http://coding.westreicher.org/?p=23

如果您需要在一般的RSA加密的詳細解釋:

下面的代碼演示瞭如何使用的KeyPairGenerator生成RSA密鑰對在Java中:

// 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(); 

這會給你一個KeyPair對象,它擁有兩個密鑰:一個私鑰和一個公佈我知道了。爲了使用這些密鑰,您需要創建一個Cipher對象,該對象將與SealedObject結合使用來加密您將通過網絡結束的數據。這裏是你如何做到這一點:

// 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()); 

初始化密碼後,我們就可以對數據進行加密。因爲在加密後,如果你看到它們是「裸體」的,所得到的數據沒有什麼意義,我們必須將它們封裝在另一個對象中。 Java通過SealedObject類提供了這一點。 SealedObjects是加密對象的容器,它使用Cipher對象加密和解密其內容。

下面的示例示出了如何創建和加密SealedObject的內容:

// 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對象,但這次使用不同的模式解密,並使用私鑰而不是公鑰。

這是你如何在Java中做到這一點:

// 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()); 

現在,密碼已準備好解密,我們必須告訴SealedObject解密所保持的數據。使用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); 

當心,因爲它返回一個對象(即使它實際上是String的實例),而不是類,這是加密前的一個實例的實例,讓你」必須將其轉換爲之前的形式。

以上是從: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