2013-04-04 10 views
6

Mam prywatny plik kluczy PEM, używam tego pliku do podpisywania i szyfrowania danych. Podpisanie działa dobrze i jestem też w stanie sprawdzić na innej platformie, ale podczas szyfrowania danych, otrzymuję następujący błąd:Otrzymywanie błędu java.lang.ArrayIndexOutOfBoundsException: zbyt dużo danych dla bloku RSA

04-04 09:55:51.821: E/AndroidRuntime(2725): FATAL EXCEPTION: Thread-102 
04-04 09:55:51.821: E/AndroidRuntime(2725): java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block 
04-04 09:55:51.821: E/AndroidRuntime(2725):  at com.android.org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(JCERSACipher.java:457) 
04-04 09:55:51.821: E/AndroidRuntime(2725):  at javax.crypto.Cipher.doFinal(Cipher.java:1106) 
04-04 09:55:51.821: E/AndroidRuntime(2725):  at com.example.testsigning.MainActivity.rsaEncrypt(MainActivity.java:185) 
04-04 09:55:51.821: E/AndroidRuntime(2725):  at com.example.testsigning.MainActivity$1.run(MainActivity.java:51) 
04-04 09:55:51.821: E/AndroidRuntime(2725):  at java.lang.Thread.run(Thread.java:856) 

Poniżej znajduje się fragment kodu, aby wyodrębnić klucze od prywatnej pliku:

// Read the file into string 
String privKeyPEM = readFile("/mnt/sdcard/rsa_key"); 

privKeyPEM = privKeyPEM.replace("-----BEGIN RSA PRIVATE KEY-----", ""); 
privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", ""); 

// Base64 decode the data 
byte[] encoded = Base64.decode(privKeyPEM, Base64.DEFAULT); 

// PKCS8 decode the encoded RSA private key 
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
mPrivKey = kf.generatePrivate(keySpec); 

RSAPrivateCrtKey privk = (RSAPrivateCrtKey) mPrivKey; 

RSAPublicKeySpec pubKeySpec = new java.security.spec.RSAPublicKeySpec(
     privk.getPublicExponent(), privk.getModulus()); 

mPubKey = kf.generatePublic(pubKeySpec); 

A Poniżej znajduje się fragment kodu zaszyfrować dane:

Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC"); 
cipher.init(Cipher.ENCRYPT_MODE, mPubKey); 
return cipher.doFinal("Hello World".getBytes()); // here is the problem 

Każda pomoc w celu rozwiązania problemu byłoby bardzo mile widziane.

Pozdrowienia, YuVI

+0

oznacza, że ​​Twoja tablica ma mniej niż 1 rekord. debugowania, otrzymasz pomysł, gdzie jest problem –

+0

sprawdzić ten post http://stackoverflow.com/questions/2579103/too-much-data-for-rsa-block-fail-what-is-pkcs7 –

+0

@ chintankhetiya może rozwinąć trochę więcej, o której macie mówić. – Yuvi

Odpowiedz

1

Problem polegał na pobraniu klucza publicznego z kluczem prywatnym, powinno być tak:

RSAPublicKeySpec pubKeySpec = new java.security.spec.RSAPublicKeySpec(
       privk.getModulus(), privk.getPublicExponent()); 

zamiast:

RSAPublicKeySpec pubKeySpec = new java.security.spec.RSAPublicKeySpec(
     privk.getPublicExponent(), privk.getModulus()); 
0

Ten komunikat o błędzie pojawia się, gdy bufor wejściowy jest większy niż rozmiar bloku wejściowego szyfru jest. Wydaje się mało prawdopodobne, aby miało to miejsce w przypadku krótkiego łańcucha wejściowego, dlatego pierwsze miejsce do wyświetlenia to poprzednia linia. Myślę, że szyfr nie został poprawnie zainicjowany, a raczej nie w sposób, jakiego oczekujesz, ponieważ nie rzuca wyjątku. Zacznę od wykonania niektórych odbitek debugujących obiektu szyfru po wywołaniu init().

0

Damn I miał ten sam błąd, ale powód był byłem czytanie materiału do odszyfrowania za pomocą StringBuilder zamiast ByteArrayOutputStream (Instancja StringBuilder używa metody append, która dołącza linię i uszkadza oryginalne źródło do odszyfrowania).

:/

Powiązane problemy