2012-03-26 84 views
0

我需要使用RSA加密151 * 15大小的圖像。使用RSA加密圖像時出錯

這是java代碼加密圖像文件

import javax.crypto.Cipher; 
plaintext = time; 
cipher = Cipher.getInstance('RSA'); 
keygen = java.security.KeyPairGenerator.getInstance('RSA'); 
keyPair = keygen.genKeyPair(); 
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate()) 

plaintextUnicodeVals = uint16(plaintext) 
plaintextBytes = typecast(plaintextUnicodeVals, 'int8') 
ciphertext = cipher.doFinal(plaintextBytes); 

這是要加密

enter image description here

我得到了folllowing出錯

Java異常圖像文件:

javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes 
    at com.sun.crypto.provider.RSACipher.a(DashoA13*..) 
    at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..) 
    at javax.crypto.Cipher.doFinal(DashoA13*..) 

請給我提示或程序,以便我可以正確的方向。

謝謝

+0

我沒有看到在加密文本的圖像,而不是僅僅加密文本(這顯然是低於117個字節)的值。你能在這個思考過程中啓發我嗎? – 2012-03-26 17:31:02

+0

不要刪除重新提出幾乎相同的問題。 – CodesInChaos 2012-03-26 17:40:35

+0

@CoreyOgburn我用matlab將圖像讀入矩陣X.它的大小是151 * 15 = 2265。然後我將矩陣X變換成1 * 2265的行向量,它是給定代碼中的時間輸入。 – shree 2012-03-26 17:41:44

回答

4

您需要使用AES加密大數據。 RSA無法加密大於密鑰大小的數據。 因此,您可以使用RSA加密AES密鑰,並使用AES(256位)(即爲每個圖像生成不同的AES密鑰)加密整個圖像。

此外,如果要將圖像拆分爲大量117字節的塊並逐一加密,RSA非常慢,因此不適用於加密大數據。


例如:

public static byte[] encrypt(byte[] data) { 
    try { 
     KeyPair keyPair = initalizeKeyPair(); 

     final javax.crypto.Cipher rsa = javax.crypto.Cipher.getInstance("RSA"); 
     rsa.init(javax.crypto.Cipher.ENCRYPT_MODE, keyPair.getPublic()); 

     SecureRandom random = new SecureRandom(); 

     final byte[] secretKey = new byte[16]; 
     random.nextBytes(secretKey); 

     final javax.crypto.Cipher aes = javax.crypto.Cipher.getInstance("AES"); 
     SecretKeySpec k = new SecretKeySpec(secretKey, "AES"); 
     aes.init(javax.crypto.Cipher.ENCRYPT_MODE, k); 

     final byte[] ciphedKey = rsa.doFinal(secretKey); 
     final byte[] ciphedData = aes.doFinal(data); 

     byte[] result = new byte[256 + ciphedData.length]; 

     System.arraycopy(ciphedKey, 0, result, 0, 256); 
     System.arraycopy(ciphedData, 0, result, 256, ciphedData.length); 

     return result; 
    } catch (... e) { 
     throw new SomeException(e); 
    } 
} 
+0

其實我不得不使用RSA,雖然它需要時間。這只是一個項目來演示。如果你請告訴我如何在java中分割圖像。 – shree 2012-03-26 17:37:32

+1

您需要構建一個列表,其中每個元素由長度不超過11​​7個字節的元素組成,然後對每個元素進行加密,然後將它們連接成單個字節[]。但是請相信我,這太過分了。使用AES:http://en.wikipedia.org/wiki/Advanced_Encryption_Standard它是由美國政府批准的,非常安全。 – 2012-03-26 17:41:00