java : Common pattern in public keys in RSA encryption

标签 java cryptography rsa

我开始注意到,当我打印它时,我在 java 中生成的公钥在开头和结尾有一个共同的重复或模式。

这些是我生成的公钥,当我尝试以字符串格式打印时,它们采用以下形式:

这是我用来生成 key 的代码:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.generateKeyPair();
PublicKey pub = kp.getPublic();
PrivateKey pvt = kp.getPrivate();

byte[] encodedPublicKey = pub.getEncoded();
String b64PublicKey = Base64.getEncoder().encodeToString(encodedPublicKey);
System.out.println(b64PublicKey);

第一个公钥:

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAluBZlkmIH0GCt3z8B/y7PFECBKdlkRHZeGA/OOBOM/RNvBU+kyccN1TcDxeA/YmoOWUy8JuOj14Iv600mdmWAPUkm56w780o+7Ev8V9c6FLtyCcBI0bVknJTdGopaZRa1GgU11tivmBcPp6qpRodtVoBjBuWYatSDXyuso20yNGSm4muSsysFRsbpm236lmjk7T2nM8Rlv4LmjMlm63dhLJxCK2lB8guf7pCZFx/OPe32lXTBADx0Ci/DJfrgA1KhKVtzOttnS5/TfOLHIkfJ5CZj/oThQ/zfkc4Y5Qz/7XFz/KV9xeyZdKDVBMsf/Ib11X5w9pGmwlJUbeq08RqHwIDAQAB

第二个:

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiza6s7dpiMkh1T+W8bvgpbZXJxMm0W19PaDy2z1rEkjuIxOzp1WqVbEBrBWjiaH6HhN6sN60gTYxZF5mmRNFKQjc5ElOzY4/vnvi2NrUQpJudWR8SZetU0zFIurgUca7mM8WqMBOv6Blg8A25PfJrxDekmtbnAf3DFlRxvJTfqd6d4WAhVn1WoT9ce6DkRZJ8t73IgujcRlquVg2pTFO0wqN7xFzoQ70dPww243mQTzyJlcLmEkqAJi3xSyh8vFtgEM/jY1YwqQ5yjBqC1U55CiChuoNZ6g6obHC5G8sOOmWYr4dnDp2w8hNl7LssTexMOmCCd3cyue71FcsQk0LtQIDAQAB

这些模式意味着什么?在公钥开头使用此类模式是否安全?它们是否会造成漏洞?

最佳答案

正如评论中已经指出的:这些 key 是公钥的二进制编码。公钥至少由模数和公共(public)指数组成,因此需要某种结构。对于密码学,这些组件通常使用 ASN.1 表示法进行描述,并使用 BER/DER 编码进行编码。

通常,ASN.1 BER 编码对于不同的值会很快变得不同,因为它们包含长度编码。然而,RSA 公钥的情况并非如此,因为模数和公共(public)指数的大小始终相同。只有模数的值可能会发生变化,因为它对于每个 key 对都是唯一的(如果不是,那么随机数生成器就会损坏)。

Java 中的公钥使用 X.509 证书规范中的 SubjectPublicKeyInfo 结构。与通常的 PKCS#1 编码相比,它的优点是它包含一个对象标识符 - 在开头 - 表明它是 RSA 公钥。因此可以检查该对象标识符以确保它确实是 RSA 公钥。

要快速查看结构,请在解码 Base 64 后使用 openssl -inform DER。您还可以使用一些在线工具,例如 this one查看公钥结构的内容。当然,仅对在线工具使用公钥和测试 key 。

一般来说,值30 8x是任何具有重要大小的ASN.1结构的开始。值30是一个SEQUENCE,通常是多个元素的结构所需要的,而8是长度编码的开始。因此,以 MI 开头的 Base 64 中的任何内容都可能以 ASN.1 BER/DER 进行编码,因为 MI 对前 12 位进行编码。

关于java : Common pattern in public keys in RSA encryption,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48800500/

相关文章:

java - 如何在java中的字符串中附加反斜杠

encryption - 用公钥解密

c++ - 如何使用arc4输入字符串进行加密?

java - 如何在 log4j 中创建自己的 Appender?

java - Java 中的仿函数

c - C中ECC的实现

websphere - 应用在Websphere上挂起-> 'Initializing Spring root WebApplicationContext'

c - OpenMP 中的并行 RSA 加密

authentication - RSA 签名机制

java - 线程 "main"java.net.ConnectException : Connection refused: connect Socket Programming Java 中的异常