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

如何在java中使用给定的公钥对rsa/ecb/pkcs1填充模式的文本进行编码?,java,encryption,rsa,padding,public-key-encryption,Java,Encryption,Rsa,Padding,Public Key Encryption,我想用java中给定的公钥(公钥是字符串)对rsa/ecb/pkcs1填充模式的字符串进行编码 我还想以UTF-8格式展示结果 如何操作?假设您使用的是有效的RSA密钥,您需要: 将公钥从字符串转换为实际的公钥对象 //This code is incorrect. You'll need bouncy castle for PKCS1 KeyFactory keyFactory = KeyFactory.getInstance("RSA"); byte[] keyBytes = Base64(

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

我还想以UTF-8格式展示结果
如何操作?

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

  • 将公钥从字符串转换为实际的公钥对象

    //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);
    
  • 获取纯文本的字节数

  • 使用公钥加密
  • 编码成可读的格式 请查看以下步骤1-3的答案:。记住使用正确的算法规范,在您的例子中是PKCS1

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


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

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

  • 将公钥从字符串转换为实际的公钥对象

    //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);
    
  • 获取纯文本的字节数

  • 使用公钥加密
  • 编码成可读的格式 请查看以下步骤1-3的答案:。记住使用正确的算法规范,在您的例子中是PKCS1

    密码文本可能不会仅使用UTF-8字符,因此您可能希望使用Base 64编码文本来显示密码文本。Base64能够将所有不稳定的字符显示为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;
    
    但是它不起作用。。
    据说无效的DER:object不是整数

    我已经完成了以下代码:

            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:object不是整数

    有很多例子。你有什么问题?如果您想将密文编码为字符串,请不要忘记使用base64或hex对其进行编码。结果基本上是随机字节,并非所有这些字节都是有效的UTF-8编码。如果需要UTF-8,则需要对随机输出使用编码,通常使用Base64和十六进制。你有什么问题?如果您想将密文编码为字符串,请不要忘记使用base64或hex对其进行编码。结果基本上是随机字节,并非所有这些字节都是有效的UTF-8编码。如果需要UTF-8,则需要对随机输出使用编码,通常使用Base64和十六进制。我的问题是我不想生成密钥。我的公钥是这样的:lyoXmyo7ZcnVZnI7rZcw5。。。。如何在此表单中使用此公钥?@Marzo您首先必须了解此公钥的格式。询问您从中获得此信息的人,如果他们不知道,请询问生成此信息的代码。你应该可以从那里开始,我有键的模和指数,但是我不能从java初始化我的键code@Marzo在这种情况下:@venture我无法理解PKCS1EncodedKeySpec(res)行res是什么?我的问题是我不想生成密钥。我的公钥是这样的:lyoXmyo7ZcnVZnI7rZcw5。。。。如何在此表单中使用此公钥?@Marzo您首先必须了解此公钥的格式。询问您从中获得此信息的人,如果他们不知道,请询问生成此信息的代码。你应该可以从那里开始,我有键的模和指数,但是我不能从java初始化我的键code@Marzo在这种情况下:@venture我无法理解行PKCS1EncodedKeySpec(res)res是什么?