简体   繁体   English

Java和Openssl为同一私钥生成不同长度的公钥

[英]Java and Openssl generates different length of public keys for same private key

I used java to generate public key out of private key as follows, 我使用java从私钥生成公钥,如下所示,

    Security.addProvider(new BouncyCastleProvider());
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
    kpg.initialize(2048);
    KeyPair kp = kpg.generateKeyPair();
    PrivateKey priv = kp.getPrivate();
    RSAPrivateCrtKey rsaCrtKey = (RSAPrivateCrtKey) priv;
    RSAPublicKeySpec keyspecPublic =  new RSAPublicKeySpec(rsaCrtKey.getModulus(), rsaCrtKey.getPublicExponent());
    KeyFactory kf = KeyFactory.getInstance("RSA");
    PublicKey  publicKey2 = kf.generatePublic(keyspecPublic);
    String publicString = Base64.getMimeEncoder().encodeToString(publicKey2.getEncoded());
                StringBuilder sb = new StringBuilder("");
    sb.append("\"-----BEGIN PUBLIC KEY-----\\n")
       .append(publicString)
       .append("\\n-----END PUBLIC KEY-----");

And I generate public key using openssl as follows for same private key, 我使用openssl生成公钥,如下所示,用于相同的私钥,

openssl rsa -in private.key -pubout -out public.key

But above two methods generate different lengths of strings as public key. 但是上面两种方法生成不同长度的字符串作为公钥。 Am I doing something wrong here? 我在这里做错了吗?

public key from java code: java代码中的公钥:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6UkqbaGp7wOx2vrtqxmX/22ixKZcZPfZ
xXAawIst+AsWyNS+99MxnilstLIBKd6BCzJJsAa2I0ks43mnNZbkx1f1um+tQpXuTMbTh5MRprPn
jmX6aF+JXJbXATKhabTIQcCdpnrMi6scp9nWYkFdxVMfvo1gyThzfPwPgCO4eRFo1IkwZuergkl7
e0+U7WonqzFEb0joy5P78U+K8HebDW7nbS8zliq3DH2FI9yvEK3LeEN+Sa5icMWlERGv+7FCJVIH
CjBYfzaRZD9qqld/AnAEkCVt38SfSqWJECsnJYUW90WuFd8IxUVPS0TMfFMQhJFMT3eGweBOUb/b
pDm/hQIDAQAB
-----END PUBLIC KEY-----

Public key from openssl : 来自openssl公钥:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6UkqbaGp7wOx2vrtqxmX
/22ixKZcZPfZxXAawIst+AsWyNS+99MxnilstLIBKd6BCzJJsAa2I0ks43mnNZbk
x1f1um+tQpXuTMbTh5MRprPnjmX6aF+JXJbXATKhabTIQcCdpnrMi6scp9nWYkFd
xVMfvo1gyThzfPwPgCO4eRFo1IkwZuergkl7e0+U7WonqzFEb0joy5P78U+K8Heb
DW7nbS8zliq3DH2FI9yvEK3LeEN+Sa5icMWlERGv+7FCJVIHCjBYfzaRZD9qqld/
AnAEkCVt38SfSqWJECsnJYUW90WuFd8IxUVPS0TMfFMQhJFMT3eGweBOUb/bpDm/
hQIDAQAB
-----END PUBLIC KEY-----

The keys are identical, and will decode to the same byte content. 密钥是相同的,并将解码为相同的字节内容。

Formatting-wise, the Java one is wrapped at 76 columns and the OpenSSL one is wrapped at 64 columns. 格式化方面,Java包装在76列,OpenSSL包装在64列。

If you want to make the wrapping consistent, use the Base64.getMimeEncoder(int lineLength, byte[] lineSeparator) overloaded method that lets you specify the line length and pass 64 as the lineLength parameter. 如果要使包装保持一致,请使用Base64.getMimeEncoder(int lineLength, byte[] lineSeparator)重载方法,该方法允许您指定行长度并将64作为lineLength参数传递。

Base64.getMimeEncoder(64, new byte[] {'\r', '\n'});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM