How can I transform between the two styles of public key format, one “BEGIN RSA PUBLIC KEY”, the other is “BEGIN PUBLIC KEY”
如何在两种公钥格式样式之间转换,
一种格式是:
1 2 3 | -----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY----- |
另一种格式是:
1 2 3 | -----BEGIN RSA PUBLIC KEY----- ... -----END RSA PUBLIC KEY----- |
例如,我使用ssh-keygen命令生成了id_rsa / id_rsa.pub对,
我使用以下命令从id_rsa计算了公钥:
1 | openssl rsa -in id_rsa -pubout -out pub2 |
然后我再次使用id计算来自id_rsa.pub的公钥:
1 | ssh-keygen -f id_rsa.pub -e -m pem > pub1 |
内容是pub1是:
1 2 3 4 5 6 7 8 | -----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB -----END RSA PUBLIC KEY----- |
并且pub2的内容是:
1 2 3 4 5 6 7 8 9 | -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS +rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26 ZQIDAQAB -----END PUBLIC KEY----- |
根据我的理解,pub1和pub2包含相同的公钥信息,但是它们的格式不同,我想知道如何在两种格式之间转换? 谁能给我介绍一下丝束格式的简要介绍?
我想帮助解释这里发生了什么。
好。
RSA"公钥"由两个数字组成:
好。
好。
以您的RSA公钥为例,这两个数字是:
好。
好。
问题就变成了我们如何将这些数字存储在计算机中。首先,我们将它们都转换为十六进制:
好。
好。
RSA发明了第一种格式
RSA首先发明了一种格式:
好。
1 2 3 4 | RSAPublicKey ::= SEQUENCE { modulus INTEGER, -- n publicExponent INTEGER -- e } |
他们选择使用ASN.1二进制编码标准的DER格式表示两个数字[1]:
好。
1 2 3 | SEQUENCE (2 elements) INTEGER (2048 bit): 0282010100EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65 INTEGER (24 bit): 010001 |
ASN.1中的最终二进制编码为:
好。
1 2 3 4 5 | 30 82 01 0A ;sequence (0x10A bytes long) 02 82 01 01 ;integer (0x101 bytes long) 00 EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65 02 03 ;integer (3 bytes long) 010001 |
如果然后一起运行所有这些字节并对其进行Base64编码,则会得到:
好。
1 2 3 4 5 6 | MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB |
RSA实验室然后说添加标题和尾部:
好。
1 2 3 4 5 6 7 8 | -----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB -----END RSA PUBLIC KEY----- |
五个连字符,单词
好。
好。
不只是RSA
之后,出现了其他形式的公钥加密:
好。
好。
当需要为表示这些加密算法的参数创建标准时,人们采用了RSA最初定义的许多相同思想:
好。
好。
但是不要使用:
好。
好。
他们决定改为包括随后的对象标识符(OID)。对于RSA公钥,即:
好。
好。
因此,对于RSA公钥,本质上是:
好。
1 2 3 4 | public struct RSAPublicKey { INTEGER modulus, INTEGER publicExponent } |
现在他们创建了SubjectPublicKeyInfo,它基本上是:
好。
1 2 3 4 | public struct SubjectPublicKeyInfo { AlgorithmIdentifier algorithm, RSAPublicKey subjectPublicKey } |
在实际的DER ASN.1中,定义为:
好。
1 2 3 4 5 6 7 8 9 10 | SubjectPublicKeyInfo ::= SEQUENCE { algorithm ::= SEQUENCE { algorithm OBJECT IDENTIFIER, -- 1.2.840.113549.1.1.1 rsaEncryption (PKCS#1 1) parameters ANY DEFINED BY algorithm OPTIONAL }, subjectPublicKey BIT STRING { RSAPublicKey ::= SEQUENCE { modulus INTEGER, -- n publicExponent INTEGER -- e } } |
这将为您提供ASN.1:
好。
1 2 3 4 5 6 7 8 | SEQUENCE (2 elements) SEQUENCE (2 elements) OBJECT IDENTIFIER 1.2.840.113549.1.1.1 NULL BIT STRING (1 element) SEQUENCE (2 elements) INTEGER (2048 bit): 0282010100EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65 INTEGER (24 bit): 010001 |
ASN.1中的最终二进制编码为:
好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 30 82 01 22 ;SEQUENCE (0x122 bytes = 290 bytes) | 30 0D ;SEQUENCE (0x0d bytes = 13 bytes) | | 06 09 ;OBJECT IDENTIFIER (0x09 = 9 bytes) | | 2A 86 48 86 | | F7 0D 01 01 01 ;hex encoding of 1.2.840.113549.1.1 | | 05 00 ;NULL (0 bytes) | 03 82 01 0F 00 ;BIT STRING (0x10f = 271 bytes) | | 30 82 01 0A ;SEQUENCE (0x10a = 266 bytes) | | | 02 82 01 01 ;INTEGER (0x101 = 257 bytes) | | | | 00 ;leading zero of INTEGER | | | | EB 50 63 99 F5 C6 12 F5 A6 7A 09 C1 19 2B 92 FA | | | | B5 3D B2 85 20 D8 59 CE 0E F6 B7 D8 3D 40 AA 1C | | | | 1D CE 2C 07 20 D1 5A 0F 53 15 95 CA D8 1B A5 D1 | | | | 29 F9 1C C6 76 97 19 F1 43 58 72 C4 BC D0 52 11 | | | | 50 A0 26 3B 47 00 66 48 9B 91 8B FC A0 3C E8 A0 | | | | E9 FC 2C 03 14 C4 B0 96 EA 30 71 7C 03 C2 8C A2 | | | | 9E 67 8E 63 D7 8A CA 1E 9A 63 BD B1 26 1E E7 A0 | | | | B0 41 AB 53 74 6D 68 B5 7B 68 BE F3 7B 71 38 28 | | | | 38 C9 5D A8 55 78 41 A3 CA 58 10 9F 0B 4F 77 A5 | | | | E9 29 B1 A2 5D C2 D6 81 4C 55 DC 0F 81 CD 2F 4E | | | | 5D B9 5E E7 0C 70 6F C0 2C 4F CA 35 8E A9 A8 2D | | | | 80 43 A4 76 11 19 55 80 F8 94 58 E3 DA B5 59 2D | | | | EF E0 6C DE 1E 51 6A 6C 61 ED 78 C1 39 77 AE 96 | | | | 60 A9 19 2C A7 5C D7 29 67 FD 3A FA FA 1F 1A 2F | | | | F6 32 5A 50 64 D8 47 02 8F 1E 6B 23 29 E8 57 2F | | | | 36 E7 08 A5 49 DD A3 55 FC 74 A3 2F DD 8D BA 65 | | | 02 03 ;INTEGER (03 = 3 bytes) | | | | 010001 |
和以前一样,您将所有这些字节都用Base64编码,最后得到第二个示例:
好。
1 2 3 4 5 6 7 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS +rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26 ZQIDAQAB |
添加稍有不同的标题和结尾,您将获得:
好。
1 2 3 4 5 6 7 8 9 | -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS +rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26 ZQIDAQAB -----END PUBLIC KEY----- |
这是您的X.509 SubjectPublicKeyInfo / OpenSSL PEM公共密钥[2]。
好。
正确执行或修改
既然您知道编码不是魔术,那么您就可以编写解析RSA模数和指数所需的所有片段。或者您可以认识到前24个字节只是在原始PKCS#1标准之上添加了新内容
好。
1 2 3 4 5 6 7 8 | 30 82 01 22 ;SEQUENCE (0x122 bytes = 290 bytes) | 30 0D ;SEQUENCE (0x0d bytes = 13 bytes) | | 06 09 ;OBJECT IDENTIFIER (0x09 = 9 bytes) | | 2A 86 48 86 | | F7 0D 01 01 01 ;hex encoding of 1.2.840.113549.1.1 | | 05 00 ;NULL (0 bytes) | 03 82 01 0F 00 ;BIT STRING (0x10f = 271 bytes) | | ... |
由于幸运和好运的特殊巧合:
好。
24 bytes happens to correspond exactly to 32 base64 encoded characters
Ok.
这意味着如果您使用第二个X.509公钥,并分隔前32个字符:
好。
1 2 3 4 5 6 7 8 9 | -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB -----END PUBLIC KEY----- |
删除前32个字符,并将其更改为BEGIN RSA PUBLIC KEY:
好。
1 2 3 4 5 6 7 8 | -----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB -----END RSA PUBLIC KEY----- |
您正是想要的。
好。
好。
我发现此网站是不同格式的很好的技术说明:https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem
" BEGIN RSA PUBLIC KEY"是PKCS#1,只能包含RSA密钥。
" BEGIN PUBLIC KEY"是PKCS#8,它可以包含多种格式。
如果您只想使用命令行进行转换,则" openssl rsa"非常有用。
要将PKCS#8转换为PKCS#1,请执行以下操作:
1 | openssl rsa -pubin -in <filename> -RSAPublicKey_out |
要将PKCS#1转换为PKCS#8,请执行以下操作:
1 | openssl rsa -RSAPublicKey_in -in <filename> -pubout |
尽管上面有关32字节标头,OID格式等的注释很有趣,但我个人认为并没有发现相同的行为。我认为进一步探讨这一点可能会有所帮助,因为大多数人可能认为这是过多的细节。没有什么比多余的更好的了。
好。
首先,我创建了一个RSA私钥,并对其进行了检查:
好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | >openssl rsa -in newclient_privatekey.pem -check RSA key ok writing RSA key -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4pOYWo+GeAEmU4N1HPZj1dxv70 4hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyozC/zSqcuU6iBrvzDTpyG1zhIG 76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknmLBrtZkLkBhchgYnMswIDAQAB AoGAQaJ5aivspeEXcpahWavzAFLv27+Tz48usUV+stY6arRhqbBEkV19/N5t8EPA 01U6IGDQ8QIXEIW/rtsHKM6DAZhAbakPDJhJRatcMzJ08ryIkP/c3+onkTquiveG brw7xzn6Xa8ls04aQ6VQR4jxXUjV5bB72pFZnGRoAmS2NiECQQDUoISbmTGjnHM+ kEfunNTXbNmKklwTYhyZaSVsSptnD7CvLWB4qB/g4h2/HjsELag6Z7SlWuYr7tba H3nBYn35AkEAykFRudMqlBy3XmcGIpjxOD+7huyViPoUpy3ui/Bj3GbqsbEAt9cR PyOJa1VFa2JqShta1Tdep8LJv1QvgvY7CwJBAML+al5gAXvwEGhB3RXg0fi2JFLG opZMFbpDCUTkrtu3MeuVC7HbTVDpTSpmSO0uCed2D97NG+USZgsnbnuBHdECQQCw S3FWPXdetQ0srzaMz61rLzphaDULuZhpBMNqnTYeNmMaUcPjewagd3Rf52rkKFun juKE+Yd7SXGbYWEskT5zAkAD7tbNwe5ryD2CT71jrY/5uXMR2yg/A4Ry2ocZkQUp iGflLrHnODvHO5LYLBlSKpjanBceYHJLuMFNZruf7uBM -----END RSA PRIVATE KEY----- |
(哦,恐怖!我公开了一个私钥。嗯...)
好。
我提取并显示其公钥:
好。
1 2 3 4 5 6 7 8 | >openssl rsa -in newclient_privatekey.pem -pubout writing RSA key -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm LBrtZkLkBhchgYnMswIDAQAB -----END PUBLIC KEY----- |
碰巧有另一个公共密钥输出参数(如前面的注释中所述)。我使用该关键字提取并显示公钥:
好。
1 2 3 4 5 6 7 | >openssl rsa -in newclient_privatekey.pem -RSAPublicKey_out writing RSA key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR 5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE= -----END RSA PUBLIC KEY----- |
好吧。尽管这两个公钥值是从同一私钥派生的,但它们并不相同。还是一样?我将两个公共密钥字符串剪切并粘贴到它们自己的文件中,然后对每个字符串进行模量检查:
好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | >openssl rsa -in newclient_publickey.pem -pubin -modulus Modulus= A7FCE94593BBCB450E9D06235092F8E7 866E293985A8F867801265383751CF66 3D5DC6FEF4E219BCD1E61CEE1D76C5CE E855C0CB05D1C1C8600606941FA6381D 3F2A330BFCD2A9CB94EA206BBF30D3A7 21B5CE1206EFA2AB72375B5FA3E52803 CEF6BFDD0919948A316156852563ACB0 1A49E62C1AED6642E40617218189CCB3 writing RSA key -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm LBrtZkLkBhchgYnMswIDAQAB -----END PUBLIC KEY----- |
" pubin"告诉rsa这确实应该是公钥,不要抱怨它不是私钥。
好。
现在,我们使用RSA公钥,显示模数,然后将其转化为普通的旧"公钥"(同样,我们必须告诉它输入是公钥):
好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | >openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -modulus Modulus= A7FCE94593BBCB450E9D06235092F8E7 866E293985A8F867801265383751CF66 3D5DC6FEF4E219BCD1E61CEE1D76C5CE E855C0CB05D1C1C8600606941FA6381D 3F2A330BFCD2A9CB94EA206BBF30D3A7 21B5CE1206EFA2AB72375B5FA3E52803 CEF6BFDD0919948A316156852563ACB0 1A49E62C1AED6642E40617218189CCB3 writing RSA key -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm LBrtZkLkBhchgYnMswIDAQAB -----END PUBLIC KEY----- |
显示相同的模数和相同的"公钥"值。为了使事情变得更有趣(无论如何对我来说),当我们使用RSAPublicKey_out关键字时,我们得到:
好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | >openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -modulus -RSAPublicKey_out Modulus= A7FCE94593BBCB450E9D06235092F8E7 866E293985A8F867801265383751CF66 3D5DC6FEF4E219BCD1E61CEE1D76C5CE E855C0CB05D1C1C8600606941FA6381D 3F2A330BFCD2A9CB94EA206BBF30D3A7 21B5CE1206EFA2AB72375B5FA3E52803 CEF6BFDD0919948A316156852563ACB0 1A49E62C1AED6642E40617218189CCB3 writing RSA key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR 5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE= -----END RSA PUBLIC KEY----- |
...并且当我们将普通的旧"公钥"转换为RSA公钥时:
好。
1 2 3 4 5 6 7 | >openssl rsa -in newclient_publickey.pem -pubin -RSAPublicKey_out writing RSA key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR 5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE= -----END RSA PUBLIC KEY----- |
...坚持不懈地前进,尽管我们只是在几条命令之前做过,但为了说明这一点,我们将事情转了过来,因此迁移过程从RSA到普通的旧"公钥":
好。
1 2 3 4 5 6 7 8 | >openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -pubout writing RSA key -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm LBrtZkLkBhchgYnMswIDAQAB -----END PUBLIC KEY----- |
...这使我们回到了起点。我们学到了什么?
好。
简介:内部的键是相同的,只是外观不同。较早的注释指出RSA密钥格式是在PKCS#1中定义的,而普通的旧"公共密钥"格式是在PKCS#8中定义的。但是,编辑一种形式并不能将其转换为另一种形式。希望我现在已经把这种区别击败了。
好。
但是,如果仍然有生命的火花,让我们对此多加鞭打,并参考很久以前最初使用RSA私钥生成的证书,并检查其公钥和模数:
好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | >openssl x509 -in newclient_cert.pem -pubkey -noout -modulus -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm LBrtZkLkBhchgYnMswIDAQAB -----END PUBLIC KEY----- Modulus= A7FCE94593BBCB450E9D06235092F8E7 866E293985A8F867801265383751CF66 3D5DC6FEF4E219BCD1E61CEE1D76C5CE E855C0CB05D1C1C8600606941FA6381D 3F2A330BFCD2A9CB94EA206BBF30D3A7 21B5CE1206EFA2AB72375B5FA3E52803 CEF6BFDD0919948A316156852563ACB0 1A49E62C1AED6642E40617218189CCB3 |
……他们从此过着幸福的生活:证书具有与RSA公钥,RSA私钥和普通的旧"公钥"相同的模数值。该证书包含与我们先前看到的相同的普通旧"公钥"值,尽管该证书是使用标记为RSA私钥的文件签名的。可以肯定地说有共识。
好。
在OpenSSL星系的X509象限中没有等效的'RSAPublicKey_out'关键字,因此,尽管模数值被描述为" RSA密钥模数",但我想我们将尽其所能,所以我们无法尝试。
好。
我不知道使用DSA签名的证书的外观如何。
好。
我意识到这并不能回答最初的问题,但也许它提供了一些有用的背景。如果没有,我表示歉意。至少,不要做的事情和不要做的假设。
好。
毫无疑问,当它没有做任何这样的事情时,已经注意到"写RSA密钥"的重复有点令人讨厌。我认为这意味着rsa模块将普通的旧公共密钥识别为真正的RSA密钥,这就是为什么它一直在" RSA密钥"上加重(毕竟它是rsa模块)。如果我没记错的话,通用的EVP_PKEY结构对所有键类型都有一个并集,每个键类型都有自己的特殊值集(有用的g,w,q和其他辅音)。
好。
最后,我注意到有人抱怨编程和开发。现在,每个OpenSSL命令显然都有相应的代码,并且如果希望探索当今OpenSSL编程的所有奇迹,那么命令行似乎是一个合理的起点。在这种特殊情况下(由于我目前正在使用最新的Cygwin),可能首先查看 openssl-1.0.2f apps rsa.c,然后再给定 openssl-1.0。 2f crypto pem pem_all.c
好。
好。
使用phpseclib,一个纯PHP RSA实现...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php include('Crypt/RSA.php'); $rsa = new Crypt_RSA(); $rsa->loadKey('-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS +rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26 ZQIDAQAB -----END PUBLIC KEY-----'); $rsa->setPublicKey(); echo $rsa->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW); |
即使标头显示BEGIN PUBLIC KEY而不是BEGIN RSA PUBLIC KEY,base64编码的内容也似乎匹配。因此,也许只需使用str_replace即可解决该问题,那么您应该一切顺利!
除了页眉/页脚之外,pub1和pub2之间的唯一区别是pub2中的此附加字符串:
额外的字符串对应于根据此答案的算法标识符。