如何使用 java 中给定的 public 键使用 rsa/ecb/pkcs1 填充模式对文本进行编码?

How to encode a text with rsa/ecb/pkcs1 padding mode with a given public key in java?

我想在 java.[=13 中使用给定的 public 键(public 键是一个字符串)使用 rsa/ecb/pkcs1 填充模式对字符串进行编码=]

我也想以UTF-8格式呈现结果 怎么做?

假设您使用的是有效的 RSA 密钥,您将需要:

  1. 将您的 public 键从字符串转换为实际的 public 键对象

    //This code is incorrect. You'll need bouncy castle for PKCS1
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    byte[] keyBytes = Base64().getDecoder.decode(publicKey.getBytes()); //assuming base64 encoded key
    PKCS1EncodedKeySpec KeySpec = new PKCS1EncodedKeySpec(keyBytes);
    RSAPublicKey publicKey = (RSAPublicKey)keyFactory.generatePublic(KeySpec);
    
  2. 获取纯文本的字节数

  3. 使用您的 public 密钥加密
  4. 编码为可读格式。

查看第 1-3 步的答案:RSA Encrypt/Decrypt in Java。请记住使用正确的算法规范,在您的情况下为 PKCS1

您的密文很可能不会只使用 UTF-8 字符,因此您可能希望使用 Base 64 编码文本来显示您的密文。 Base 64 能够将所有这些不稳定的字符显示为 ascii 值。

只需使用:Base64.getEncoder().encodeToString(cipherTextBytes)

我已经完成了这段代码:

        String pub = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4IJZLsjlx+o4RSvafaAcReoNnzrI0UXu7kZyXPe31ql32X9AvhC6QQIUmLkr1Evm0zP/SgVG9YX3DSqBUgPo04iv1I1/wNKwAf1/uH9EiiqdpczefyxxnzJiKUTcx2/4mA4E4QxCIL5JsZb78WoYZrd2kToW/WD01MnSFiCgSyjGdd812GY2EVzfvlv8kYuti3icMUyitEfHhtw8cAWI6/nVrRPNs0e5NsvtZJ0nfrXsfQDR0C7+ivQK+fQabi8oRGsbTZceAvVlqVE669zoIwIFLcB+eYXTxbka4E7veUMpaF9w//HdwVS2y/2jJiI+16qPStQQPIKQ4Cucoif7/UHfIBuVGVJ5MIVyK7NC7TV/lyoXmyo7ZcnVZnI7rZcw5/qZcqaZ0VCrzvHijwTK7100hOOjiarvRa2OJGXHLIeAUlbrHOXEXS6ah2glPhLDEg6Qzp/lKVSISolal7q73qyhF483P9jXn3hefSLA9J1/1LgeajWvuVkxuw+dy2Tlv7oUpNBkX47/TOho5qttr1y9K3hD5Q87RAJPdBtFdDbY8qUPxoiBsTbUWjVoEjJf2YAsLTJIIi2ZISkbD/VdrtZnS73QSJkJReOMNT9XYNGDJvwNIrRcNGFKlJcX6qq+ozGNsDkrt0ObxAD7YCTjAYQVTlbQOaTu5DbGxGDNCoMCAwEAAQ==";

        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        byte[] keyBytes = Base64.getDecoder().decode(pub.getBytes("UTF-8"));  
        PKCS1EncodedKeySpec KeySpec = new PKCS1EncodedKeySpec(keyBytes);
        RSAPublicKey publicKey = (RSAPublicKey)keyFactory.generatePublic((java.security.spec.KeySpec) KeySpec);

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);

        byte[] cipherData = cipher.doFinal(text.getBytes("UTF-8"));


        return cipherData;

但是没用.. 据说 Invalid DER: object is not integer