linux c openssl rsa 加解密

1.PEM私钥文件格式

-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

生成该密钥的Linux命令:OpenSSL>genrsa -out privateKey.pem 1024
读取该密钥的Linux Openssl API 函数文件读取:
RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)
读取该密钥的Linux Openssl API 函数内存读取:
RSA *PEM_read_bio_RSAPrivateKey(BIO *bio, RSA **rsa, pem_password_cb *cb, void *u)
 

2.PEM私钥文件格式(经过口令加密)

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,FCD22C6C17CF034C
-----END RSA PRIVATE KEY-----

生成该密钥的Linux命令:OpenSSL>genrsa -des3 -out privateKey.pem 1024
enter后会要求输入口令(最少四位)
读取该密钥的Linux Openssl API 函数文件读取:
RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)
读取该密钥的Linux Openssl API 函数内存读取:
RSA *PEM_read_bio_RSAPrivateKey(BIO *bio, RSA **rsa, pem_password_cb *cb, void *u)
 

3.PEM公钥文件格式

-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----

生成该密钥的Linux命令:OpenSSL>rsa -in privateKey.pem -pubout -out publicKey.pem
读取该密钥的Linux Openssl API 函数文件读取:
RSA *PEM_read_RSA_PUBKEY(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)
读取该密钥的Linux Openssl API 函数内存读取:
RSA *PEM_read_bio_PUBKEY(BIO *bio, RSA **rsa, pem_password_cb *cb, void *u)
 

4.PEM RSAPublicKey公钥文件格式

-----BEGIN RSA PUBLIC KEY-----
-----END RSA PUBLIC KEY-----

生成该密钥的Linux命令:OpenSSL>rsa -in privateKey.pem -RSAPublicKey_out -out publicKey.pem
读取该密钥的Linux Openssl API 函数文件读取:
RSA *PEM_read_RSAPublicKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)
读取该密钥的Linux Openssl API 函数内存读取:
RSA *PEM_read_bio_RSAPublicKey(BIO *bio, RSA **rsa, pem_password_cb *cb, void *u)

 

5.RSA加密API

int RSA_public_encrypt(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding)
参数说明:
flen: 填充方式加密长度
from: 要加密信息
to: 加密后的信息
padding: 填充方式( RSA_PKCS1_PADDING ,RSA_PKCS1_OAEP_PADDING,RSA_SSLV23_PADDING,RSA_NO_PADDING)
(注:flen会根据不同的填充方式大小会有变化参考)

 

6.RSA解密API

int RSA_private_decrypt(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding)
参数说明:
flen: 解密密钥长度
from: 要解密信息
to: 解密后的信息
padding: 填充方式( RSA_PKCS1_PADDING ,RSA_PKCS1_OAEP_PADDING,RSA_SSLV23_PADDING,RSA_NO_PADDING)
(注:flen填写的是密钥长度可用RSA_size(rsa)函数得到)
 

7.RSA编程示例(PEM文件方式)

#include <openssl/rsa.h>
#include <openssl/pem.h>
 
#define PUBLICKEY "publicKey.pem"
#define PRIVATEKEY "privateKey.pem"
 
#define PASS "8888" //口令
 
int main(int argc, char *argv[])
{
	FILE *fp = NULL;
	RSA *publicRsa = NULL;
	RSA *privateRsa = NULL;
	if ((fp = fopen(PUBLICKEY, "r")) == NULL) 
	{
		printf("public key path error\n");
		return -1;
	} 	
   
	if ((publicRsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL)) == NULL) 
	{
		printf("PEM_read_RSA_PUBKEY error\n");
		return -1;
	}
	fclose(fp);
	
	if ((fp = fopen(PRIVATEKEY, "r")) == NULL) 
	{
		printf("private key path error\n");
		return -1;
	}
	OpenSSL_add_all_algorithms();//密钥有经过口令加密需要这个函数
	if ((privateRsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, (char *)PASS)) == NULL) 
	{
		printf("PEM_read_RSAPrivateKey error\n");
		return NULL;
	}
	fclose(fp);		
	
	unsigned char *source = (unsigned char *)"123456789";
		
	int rsa_len = RSA_size(publicRsa);
 
	unsigned char *encryptMsg = (unsigned char *)malloc(rsa_len);
	memset(encryptMsg, 0, rsa_len);
 		
	int len = rsa_len - 11;
 		
	if (RSA_public_encrypt(len, source, encryptMsg, publicRsa, RSA_PKCS1_PADDING) < 0)
		printf("RSA_public_encrypt error\n");
	else 
	{
		rsa_len = RSA_size(privateRsa);
		unsigned char *decryptMsg = (unsigned char *)malloc(rsa_len);
		memset(decryptMsg, 0, rsa_len);
	    
		int mun =  RSA_private_decrypt(rsa_len, encryptMsg, decryptMsg, privateRsa, RSA_PKCS1_PADDING);
	 
		if ( mun < 0)
			printf("RSA_private_decrypt error\n");
		else
			printf("RSA_private_decrypt %s\n", decryptMsg);
	}	
	
	RSA_free(publicRsa);
	RSA_free(privateRsa);
	return 0;
}

 

8.RSA编程示例(PEM内存方式)

#include <cstdio>
#include <cstring>
#include <openssl/rsa.h>
#include <openssl/pem.h>
 
const char *publicKey = "-----BEGIN PUBLIC KEY-----\n\
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDnal1HozHfmZ3B1TITmbjCNKOs\n\
49S+urgJ2P0/T36qN5w+r1jGhZKr54QDI5oXEk+9arlKxDW8kufwGjaTV3i3hyGS\n\
jYv4wNXhPeZAyAQ1vlloLMT6oA0PKe9/l8+mAr1QPEW9fMixAc/0UzPVospjkpfr\n\
YULcrKcH2Oaou5DZ0QIDAQAB\n\
-----END PUBLIC KEY-----";
 
const char *privateKey = "-----BEGIN RSA PRIVATE KEY-----\n\
Proc-Type: 4,ENCRYPTED\n\
DEK-Info: DES-EDE3-CBC,DF3BD9835CA1186D\n\
\n\
pomWi9/hjscwDDzH5CEpcj8nCumOQpl/2Gk2YynA47qfhxt12glNjgWl5Eaevk2L\n\
bG1t85sPqEvYxAe+ZxZdP6fot+sAg4SUUwSvBMwa7s3XjVhHjf/+hOIjb0skHvp/\n\
p0eOoUgytX7FrNNYEpUFI+eiPob79fgQMq/rypGJ//G6GXLMYixWw2+PyPa1x2PQ\n\
WdBaTpZK3gmDqmu6jR3ieKOahVVO4fEGB5etvB5i1aAh0mT4Wu+ejv2LgIRr2xor\n\
r8LkQZvI/TryZ0sNLe7LlC1bz/Hw8hLBDPprhWaUcSEk6MMgh3LKA2y/pGpFdIYN\n\
Ncj/c+YqEsO+I0KOtPQ1fXlXd1hH1H1rkJxuaNanF0UInUuupV3fP+7cvmfyHM4m\n\
aix8ROt1/Ghau41JDZGYmwk2qgKjUw4zz3eYOMQKl6row3pzhDxbvoMp0Qvfje1J\n\
RYpKMy8skG9pY1l4i1CC98aESC2a7FzjUNcY3f5Jt+QznO15xXxxuJZ8+xNqtIh2\n\
U348rlrQ8OxS1YBJCr+wjesdBdQAiY6X1YB9tljPs7AhlTLo78pHtQac521xOA8j\n\
IcbfkuTIrMIwYBOtM6SJHkB1TgPdPWx+haEy79Ct2yDnvpPqOiFz8i8TG8AQY53l\n\
5xKxxJ9CmPqw+Ua3DAWPaxAMaJFteRbl5Lv/2MvxV9Mu3T0W4B3ij+Gg5aw81v5Y\n\
KTH2KxruYAF5Q70QG8CAR8Vkvdczw940y8nb9pvcixmqYcaaeM9DLaTbycn/AeCt\n\
3UM0R0vvu039Ix5uhXUtVMjhTeUnvNObwEcKM8Grv1oPV3zmTJ5hJg==\n\
-----END RSA PRIVATE KEY-----";
 
#define PASS "8888" //口令
 
int main(int argc, char *argv[])
{
	BIO *bio = NULL;
	RSA *publicRsa = NULL;
	RSA *privateRsa = NULL;
	if ((bio = BIO_new_mem_buf((void *)publicKey, -1)) == NULL)
	{
		printf("BIO_new_mem_buf publicKey error\n");
		return -1;
	} 	
   
	if ((publicRsa = PEM_read_bio_RSA_PUBKEY(bio, NULL, NULL, NULL)) == NULL) 
	{
		printf("PEM_read_bio_RSA_PUBKEY error\n");
		return -1;
	}
	BIO_free_all(bio);
	
	if ((bio = BIO_new_mem_buf((void *)privateKey, -1)) == NULL)
	{
		printf("BIO_new_mem_buf privateKey error\n");
		return -1;
	}
	OpenSSL_add_all_algorithms();//密钥有经过口令加密需要这个函数
	if ((privateRsa = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, (char *)PASS)) == NULL) 
	{
		printf("PEM_read_RSAPrivateKey error\n");
		return NULL;
	}
	BIO_free_all(bio);
	
	unsigned char *source = (unsigned char *)"123456789";
		
	int rsa_len = RSA_size(publicRsa);
 
	unsigned char *encryptMsg = (unsigned char *)malloc(rsa_len);
	memset(encryptMsg, 0, rsa_len);
 		
	int len = rsa_len - 11;
 		
	if (RSA_public_encrypt(len, source, encryptMsg, publicRsa, RSA_PKCS1_PADDING) < 0)
		printf("RSA_public_encrypt error\n");
	else 
	{
		rsa_len = RSA_size(privateRsa);
		unsigned char *decryptMsg = (unsigned char *)malloc(rsa_len);
		memset(decryptMsg, 0, rsa_len);
	    
		int mun =  RSA_private_decrypt(rsa_len, encryptMsg, decryptMsg, privateRsa, RSA_PKCS1_PADDING);
	 
		if ( mun < 0)
			printf("RSA_private_decrypt error\n");
		else
			printf("RSA_private_decrypt %s\n", decryptMsg);
	}	
	
	RSA_free(publicRsa);
	RSA_free(privateRsa);
	return 0;
}

 

9.RSA编程示例(PEM文件方式多线程测试样例)

#include <cstdio>
#include <cstring>
#include <pthread.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#define PRIKEY "prikey.pem"
#define PUBKEY "pubkey.pem"
 
RSA *publicRsa = NULL;
RSA *privateRsa = NULL;
 
void* rsaThreadOne(void* param)
{	
	unsigned char *source = (unsigned char *)param;
		
	int rsa_len = RSA_size(publicRsa);
 
	unsigned char *encryptMsg = (unsigned char *)malloc(rsa_len);
	memset(encryptMsg, 0, rsa_len);
 		
	int len = rsa_len - 11;
 		
	if (RSA_public_encrypt(len, source, encryptMsg, publicRsa, RSA_PKCS1_PADDING) < 0)
	{
		printf("rsaThreadOne RSA_public_encrypt error\n");
		return 0;
	}
		
	rsa_len = RSA_size(privateRsa);
	unsigned char *decryptMsg = (unsigned char *)malloc(rsa_len);
	memset(decryptMsg, 0, rsa_len);
    
	int mun =  RSA_private_decrypt(rsa_len, encryptMsg, decryptMsg, privateRsa, RSA_PKCS1_PADDING);
 
	if ( mun < 0)
	{
		printf("rsaThreadOne RSA_private_decrypt error\n");
		return 0;
	}
	else 
	{
		printf("rsaThreadOne %s\n", decryptMsg);
	}
	
	return 0;
}
 
void* rsaThreadTwo(void* param)
{	
	unsigned char *source = (unsigned char *)param;
		
	int rsa_len = RSA_size(publicRsa);
 
	unsigned char *encryptMsg = (unsigned char *)malloc(rsa_len);
	memset(encryptMsg, 0, rsa_len);
 		
	int len = rsa_len - 11;
 		
	if (RSA_public_encrypt(len, source, encryptMsg, publicRsa, RSA_PKCS1_PADDING) < 0)
	{
		printf("rsaThreadTwo RSA_public_encrypt error\n");
		return 0;
	}
 
	rsa_len = RSA_size(privateRsa);
	unsigned char *decryptMsg = (unsigned char *)malloc(rsa_len);
	memset(decryptMsg, 0, rsa_len);
    
	int mun =  RSA_private_decrypt(rsa_len, encryptMsg, decryptMsg, privateRsa, RSA_PKCS1_PADDING);
 
	if ( mun < 0)
	{
		printf("rsaThreadTwo RSA_private_decrypt error\n");
		return 0;
	}
	else 
	{
		printf("rsaThreadTwo %s\n", decryptMsg);
	}	
	return 0;
}
 
int main(int argc, char *argv[])
{
	FILE *fp = NULL;
	if ((fp = fopen(PUBKEY, "r")) == NULL) 
	{
		printf("pubkey_path error\n");
		return -1;
	} 	
   
	if ((publicRsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL)) == NULL) 
	{
        	printf("PEM_read_RSA_PUBKEY error\n");
        	return -1;
	}
	fclose(fp);
	
	if ((fp = fopen(PRIKEY, "r")) == NULL) 
	{
		printf("prikey_path error\n");
		return -1;
    	}
	OpenSSL_add_all_algorithms();//密钥有经过口令加密需要这个函数
	if ((privateRsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, (char *)"8888")) == NULL) 
	{
		printf("PEM_read_RSAPrivateKey error\n");
		return NULL;
	}
	fclose(fp);
		
	pthread_t tid1 ;
	pthread_t tid2 ;
 
	pthread_create(&tid1, NULL, rsaThreadOne, (void *)"123456789");
	pthread_create(&tid2, NULL, rsaThreadTwo, (void *)"987654321");
        
	pthread_join(tid1,NULL);	
	pthread_join(tid2,NULL);
		 
	return 0;
}

 

 

### 回答1: RSA是一种非对称加密算法,使用公钥加密和私钥解密。在Linux和Qt环境下,我们可以使用OpenSSL库对RSA进行加密和解密操作。 在Qt中使用OpenSSL库,需要在.pro文件中加入如下语句: LIBS += -lssl -lcrypto 这样就可以链接OpenSSL库。 RSA算法分为公钥加密和私钥解密两个步骤。在Qt中,我们可以使用该库中的RSA_generate_key函数生成一对公私钥,该函数需要传入一个整型值作为密钥位数。 生成密钥对后,我们可以使用RSA_public_encrypt函数和RSA_private_decrypt函数分别对明文进行加密和密文进行解密操作。 下面是一个简化版的RSA加密算法实现: #include <openssl/rsa.h> #include <openssl/pem.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { // 生成密钥对 RSA *r = RSA_generate_key(1024, RSA_F4, NULL, NULL); // 明文和密文 unsigned char plaintext[100] = "Hello, world!"; unsigned char ciphertext[1024] = {0}; unsigned char output[100] = {0}; // 加密 int len = RSA_public_encrypt(strlen((const char *)plaintext), plaintext, ciphertext, r, RSA_PKCS1_PADDING); printf("Ciphertext: %s\n", ciphertext); // 解密 len = RSA_private_decrypt(len, ciphertext, output, r, RSA_PKCS1_PADDING); printf("Plaintext: %s\n", output); return 0; } 这是一个简单的RSA加密解密程序,其中使用了OpenSSL库中的RSA_generate_keyRSA_public_encrypt和RSA_private_decrypt函数分别生成密钥对、加密明文和解密密文。 ### 回答2: RSA加密算法是一种非对称加密算法,常用于信息安全领域。使用Qt实现RSA加密解密,需要先了解RSA算法及其原理。 首先,RSA算法中需要生成一对公私钥,公钥用于加密,私钥用于解密。生成公私钥的过程如下: 1. 随机选择两个不同的质数p和q 2. 计算n=p*q 3. 计算欧拉函数φ(n)=(p-1)*(q-1) 4. 选择一个整数e(1<e<φ(n)),e与φ(n)互质 5. 计算d,满足d*e ≡ 1 (mod φ(n)) 6. 公钥为(n,e),私钥为(n,d) 加密过程如下: 1. 将待加密数据转换为整数m(0<=m<n) 2. 计算密文c=m^e (mod n) 解密过程如下: 1. 接收到密文c 2. 计算明文m=c^d (mod n) 使用Qt实现RSA加密解密,可以参考以下步骤: 1. 生成公私钥对:随机选择两个质数p和q,计算n、φ(n)、e和d,得到公钥(n,e)和私钥(n,d)。 2. 加密:将待加密数据转换为整数m,计算密文c=m^e(mod n)。 3. 解密:接收到密文c,计算明文m=c^d(mod n)。 4. 实现一个简化版的RSA加密算法:通过Qt提供的大数类,实现上述步骤。 5. 测试:输入待加密的字符串,将其转换为整数后加密,再将密文解密并转回字符串,与原字符串进行比较,验证加解密是否正确。 总的来说,使用Qt实现RSA加密解密需要了解RSA算法原理,并掌握Qt提供的大数类。在实现过程中,需要注意数据类型的转换和边界处理,保证算法的正确性和运行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值