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