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

问题描述 投票:0回答:3

我想在java中使用给定的公钥(公钥是一个字符串)以rsa/ecb/pkcs1填充模式对字符串进行编码。

我还想以UTF-8格式呈现结果 怎么办?

java encryption rsa padding public-key-encryption
3个回答
1
投票

我已经完成了这段代码:

        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;

但是没用.. 据说无效的 DER:对象不是整数


0
投票

对于仍在寻找解决方案的人:

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==";
Cipher cipher= Cipher.getInstance("RSA");
KeyFactory kf = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));
PublicKey pb = kf.generatePublic(keySpec);
cipher.init(Cipher.ENCRYPT_MODE,pb);
byte[] output = cipher.doFinal(input.getBytes());

-2
投票

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

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

    //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. 使用您的公钥加密
  4. 编码为可读格式。

查看步骤 1-3 的答案:Java 中的 RSA 加密/解密。请记住使用正确的算法规范,在您的情况下为 PKCS1

您的密文可能不会仅使用 UTF-8 字符,因此您可能需要使用 Base 64 编码文本来显示您的密文。 Base 64 能够将所有这些奇怪的字符显示为 ascii 值。

只需使用:

Base64.getEncoder().encodeToString(cipherTextBytes)

© www.soinside.com 2019 - 2024. All rights reserved.