2013-04-04 22 views
6

Tôi có tệp khóa riêng pem, tôi đang sử dụng tệp đó để ký và mã hóa dữ liệu. ký hoạt động tốt và tôi cũng có thể xác minh trên nền tảng khác, nhưng trong khi mã hóa dữ liệu, tôi nhận được sau khi lỗi:Nhận lỗi java.lang.ArrayIndexOutOfBoundsException: quá nhiều dữ liệu cho khối 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) 

Sau đây là đoạn mã để trích xuất các phím từ tập tin cá nhân:

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

Và sau đây là đoạn mã để mã hóa dữ liệu:

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

Bất kỳ sự giúp đỡ để giải quyết vấn đề này sẽ được đánh giá cao.

Kính trọng, Yuvi

+0

điều đó có nghĩa là mảng của bạn có ít hơn 1 bản ghi. gỡ lỗi, bạn sẽ nhận được ý tưởng đó là vấn đề ở đâu –

+0

xem bài đăng này http://stackoverflow.com/questions/2579103/too-much-data-for-rsa-block-fail-what-is-pkcs7 –

+0

@ chintankhetiya có thể xây dựng một số chi tiết, mà mảng bạn đang nói về. – Yuvi

Trả lời

1

Vấn đề là ở lấy khóa công khai từ khóa riêng, Nó phải là như thế này:

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

thay vì:

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

Đó thông báo lỗi xảy ra khi bộ đệm đầu vào lớn hơn kích thước khối đầu vào của mật mã. Dường như không phải là trường hợp có chuỗi đầu vào ngắn, vì vậy nơi đầu tiên để xem là dòng trước đó. Tôi nghĩ rằng mật mã không được khởi tạo đúng cách, hay đúng hơn, không theo cách bạn mong đợi vì nó không ném một ngoại lệ. Tôi sẽ bắt đầu bằng cách thực hiện một số bản in gỡ lỗi của đối tượng mật mã sau cuộc gọi init().

0

Damn tôi đã có cùng một lỗi nhưng lý do là tôi đã đọc tài liệu để giải mã bằng cách sử dụng StringBuilder thay vì ByteArrayOutputStream (Ví dụ của StringBuilder sử dụng phương thức chắp thêm mà nối thêm dòng và phá hủy nguồn gốc để giải mã).

:/