我正在开发一个 Android 应用程序,我希望用户能够使用其他人的公钥加密消息。系统将生成公钥/私钥对,然后可以将消息秘密发送给其他用户。
我正在创建一个加密类,它将处理消息的加密/解密。不幸的是我遇到了一些问题。
在这种方法中,我想传递用户的秘密(私钥)以及他们想要加密的消息。我希望秘密是用户定义的(例如“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 https://github.com/tracker1/cryptico-js之前有一个用于公钥/私钥加密的javascript库,我正在尝试在这里做类似的事情。如果有人能指出我正确的方向,我将不胜感激:)
秘密不是公钥。
您使用收件人的公钥进行加密。该值是public,这意味着任何人都可以查找它。您需要获取对方公钥的值并将其输入到您的代码中,而不是发送您自己的私钥。正确的做法不涉及任何秘密!
通常,人们不会直接使用 RSA 加密消息,而是使用 RSA 加密 AES 密钥(或其他对称密钥),然后使用 AES 密钥来加密消息。如果您的消息非常短,您可以直接使用 RSA,但它不适用于长消息。
以下是一些展示如何在 Android 上实现 RSA 的链接:
- 使用 SpongyCastle 进行 RSA https://stackoverflow.com/questions/22228711/rsa-using-spongycastle
- Android 和 Java 中的 RSA 加密 https://stackoverflow.com/questions/30886589/rsa-encryption-in-android-and-java
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)