user-0 提问: 基于openssl的rsa加密算法，生成RSA结构的问题

回复:
user: user-1
content: 请判断每个函数调用的返回值！ 针对此贴，我只会回复这句。

user: user-2
content: 实在是不会啊，但是从文件里读取公钥的方式是好用的， 新建一个公钥文件test_pub.key, 里面保存字符串 	"-----BEGIN PUBLIC KEY-----" 	"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/QT8fkiY9pZRu4s3TXRqgpoP7" 	"pMlsQFn7yV6GQC/xMHBLlCwCdibXnfsfW45kwSDpGSodpAw0qN2YxeXi0bfvfK4R" 	"q6zTW5Sgiz747wV2eP+zRII76o5MNVik8+azW+hfMwZ92n8weKfGx6qFNOSy3a4w" 	"SKzJaaE9d+FQeZhYgwIDAQAB" 	"-----END PUBLIC KEY-----";   #include <string.h> #include <stdio.h> #include <openssl/rsa.h> #include <openssl/x509.h> #include <openssl/pem.h> #include <openssl/err.h>  char rsa_pub_der[] =  	"-----BEGIN PUBLIC KEY-----" 	"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/QT8fkiY9pZRu4s3TXRqgpoP7" 	"pMlsQFn7yV6GQC/xMHBLlCwCdibXnfsfW45kwSDpGSodpAw0qN2YxeXi0bfvfK4R" 	"q6zTW5Sgiz747wV2eP+zRII76o5MNVik8+azW+hfMwZ92n8weKfGx6qFNOSy3a4w" 	"SKzJaaE9d+FQeZhYgwIDAQAB" 	"-----END PUBLIC KEY-----";  int GetPubKey(char *pucPubKeyData, int KeyDataLen, RSA** pubRsa)  { #if 0 	BIO *bp = NULL; 	char buf[255] = {0}; 	int i = 0; 	 	bp = BIO_new_mem_buf(pucPubKeyData, KeyDataLen); 	if (NULL == bp) 	{ 		ERR_print_errors_fp(stdout); 		return -1; 	} 	 	if (PEM_read_bio_RSAPublicKey(bp, pubRsa, NULL, NULL) == NULL) 	{ 		ERR_print_errors_fp(stdout); 		return -1; 	}  #else  	FILE* fp = NULL;  	  	fp = fopen("test_pub.key", "r");  	  	if((*pubRsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL)) == NULL) 	{ 		ERR_print_errors_fp(stdout); 		return -1; 	}         #endif    return 0;  }  int main(void) { 	RSA *rsa = NULL;   	//load error strings 	ERR_load_crypto_strings(); 	 	int len = sizeof(rsa_pub_der); 	 	if ( GetPubKey(rsa_pub_der, len, &rsa) == 0) 	{ 		printf("Success!\n"); 	}  	return 0; }

user: user-0
content: 引用 2 楼 lgbxyz 的回复:首先 声明不懂openssl,  1.调用流程不对，你看openssl源码的调用方式  static int rsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey) {     const unsigned char *p;     int pklen;     RSA *rsa = NULL;     if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, NULL, pubkey))         return 0;     if (!(rsa = d2i_RSAPublicKey(NULL, &p, pklen))) {         RSAerr(RSA_F_RSA_PUB_DECODE, ERR_R_RSA_LIB);         return 0;     }     EVP_PKEY_assign_RSA(pkey, rsa);     return 1; }   2.你的公钥可能不对，d2i_RSAPublicKey 执行后返回的错误是  #include <openssl/err.h>  ERR_load_crypto_strings(); printf("%s\n",ERR_error_string(ERR_get_error(), NULL));  error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag   公钥的格式肯定是对的，我是用openssl生成的pem格式的密钥转换成der格式的密钥，然后用hexdump命令输出16进制的格式来测试的，至于调用流程。。我也是从给定的密钥常量，使用d2i_RSAPublicKey提取RSA格式，用于加密。因为如果是pem格式的密钥，也是调用PEM_read_bio_RSA_PUBKEY之类的提取RSA结构然后加密。应该只是密钥格式不同调用不同的方法。就是正常的der格式是二进制的，我这里密钥写成16进制了应该是没有影响的吧！

user: user-2
content: 首先 声明不懂openssl,  1.调用流程不对，你看openssl源码的调用方式  static int rsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey) {     const unsigned char *p;     int pklen;     RSA *rsa = NULL;     if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, NULL, pubkey))         return 0;     if (!(rsa = d2i_RSAPublicKey(NULL, &p, pklen))) {         RSAerr(RSA_F_RSA_PUB_DECODE, ERR_R_RSA_LIB);         return 0;     }     EVP_PKEY_assign_RSA(pkey, rsa);     return 1; }   2.你的公钥可能不对，d2i_RSAPublicKey 执行后返回的错误是  #include <openssl/err.h>  ERR_load_crypto_strings(); printf("%s\n",ERR_error_string(ERR_get_error(), NULL));  error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag

user: user-0
content: 有没有人来帮忙下