在RSA解密的Android / JVM的区别 [英] Android/JVM difference in RSA decryption
问题描述
我想一个字符串解密,我在别处加密。这是我的code:
私人无效测试(){
尝试 {
串stringMessage="Sf3O7Lr2+WN5szGyLejL3CjuBRZtQ72+ZBmgVTgWnatQZxUElzaBqFa1p0SVBqe9VWVxCxdEkejMVtDGEr0UJSVSK8EB/fPI6v8JE8dIu0JN0mMs4xlowhITy0tQR+1pcBtDFjzOl33xxQcq5JuPezxRDxFIp+IVkD8FdpqlttEKf2Tvqw9tqsdgiBKb5xDvKrkIDQXdLBh1gbAVZDSJYGHRkcOA8vz2ty/PeooKkfDK6IOn7KBwOBgSRgQr/MLBF3Xk2vRWgVGRh/fRkzu21EWo99Q5moWKxWl3HW/bbgTBQTb097XP3NTID9kSPhCfL0BEfBxonuNse5GBoeRnCw==";
//字符串转换回字节[]和decrpt
byte []的byteMessage = Base64.de codeBase64(stringMessage.getBytes(UTF-8));
的System.out.println(加密消息的字节长度:+ byteMessage.length);
串decryptedMsg = decryptString(byteMessage,loadCASPrivateKey());
的System.out.println(decryptedMsg);
}赶上(例外五){
e.printStackTrace();
返回;
}
}
私有静态字符串decryptString(byte []的消息,主要PrivateKey)对其抛出InvalidKeyException将,抛出:NoSuchAlgorithmException,NoSuchPaddingException,IllegalBlockSizeException,BadPaddingException,UnsupportedEncodingException {
密密码= Cipher.getInstance(RSA);
cipher.init(Cipher.DECRYPT_MODE,PrivateKey)对其;
字节[]的CipherData = cipher.doFinal(消息);
返回新的String(的CipherData,UTF-8);
}
私人PrivateKey loadCASPrivateKey()抛出IOException异常,抛出:NoSuchAlgorithmException,InvalidKeySpecException {
InputStream的是=的getClass()的getResourceAsStream(/keys/app-private.key)。
如果(是== NULL){
的System.out.println(NULL);
}
byte []的EN codedPrivateKey =新的字节[(INT)2000];
is.read(EN codedPrivateKey);
is.close();
//生成密钥对。
的KeyFactory的KeyFactory = KeyFactory.getInstance(RSA);
PKCS8En codedKeySpec privateKeySpec =新PKCS8En codedKeySpec(EN codedPrivateKey);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
返回privateKey;
}
本工程100%,我怎么想它在我的桌面JVM,但是当我在Android模拟器中运行它,我得到:
04-24 22:42:21.011:我/的System.out(1041): k _ * ݣ 93|@0 ̍4 y) Q k ;*A e <$c$c># A OIU:W5 @ $ WJ uSROcx和放大器; l W'/ d8uA {4 $ U0 {Ԑt!9N a'Jdt2tTDk + K; GF \ rڼ>] Y + ^ W&LT; E {8R]ZHyuζ软ށ掱{A#ȟ
我想我的问题是下到编码,但我花了一整天试图找出什么,真的很为难。
该字符串最初使用加密:
私人无效测试(){
字符串消息=22223334490384903432221;
尝试 {
//加密邮件
byte []的encryptedMsg = Base64.en codeBase64(encryptString(消息,temp.loadCASPublicKey()));
}赶上(例外五){
e.printStackTrace();
返回;
}
}
私有静态的byte [] encryptString(字符串消息,主要公钥)抛出抛出:NoSuchAlgorithmException,NoSuchPaddingException,InvalidKeyException将,IllegalBlockSizeException,BadPaddingException,UnsupportedEncodingException {
密密码= Cipher.getInstance(RSA);
cipher.init(Cipher.ENCRYPT_MODE,公钥);
字节[]的CipherData = cipher.doFinal(message.getBytes(UTF-8));
返回的CipherData;
}
由于GregS在评论帮助。这是为我工作的解决方案。
私人无效测试(){
尝试 {
串stringMessage="GEQRpAPA577ks/QveudNkk7H9DjItKGLDYW6xhH1YJGabCVzrkejkBh6S+APwEXxB84UV/q0sO5rqkgXWONJQ8CoMTfqXtUkAAwkYHSc86eGewkM8WpctA0AyNVFonOxDCXm84Uq8JRMzqskSH5VXHmMxvHIvpFgdhmt9Ir0cKWzoLsuvgfY9hfypfEyBXGZcoptQeKhsZxRGIlxbXhrFl/LqhC+F6vYtZ/j5pv2LUP38wh2rTCKnAQ+xvC+7wn5SVzt/Wbr/q7GjCoJuU9uFHQSS49KQDt+BzJL2XNwAMmdbC+XHYkEBBWxVSS+0hdSQxoaKVZZJk4hTnHwQlBAkw==";
//字符串转换回字节[]和decrpt
byte []的byteMessage = Base64.de codeBase64(stringMessage.getBytes(UTF-8));
的System.out.println(加密消息的字节长度:+ byteMessage.length);
串decryptedMsg = decryptString(byteMessage,loadCASPrivateKey());
的System.out.println(decryptedMsg);
}赶上(例外五){
e.printStackTrace();
返回;
}
}
私有静态字符串decryptString(byte []的消息,主要PrivateKey)对其抛出InvalidKeyException将,抛出:NoSuchAlgorithmException,NoSuchPaddingException,IllegalBlockSizeException,BadPaddingException,UnsupportedEncodingException,NoSuchProviderException {
Security.addProvider(新org.bouncycastle.jce.provider.BouncyCastleProvider());
密码加密= Cipher.getInstance(RSA /无/ NoPadding,BC);
cipher.init(Cipher.DECRYPT_MODE,PrivateKey)对其;
字节[]的CipherData = cipher.doFinal(消息);
返回新的String(的CipherData,UTF-8);
}
私人PrivateKey loadCASPrivateKey()抛出IOException异常,抛出:NoSuchAlgorithmException,InvalidKeySpecException {
InputStream的是=的getClass()的getResourceAsStream(/keys/app-private.key)。
如果(是== NULL){
的System.out.println(NULL);
}
byte []的EN codedPrivateKey =新的字节[(INT)1216];
is.read(EN codedPrivateKey);
is.close();
//生成密钥对。
的KeyFactory的KeyFactory = KeyFactory.getInstance(RSA);
PKCS8En codedKeySpec privateKeySpec =新PKCS8En codedKeySpec(EN codedPrivateKey);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
返回privateKey;
}
I am trying to decrypt a String, that I have encrypted elsewhere. Here is my 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;
}
This works 100% how I would like it to under my desktop JVM, however when I run it in the Android emulator I get:
04-24 22:42:21.011: I/System.out(1041): ��k���_��*�ݣ���93|@0�̍4�y)��Q�k�;*A����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]�ZHyu��ζ��軟�ށ掱�{�A�#ȟ�
I assume my problem is down to encoding, but I've spent all day trying to work out what and am really stumped.
The string is originally encrypted using:
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;
}
Thanks to GregS's help in the comments. This is the solution that worked for me.
private void test() {
try {
String stringMessage="GEQRpAPA577ks/QveudNkk7H9DjItKGLDYW6xhH1YJGabCVzrkejkBh6S+APwEXxB84UV/q0sO5rqkgXWONJQ8CoMTfqXtUkAAwkYHSc86eGewkM8WpctA0AyNVFonOxDCXm84Uq8JRMzqskSH5VXHmMxvHIvpFgdhmt9Ir0cKWzoLsuvgfY9hfypfEyBXGZcoptQeKhsZxRGIlxbXhrFl/LqhC+F6vYtZ/j5pv2LUP38wh2rTCKnAQ+xvC+7wn5SVzt/Wbr/q7GjCoJuU9uFHQSS49KQDt+BzJL2XNwAMmdbC+XHYkEBBWxVSS+0hdSQxoaKVZZJk4hTnHwQlBAkw==";
//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, NoSuchProviderException {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("RSA/None/NoPadding","BC");
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) 1216];
is.read(encodedPrivateKey);
is.close();
// Generate KeyPair.
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
return privateKey;
}
这篇关于在RSA解密的Android / JVM的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!