Różnica Androida / JVM w deszyfrowaniu RSA
Próbuję odszyfrować ciąg, który zaszyfrowałem gdzie indziej. Oto mój kod:
<code>private void test() { try { String stringMessage="Sf3O7Lr2+WN5szGyLejL3CjuBRZtQ72+ZBmgVTgWnatQZxUElzaBqFa1p0SVBqe9VWVxCxdEkejMVtDGEr0UJSVSK8EB/fPI6v8JE8dIu0JN0mMs4xlowhITy0tQR+1pcBtDFjzOl33xxQcq5JuPezxRDxFIp+IVkD8FdpqlttEKf2Tvqw9tqsdgiBKb5xDvKrkIDQXdLBh1gbAVZDSJYGHRkcOA8vz2ty/PeooKkfDK6IOn7KBwOBgSRgQr/MLBF3Xk2vRWgVGRh/fRkzu21EWo99Q5moWKxWl3HW/bbgTBQTb097XP3NTID9kSPhCfL0BEfBxonuNse5GBoeRnCw=="; //Convert String back to Byte[] and decrpt byte[] byteMessage = Base64.decodeBase64(stringMessage.getBytes("UTF-8")); System.out.println("ENCRYPTED MESSAGE byte Length: "+byteMessage.length); String decryptedMsg = decryptString(byteMessage, loadCASPrivateKey()); System.out.println(decryptedMsg); } catch (Exception e) { e.printStackTrace(); return; } } private static String decryptString(byte[] message, Key privateKey) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] cipherData = cipher.doFinal(message); return new String(cipherData, "UTF-8"); } private PrivateKey loadCASPrivateKey() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { InputStream is = getClass().getResourceAsStream( "/keys/app-private.key" ); if (is == null) { System.out.println("NULL"); } byte[] encodedPrivateKey = new byte[(int) 2000]; is.read(encodedPrivateKey); is.close(); // Generate KeyPair. KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey); PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec); return privateKey; } </code>
Działa to w 100% w sposób, w jaki chciałbym, aby znajdowało się pod moją maszynową maszyną JVM, jednak gdy uruchomię ją w emulatorze Androida, otrzymuję:
04-24 22: 42: 21.011: I / System.out (1041): k _ * ݣ 93 | @ 0 ̍4 y) Q k ; * e #��A� �oiu:�����W5@$�w�j��
uS R Ocx ٰ & l w '/ d 8uA ؔ { 4 $ U 0 {Ԑ t! 9 n a ” Jdt2 t T D k + k ; GF r ڼ >] y + ^ w < 'E { 8R] HZHyu ζ 軟 ށ 掱 { A # ȟ
Zakładam, że mój problem sprowadza się do kodowania, ale spędziłem cały dzień na próbowaniu tego, co i naprawdę jestem zakłopotany.
Ciąg jest pierwotnie zaszyfrowany przy użyciu:
<code>private void test() { String message="22223334490384903432221"; try { //Encrypt message byte[] encryptedMsg = Base64.encodeBase64(encryptString(message, temp.loadCASPublicKey())); } catch (Exception e) { e.printStackTrace(); return; } } private static byte[] encryptString(String message, Key publicKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] cipherData = cipher.doFinal(message.getBytes("UTF-8")); return cipherData; } </code>