Android公钥RSA加密字符串

3

我正在开发一款安卓应用程序,希望用户能够使用其他人的公钥加密消息。系统将生成公/私钥对,然后可以秘密地向其他用户发送消息。

我正在创建一个加密类来处理消息的加密/解密。不幸的是,我遇到了一些问题。

在这种方法中,我想传递用户的私钥以及他们想要加密的消息。我希望用户自定义私钥(例如“我的秘密密码”)。

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

我在这里缺失了什么?我是否忽略了一些显而易见的东西或者我没有理解这些工具的工作方式?我以前使用这个 JavaScript 库进行公钥/私钥加密,现在正在尝试做类似的事情。如果有人能指点我正确的方向,我将不胜感激 :)


1
其他用户的消息可以使用他们的公钥进行解密。所以它们并不是秘密,因为每个人都知道公钥。你的错误在于,你不想基于X509编码数据生成一个密钥,而是想基于密码生成一个密钥:https://dev59.com/xXNA5IYBdhLWcg3wWsiK#992413 - zapl
啊,我在打字时搞混了。用户应该使用他们目标的公钥加密消息(例如,如果我想向我的朋友发送消息,我就使用那个朋友的公钥进行加密)。我会查看您发布的链接 :) - Pancake
1
也许这只是一个打字错误,但公钥已为所有人所知,您可以使用它加密数据,只有接收者(私钥的所有者)才能解密。这是发送消息安全的方式。编辑:是的。 - zapl
1个回答

2

一个秘密不是公钥。

你使用接收方的公钥进行加密。这个值是公开的,这意味着任何人都可以查找它。你需要获取另一方的公钥值并将其输入到代码中,而不是发送自己的私钥。正确的做法不涉及任何秘密!

通常情况下,人们不会直接使用RSA加密消息,而是使用RSA加密AES密钥(或其他对称密钥),然后使用AES密钥加密消息。如果你的消息非常短,你可以直接使用RSA,但对于长消息来说,这种方法行不通。

以下是一些关于如何在Android上实现RSA的链接:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接