当前位置: 首页 > 知识库问答 >
问题:

从String到java.Security.PublicKey对象向我提供了一个非法字符

戚建德
2023-03-14

我有这个方法:

public static PublicKey getKey(String key){
    try{
        byte[] byteKey = Base64.getDecoder().decode(key.getBytes());
        X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(byteKey);
        KeyFactory kf = KeyFactory.getInstance("RSA");

        return kf.generatePublic(X509publicKey);
    }
    catch(Exception e){
        e.printStackTrace();
    }

        return null;
    }
}
getKey("pTSWJvy04hAU7ev7wmaTvpwHsEbseuPl0AlwoxPHnmoOIMATRT0eTqYpLJxDp4BHRFxDTrcUKHKVHGIAVut_-l6nkEI6ALOVW9C5PP9bXwqeHJ5tiGA6AMpaY1LsJJOd2lgExr0LHUPF2TtO4LOVmlptyGPTRSWhmRpPSc5bjGFsyTFr78WmeixjEts9icAUCiBDdpwVw9qVdjJPsufyimqp8os5htm-DB_qKsnRwABVSQRKLw2y7Mr7NP31R07Mpr108dLS5Et8tKnFoiX0MHf5BbA50NG3DtyT27nSa14T0IvSWYJQhxPWXYtuXkVldpbZZn8E2B1VpcDXXGnSPXoPstE9BU7w1RaF31UeEsE8sWDFdHgJMUYMfWjxVhdJB_NaVUt7v0X9QPffXcFPWKUUeVx0g_ONMz0bB_HltFSODWJeAvcZXk14u4sjpKXNIiK8dJzMe0Qn10m5nIdVtxzXfKHiDNobX1dMENDplhDMVk1eYS9x8dh90qt68Q59vKusm6iMjSaXtzwMfqJBwNck41e9Pie2m_cdSu-RIq1u3FScGkezzqNvIuzcse2y-6ApHkkaFMVsNw3CbD87LtVgNusuom38UVC1rS0LeLYFinU3hnFwvB1UCv1_0Cs8CmrOmdifqd25aZIDf5p8f3kowq3QY1mNtdQc9-HgZ3k");

我能做什么?我做错什么了?

共有1个答案

史昱
2023-03-14

您拥有的数据不是完整的RSA公钥,而是模数或“N”值。“e”值是公钥的另一部分。下面是代码片段来说明它。

import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.RSAPublicKeySpec;
import java.util.Base64;

public class Main {

    public static void main(String[] args) throws Exception {
        String jsonN = "pTSWJvy04hAU7ev7wmaTvpwHsEbseuPl0AlwoxPHnmoOIMATRT0eTqYpLJxDp4BHRFxDTrcUKHKVHGIA" +
                "Vut_-l6nkEI6ALOVW9C5PP9bXwqeHJ5tiGA6AMpaY1LsJJOd2lgExr0LHUPF2TtO4LOVmlptyGPTRSWhmRpPSc5" +
                "bjGFsyTFr78WmeixjEts9icAUCiBDdpwVw9qVdjJPsufyimqp8os5htm-DB_qKsnRwABVSQRKLw2y7Mr7NP31R0" +
                "7Mpr108dLS5Et8tKnFoiX0MHf5BbA50NG3DtyT27nSa14T0IvSWYJQhxPWXYtuXkVldpbZZn8E2B1VpcDXXGnSP" +
                "XoPstE9BU7w1RaF31UeEsE8sWDFdHgJMUYMfWjxVhdJB_NaVUt7v0X9QPffXcFPWKUUeVx0g_ONMz0bB_HltFSO" +
                "DWJeAvcZXk14u4sjpKXNIiK8dJzMe0Qn10m5nIdVtxzXfKHiDNobX1dMENDplhDMVk1eYS9x8dh90qt68Q59vKu" +
                "sm6iMjSaXtzwMfqJBwNck41e9Pie2m_cdSu-RIq1u3FScGkezzqNvIuzcse2y-6ApHkkaFMVsNw3CbD87LtVgNu" +
                "suom38UVC1rS0LeLYFinU3hnFwvB1UCv1_0Cs8CmrOmdifqd25aZIDf5p8f3kowq3QY1mNtdQc9-HgZ3k";
        String jsonE = "AQAB";

        byte [] nBytes = Base64.getUrlDecoder().decode(jsonN);
        byte [] eBytes = Base64.getUrlDecoder().decode(jsonE);

        BigInteger n = new BigInteger(1, nBytes); // need to use the sign-magnitude constructor
        BigInteger e = new BigInteger(1, eBytes);

        RSAPublicKeySpec rsaPublicKeySpec = new RSAPublicKeySpec(n, e);
        KeyFactory rsaKeyFactory = KeyFactory.getInstance("RSA");
        PublicKey rsaPub = rsaKeyFactory.generatePublic(rsaPublicKeySpec);
        System.out.println(rsaPub);
    }
}

我将寻找一个已经完成此操作的库,而不是手工完成此操作,尽管库的建议与StackOverflow无关。

 类似资料:
  • 我有一个用python编写的不和谐机器人。机器人应该在表情回应中给出角色并删除角色。但是今天我得到了这个错误,当我试图得到一个角色的属性错误('NoneType'对象没有属性'角色')和这个错误,当我试图删除角色的属性错误('NoneType'对象没有属性'remove_roles')。 主要文件:

  • 问题内容: 我有一个bse64encoded字符串,来自外部源(Android商店)的公钥,我需要使用它来验证签名内容。如何将字符串转换为java.security.PublicKey接口的实例。如果这有所作为,我使用Java 6。 密钥是(可能)使用标准的Java库而不是有弹性的城堡生成的(它来自远程团队,所以我不确定)。他们的示例代码说使用Security.generatePublicKey(

  • 问题内容: 见下课 假设我创建了一个父对象,如下所示 根据上面的代码注意,birthDate属性为null。现在我只想将非null属性从父对象复制到另一个对象。就像是 我需要它,因为我想更新anotherParent对象而不用null值覆盖其非null值。 你知道这样的帮手吗? 我是否接受最少的代码作为答案,是否不介意使用助手 问候, 问题答案: 我想您已经有了解决方案,因为自您提出要求以来已经发

  • 问题内容: 这个问题已经被问了很多遍了,而且似乎对其他人也有用,但是,当我从不同的DataFrame复制列(并且长度相同)时,我得到了值。 我需要这样 我尝试了以下方法 我得到以下内容 问题答案: 您的DataFrames的索引是不同的 (相应地,每列 的索引也不同 ),因此,当尝试将一个DataFrame的列分配给另一列时, pandas会尝试对齐索引,但这样做会失败,请插入NaN。 考虑以下示

  • 问题内容: 我和我的朋友正在讨论Strings,而我们坚持了这一点: 他说总共将创建三个对象,而我说将创建一个对象。 他在3个对象之后的逻辑是:一个用于“ ObjectOne”,一个用于“ ObjectTwo”,第三个是两个String对象的串联版本。 我在一个对象后面的逻辑是在编译时,两个字符串对象都将在字节码中串联为: 并且在运行时,将仅以这种方式创建一个对象。这背后的真相是什么? 问题答案: