我正在尝试了解公钥和私钥的结构。我生成了RSA密钥对:
Cipher cipher = Cipher.getInstance("RSA/NONE/PKCS1Padding", "BC");
SecureRandom random = new SecureRandom();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");
generator.initialize(2048, random);
KeyPair pair = generator.generateKeyPair();
Key publicKey = pair.getPublic();
Key privateKey = pair.getPrivate();
System.out.println("publicKey : " + byteArrayToHexString(publicKey.getEncoded()));
System.out.println("privateKey : " + byteArrayToHexString(privateKey.getEncoded()));
我使用ASN.1解码器来探索生成密钥的结构,我看到私钥结构包含公钥结构的所有元素。为什么呢?
答案 0 :(得分:0)
PKCS8 RSA私钥包含这些字段的简短原因是因为它使用(用于RSA)语法定义的方式,大约在1990年左右,原始标准用于 RSA,PKCS1,现在可以更方便地作为RFC使用2437 3447和8107,在11.1.2或A.1.2节中,取决于版本。
是的,有一些冗余:n可以很容易地从pxq重新计算,并且d mod p-1和q-1可以很容易地从d重新计算,反之亦然d从d mod p-1和q-1重新计算,而不是提到d或e可以从另一个给定的p和q计算出来。为什么当时的RSA实验室选择存储我不知道的所有内容 - 特别是因为在ASN.1中相对容易使事情变得可选,而在某些其他中(尽管如此)以后?)PKCS他们做了。
对于它的价值而言,大致同期的PGP格式不存储d mod p-1和q-1,并且使用p inverse mod q而不是反之亦然。但是PGP附加了“秘密密钥”。 (真正的私钥)到所有算法的publickey,因此它确实有n和p,q以及d和e。
即使在代码中遇到这对编程也不是一个问题或问题,如果你想要追求它,我推荐使用crypto.stackexchange.com。