Android 来自 public 字符串的 RSA 加密
Android RSA encryption from public string
我正在开发一个 android 应用程序,我希望用户能够使用其他人的 public 密钥加密消息。系统将生成一个 public/private 密钥对,然后消息可以秘密地发送给其他用户。
我正在创建一个加密 class,它将处理 encryption/decryption 条消息。不幸的是我遇到了一些问题。
在这个方法中,我想传递用户的秘密(私钥)以及他们想要加密的消息。我希望秘密是用户定义的(如 "MySecretPassword")。
public static void lock(String secret, String textToEncrypt) {
try {
//Convert the public key string into a key
byte[] encodedPublicKey = Base64.decode(secret.getBytes("utf-8"),Base64.DEFAULT);
X509EncodedKeySpec spec = new X509EncodedKeySpec(encodedPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publickey = keyFactory.generatePublic(spec); //Crash Here
PrivateKey privateKey = keyFactory.generatePrivate(spec);
//Encrypt Message
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publickey);
byte[] encryptedBytes = cipher.doFinal(textToEncrypt.getBytes());
Log.d(TAG,"Encrypted: "+new String(encryptedBytes));
} catch (Exception e) {
e.printStackTrace();
}
}
异常情况如下:
java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c0740b0:ASN.1 encoding routines:ASN1_get_object:TOO_LONG
我在这里错过了什么?我是否遗漏了一些明显的东西,或者我是否误解了这些工具的工作原理?我之前使用 this javascript 库进行 public/private 密钥加密,我想在这里做一些类似的事情。如果有人能指出正确的方向,我将不胜感激:)
秘密不是 public 密钥。
您使用收件人的 public 密钥加密。该值是 public,这意味着任何人都可以查找它。您需要获取对方的 public 密钥的值并将其输入您的代码,而不是发送您自己的私钥。正确的做法不涉及任何秘密!
通常不会直接用RSA加密消息,而是用RSA加密AES密钥(或其他对称密钥),然后用AES密钥加密消息。如果你的消息很短,你可以直接使用RSA,但它不适用于长消息。
这里有几个链接展示了如何在 Android 上实施 RSA:
- RSA using SpongyCastle
我正在开发一个 android 应用程序,我希望用户能够使用其他人的 public 密钥加密消息。系统将生成一个 public/private 密钥对,然后消息可以秘密地发送给其他用户。
我正在创建一个加密 class,它将处理 encryption/decryption 条消息。不幸的是我遇到了一些问题。
在这个方法中,我想传递用户的秘密(私钥)以及他们想要加密的消息。我希望秘密是用户定义的(如 "MySecretPassword")。
public static void lock(String secret, String textToEncrypt) {
try {
//Convert the public key string into a key
byte[] encodedPublicKey = Base64.decode(secret.getBytes("utf-8"),Base64.DEFAULT);
X509EncodedKeySpec spec = new X509EncodedKeySpec(encodedPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publickey = keyFactory.generatePublic(spec); //Crash Here
PrivateKey privateKey = keyFactory.generatePrivate(spec);
//Encrypt Message
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publickey);
byte[] encryptedBytes = cipher.doFinal(textToEncrypt.getBytes());
Log.d(TAG,"Encrypted: "+new String(encryptedBytes));
} catch (Exception e) {
e.printStackTrace();
}
}
异常情况如下:
java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c0740b0:ASN.1 encoding routines:ASN1_get_object:TOO_LONG
我在这里错过了什么?我是否遗漏了一些明显的东西,或者我是否误解了这些工具的工作原理?我之前使用 this javascript 库进行 public/private 密钥加密,我想在这里做一些类似的事情。如果有人能指出正确的方向,我将不胜感激:)
秘密不是 public 密钥。
您使用收件人的 public 密钥加密。该值是 public,这意味着任何人都可以查找它。您需要获取对方的 public 密钥的值并将其输入您的代码,而不是发送您自己的私钥。正确的做法不涉及任何秘密!
通常不会直接用RSA加密消息,而是用RSA加密AES密钥(或其他对称密钥),然后用AES密钥加密消息。如果你的消息很短,你可以直接使用RSA,但它不适用于长消息。
这里有几个链接展示了如何在 Android 上实施 RSA:
- RSA using SpongyCastle