2012-03-26 41 views
0

サイズ151 * 15の画像をRSAで暗号化する必要があります。RSAで画像を暗号化する際にエラーが発生する

これは私がfolllowingエラー

Java例外が発生しましたこれは

enter image description here

を暗号化する画像ファイルである画像ファイルを暗号化するための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); 

です:

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バイト未満に明らかである)テキストを暗号化テキストの暗号化画像の値が表示されません。あなたはその思考過程について私に啓発できますか? –

+0

実質的に同じ質問を削除しないでください。 – CodesInChaos

+0

@CoreyOgburn画像を行列Xに読み込むためにmatlabを使用しました。サイズは151 * 15 = 2265です。行列Xを1 * 2265の行ベクトルに変換しました。 – shree

答えて

4

大きなデータを暗号化するには、AESを使用する必要があります。 RSAは鍵のサイズより大きなデータを暗号化できません。 したがって、AESキーをRSAで暗号化し、イメージ全体をAES(256ビット)で暗号化することができます(つまり、イメージごとに異なるAESキーを生成します)。

RSAは非常に遅く、大量のデータを117バイトの多数のブロックに分割して1つずつ暗号化したい場合は、大量のデータを暗号化するのには向いていません。例えば


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

+1

リストを構築する必要があります。各要素は、117バイトを超えないサイズの要素で構成され、それぞれを暗号化して1バイトの[]に連結します。 しかし、私を信じて、これは過剰です。 AESを使用してください:http://en.wikipedia.org/wiki/Advanced_Encryption_Standardそれは米国政府によって承認され、非常に安全です。 –

関連する問題