私は他の場所で暗号化された文字列を解読しようとしています。ここに私のコードです:RSA解読のAndroid/JVMの違い
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;
}
この作品、私はAndroidのエミュレータでそれを実行した場合しかし、私は取得するには、私のデスクトップJVMの下でそれをしたいと思いますどのように100%:
4月24日22: 42:21.011:I/System.out(1041): k _ * ݣ 93 ̍0 ̍4 y) Q k ; *A e
#��A� �oiu:�����[email protected]$�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]ZHyuζ軟ށ掱{#のȟ
私は自分を想定します問題はエンコーディングにまで下がりましたが、私は一日中何を解決しようと努力しましたが、本当に困っています。
文字列が元々使用して暗号化されています
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;
}
デフォルトを使用しないでください。プラットフォームによって異なる場合があります。 'Cipher.getInstance()'は* algorithm/mode/padding *からなる文字列引数をとります。あなたは*アルゴリズム*のみを提供しており、他の2つのデフォルトを取得しています。 –
また、 'encryptString'メソッドを表示して、' decryptString'メソッドと比較できるようにする必要があります。 –
@GregS - ありがとう。私はencryptStringの部分を追加しました。私はCipher.getInstanceを調べるでしょう、私はそれがより多くの部分を取ったことを認識していませんでした。 – Joseph