user-0 提问: OpenSSL中生成的RSA密钥对能够通用吗

回复:
user: user-0
content: 引用PEM_read_RSA_pubkey ----- public key  //try this  pem_read_rsapublickey---- rsa public key  谢谢，确实是这个的原因，现在真的解决了。  生成公钥的时候使用PEM_write_RSA_PUBKEY函数，生成的公钥就能够用Crypto++来进行加密，相对应的，读取公钥的时候使用PEM_read_RSA_PUBKEY函数同样能够使用Crypto++的库生成的公钥进行加密  可以结贴啦~

user: user-1
content: 看了下， cryptopp 支持 DER 编码的 RSA PUBKEY, 支持 PKCS#8 编码的 RSA 私钥， 这些是 ASN1, PKCS 标准所规定的， 完全木有任何的的问题。

user: user-0
content: 引用请精确描述问题，到底是怎么回事？  首先                  1. 每个库都有自己的格式， 密钥也如此， 比如你用openssl生成一密钥对， 然后其公约加密，然后把密钥和私钥给crypto++。 请问这种能解密吗？  如果不能解密，原因是什么？是crypto++不能识别私钥格式？  同理，crypto++用自己生成公约加密后，把私钥丢给openssl，openssl无法解密？  2.          如果第一点我猜对了，那么请看下面，如果没有猜对，请不要看。  密钥都是数字，那么是否可以通过bignum之类的接口，把密钥的数字提出来，把数字（密钥）给对方。  这样避免，不同的格式，无法解密的问题。  数字给的对方的时候，再把数字转换为 所要求的密钥格式。  其实问题很简单，就是Crypto++生成的公钥，我使用OpenSSL提供的读取公钥函数无法识别，根本就获取不到公钥。。。我就发现Crypto++生成的公钥长度和我用OpenSSL生成的公钥长度是不一样的（我上面已将粘出来了，明显不一样长的说 = =!），我现在就不知道为什么这两个库生成的公钥会不一样长？是什么原因造成的？有没有什么解决办法？谢谢啦~

user: user-2
content: 引用 12 楼 u012224760 的回复:引用看了下， cryptopp 支持 DER 编码的 RSA PUBKEY, 支持 PKCS#8 编码的 RSA 私钥， 这些是 ASN1, PKCS 标准所规定的， 完全木有任何的的问题。 这个我也看了，在一个英文网站上看到了，我感觉Crypto++生成的密钥是没有问题的，我觉得就是我用PEM_write_bio_RSAPublicKey()这个函数提取出来的公钥长度有问题，但是并不知道问题在哪？    PEM_read_RSA_pubkey ----- public key  //try this  pem_read_rsapublickey---- rsa public key

user: user-0
content: 引用看了下， cryptopp 支持 DER 编码的 RSA PUBKEY, 支持 PKCS#8 编码的 RSA 私钥， 这些是 ASN1, PKCS 标准所规定的， 完全木有任何的的问题。 这个我也看了，在一个英文网站上看到了，我感觉Crypto++生成的密钥是没有问题的，我觉得就是我用PEM_write_bio_RSAPublicKey()这个函数提取出来的公钥长度有问题，但是并不知道问题在哪？

user: user-0
content: 引用还有密钥的格式问题，  你用openssl生成密钥对，会看到，密钥的前面有----public rsa ---- 之类的字眼吧。  crypto++ 有没有？ crypto++ 是没有，但是我发现并不只是这个问题，我把crypto++生成密钥格式变成与openssl的一样的话还是不行，感觉最离谱的是，不单纯是格式不同，整个密钥的长度都差不少 这个是openssl生成的公钥长度： MEgCQQDEg++2FXqzMrcwIqvnjr7CsqGgSAW2X9W9FJv3sZ9H/vOmNrS3KMXwZaZfJheM/jfF4ExuoDAZUhdhvM5D6uHVAgMBAAE= 这个是crypto++生成公钥长度： MFowDQYJKoZIhvcNAQEBBQADSQAwRgJBALld1AnfrvHKZ6oIFmKw6XFwpDC67kImYvFLumsPyMhR33KtsAcULSO7JIxH0g8pZli++LkDrp9XrAD8289dYT8CARE= 除去openssl那些格式，且都是512密钥长度，实在是不知道这是为什么？有没有什么解决办法

user: user-0
content: crypto++ 是没有，但是我发现并不只是这个问题，我把crypto++生成密钥格式变成与openssl的一样的话还是不行，感觉最离谱的是，不单纯是格式不同，整个密钥的长度都差不少 这个是openssl生成的公钥长度： MEgCQQDEg++2FXqzMrcwIqvnjr7CsqGgSAW2X9W9FJv3sZ9H/vOmNrS3KMXwZaZfJheM/jfF4ExuoDAZUhdhvM5D6uHVAgMBAAE= 这个是crypto++生成公钥长度： MFowDQYJKoZIhvcNAQEBBQADSQAwRgJBALld1AnfrvHKZ6oIFmKw6XFwpDC67kImYvFLumsPyMhR33KtsAcULSO7JIxH0g8pZli++LkDrp9XrAD8289dYT8CARE= 除去openssl那些格式，且都是512密钥长度，实在是不知道这是为什么？有没有什么解决办法

user: user-2
content: 引用 楼主 u012224760 的回复:我之前用的Crypto++的库写的C++的RSA密钥生成工具以及加解密工具，但是现在需要使用C语言来实现RSA加解密，我就又使用了OpenSSL的库来实现，问题是现在OpenSSL的加解密没有办法使用之前Crypto++库生成密钥，按道理来讲，RSA算法都是一样的，可是为什么密钥不能通用呢？是什么原因？有没有解决的办法呢？请各位大神指教！  密钥长度，  还有算法的padding 不一样，  都会失败

user: user-2
content: 还有密钥的格式问题，  你用openssl生成密钥对，会看到，密钥的前面有----public rsa ---- 之类的字眼吧。  crypto++ 有没有？

user: user-2
content: 引用 8 楼 u012224760 的回复:引用padding， 明文需要padding  楼主做实验：  将简单明文， 比如123，  用2个密钥库加密后，试试结果是否一样，  先不要管长的明文。 刚刚搞错了，加密长度其实也是一样的 crypto++库 I05DbaBzRA0AaiBaL9Do7hhyIQLs8yaArlYgvdw++pa6Ju0Q56ovKswaNc0oQfXy7T/kEN0+Np7z8mxApkwHNjIE+pWESMAABBO3GH4uNEZkmtvf3aos6cqvhF48kMUy4SHI1HSkAqqDEHyRXYENCkO9w0K6sW73A9O2wzVK6Dw= （123使用1024长度的密钥加密的结果） openssl库 I05DbaBzRA0AaiBaL9Do7hhyIQLs8yaArlYgvdw++pa6Ju0Q56ovKswaNc0oQfXy7T/kEN0+Np7z8mxApkwHNjIE+pWESMAABBO3GH4uNEZkmtvf3aos6cqvhF48kMUy4SHI1HSkAqqDEHyRXYENCkO9w0K6sW73A9O2wzVK6Dw= （123使用1024长度的密钥加密的结果） 我的问题不是密文不能通用，而是密钥不能通用，crypto++生成的密钥长度和openssl生成的密钥长度不一致，但是分别都可以正常进行加解密的，我想知道这是什么原因造成？有没有解决办法？  请精确描述问题，到底是怎么回事？  首先                  1. 每个库都有自己的格式， 密钥也如此， 比如你用openssl生成一密钥对， 然后其公约加密，然后把密钥和私钥给crypto++。 请问这种能解密吗？  如果不能解密，原因是什么？是crypto++不能识别私钥格式？  同理，crypto++用自己生成公约加密后，把私钥丢给openssl，openssl无法解密？  2.          如果第一点我猜对了，那么请看下面，如果没有猜对，请不要看。  密钥都是数字，那么是否可以通过bignum之类的接口，把密钥的数字提出来，把数字（密钥）给对方。  这样避免，不同的格式，无法解密的问题。  数字给的对方的时候，再把数字转换为 所要求的密钥格式。

user: user-0
content: 引用padding， 明文需要padding  楼主做实验：  将简单明文， 比如123，  用2个密钥库加密后，试试结果是否一样，  先不要管长的明文。 刚刚搞错了，加密长度其实也是一样的 crypto++库 I05DbaBzRA0AaiBaL9Do7hhyIQLs8yaArlYgvdw++pa6Ju0Q56ovKswaNc0oQfXy7T/kEN0+Np7z8mxApkwHNjIE+pWESMAABBO3GH4uNEZkmtvf3aos6cqvhF48kMUy4SHI1HSkAqqDEHyRXYENCkO9w0K6sW73A9O2wzVK6Dw= （123使用1024长度的密钥加密的结果） openssl库 I05DbaBzRA0AaiBaL9Do7hhyIQLs8yaArlYgvdw++pa6Ju0Q56ovKswaNc0oQfXy7T/kEN0+Np7z8mxApkwHNjIE+pWESMAABBO3GH4uNEZkmtvf3aos6cqvhF48kMUy4SHI1HSkAqqDEHyRXYENCkO9w0K6sW73A9O2wzVK6Dw= （123使用1024长度的密钥加密的结果） 我的问题不是密文不能通用，而是密钥不能通用，crypto++生成的密钥长度和openssl生成的密钥长度不一致，但是分别都可以正常进行加解密的，我想知道这是什么原因造成？有没有解决办法？

user: user-0
content: 引用padding， 明文需要padding  楼主做实验：  将简单明文， 比如123，  用2个密钥库加密后，试试结果是否一样，  先不要管长的明文。 加密出来的结果肯定是不一样的啊，相同的库，相同的密钥，相同的内容，每次加密得到的密文都是不一样的，长度的话确实不同，是这样的： crypto++库 ivQqC7jPaTVquKsbZcdVKB2V0K5znnUc9BEwKjHFPMuF9k5VokgzUxnBBqOZvimcuyITgE6N TPc/dz2hevneXj5AhybNja2x8oz9FJ4BJLiphskMfLZAfo2EmY1+IZC9VVk5yCCdNG/4uhvm f6QLHKfx1Nh/A24KG0DSsw2ytEQ=     （123使用512长度的密钥加密的结果） openssl库 G0OcYhXVnf+BlMxn0jGaE4Bb19jwuKM7H0AUhT6XAnRXCKWtKtZi2Ztyaj45wJKvF+KI5sDePSFmvmG/MFo1Yg== （123使用512长度的密钥加密的结果） 这个长度不同是与padding有关吗？得到的密钥的长度不同，是不是也和这个有关系呢？

user: user-3
content: 应该有地方配置密钥长度的。

user: user-4
content: padding， 明文需要padding  楼主做实验：  将简单明文， 比如123，  用2个密钥库加密后，试试结果是否一样，  先不要管长的明文。