2012-03-26 3 views
0

RSA로 크기 151 * 15의 이미지를 암호화해야합니다. RSA로 이미지 암호화시 오류가 발생했습니다

는이

enter image description here

내가

Java 예외가 발생한 folllowing 오류가 발생했습니다 암호화 할 수있는 이미지 파일 이미지 파일

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

실질적으로 동일한 질문을 삭제하지 마십시오. I 매트릭스 X.Its 크기로 화상을 판독하는 MATLAB 사용 @CoreyOgburn – CodesInChaos

+0

는 I 주어진 코드 시간 입력 * 2,265 (1)의 행 벡터에 행렬 X를 변형 151 * 15 = 2265.Then이다. – shree

답변

4

대용량 데이터를 암호화하려면 AES를 사용해야합니다. RSA는 키 크기보다 큰 데이터를 암호화 할 수 없습니다. 그러면 RSA로 AES 키를 암호화하고 전체 이미지를 AES (256 비트)로 암호화 할 수 있습니다 (즉, 각 이미지마다 다른 AES 키 생성).

또한 RSA는 매우 느립니다 따라서 당신은 크기가 117 바이트 블록의 많은 수의 이미지를 분할하고 하나씩을 암호화 할 경우, 대량의 데이터를 암호화 좋지 않다. 예를 들어


:

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

사실 나는 어행 어떻게 자바에서 이미지를 분할 방법을 가르쳐주십시오 demonstrate.If하는 단지 프로젝트 걸릴 것입니다하지만 RSA를 사용해야합니다. – shree

+1

당신은 각 요소가 더 이상 117 바이트보다 크기의 요소로 구성 목록 를 구축하고 각 하나를 암호화 한 다음 단일 바이트 []로를 연결할 필요가있다. 하지만 믿어주세요, 이것은 잔인합니다. AES를 사용하십시오 : http://en.wikipedia.org/wiki/Advanced_Encryption_Standard 그것은 미국 정부의 승인을 받았으며 매우 안전합니다. –