日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程

發(fā)布時間:2024/1/23 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

PEM文件有以下格式

? ? 1.PEM私鑰文件格式

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

? ? ?生成該密鑰的Linux命令 : OpenSSL> genrsa -out privateKey.pem 1024

? ? ?讀取該密鑰的Linux Openssl API函數(shù)文件讀取:

?RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)

? ? ?讀取該密鑰的Linux Openssl API函數(shù)內(nèi)存讀取:

?RSA *PEM_read_bio_RSAPrivateKey(BIO *bio, RSA **rsa, pem_password_cb *cb, void *u)

? ? ?2.PEM私鑰文件格式(經(jīng)過口令加密)

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

? ? ? 3.PEM公鑰文件格式

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

? ? ? 生成該密鑰的Linux命令: OpenSSL>rsa -in privateKey.pem -pubout -out publicKey.pem

? ? ? 讀取該密鑰的Linux Openssl API函數(shù)文件讀取:

?RSA *PEM_read_RSA_PUBKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)

? ? ? 讀取該密鑰的Linux Openssl API函數(shù)內(nèi)存讀取:

? RSA *PEM_read_bio_PublicKey(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函數(shù)文件讀取:

? ? RSA *PEM_read_RSAPublicKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)

? ? ? ?讀取該密鑰的Linux Openssl API函數(shù)內(nèi)存讀取:

? ? 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)

? ? ? ?參數(shù)說明:

? ? ? ? flen: 填充方式加密長度

? ? ? ? from: 要加密信息

? ? ? ? to: 加密后的信息

? ? ? ? padding: 填充方式(RSA_PKCS1_PADDING, RSA_PKCS1_OAEP_PADDING, RSA_SSLV23_PADDING, RSA_NO_PADDING)

? ? ? ? 注:flen會根據(jù)不同的填充方式大小會有變化參考

? ? ? 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)函數(shù)得到的

? ? ? 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(); //密鑰有經(jīng)過口令加密需要這個函數(shù)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內(nèi)存方式)

#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();//密鑰有經(jīng)過口令加密需要這個函數(shù)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();//密鑰有經(jīng)過口令加密需要這個函數(shù)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; }

? ? ? ? ? 10.相應(yīng)參考文章、文檔

? ? ? ? ? ? ? ?嗨!大佟!博客
? ? ? ? ? ? ? ?wjlkoorey的博客
? ? ? ? ? ? ? ?需要翻墻才能訪問的openssl github

轉(zhuǎn)載地址:https://blog.csdn.net/aqlick12/article/details/78480505

?

在實際的編譯過程中,出現(xiàn)了如下的錯誤:

參考了https://bugs.php.net/bug.php?id=15780鏈接中的第一條回復(fù),發(fā)現(xiàn)我的系統(tǒng)中有兩個openssl版本,所以需要確保include的東西和link的東西版本保持一致。故加了-I/usr/local/openssl/include之后,問題消失,如下:

總結(jié)

以上是生活随笔為你收集整理的Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人黄页网站 | 亚洲美女性生活 | 日韩欧美一区二区三区视频 | 亚洲成人午夜电影 | 中国免费一级片 | 人妻精品一区一区三区蜜桃91 | 4438五月天 | 美国色视频 | 亚洲天堂中文字幕 | 性感美女被爆操 | 九九热免费精品视频 | 美女扒开尿口让男人桶 | 69福利视频 | 五十路av | 国产欧美日韩高清 | 久热国产在线 | 日韩特级 | 欧美日韩中文国产 | 亚洲无码一区二区三区 | 日韩亚洲在线 | 亚洲一区二区三区免费观看 | 日本少妇性生活 | 久久国产夫妻 | 天天激情站 | 天天搞天天搞 | 看av的网址| 看片网址国产福利av中文字幕 | 射美女 | 欧美成人免费观看视频 | 日韩一区免费视频 | aaa久久 | 999久久久精品 | 日本一级吃奶淫片免费 | 91免费版在线看 | 特黄a级片 | 在线你懂的 | 美女扒开腿让男人 | 凹凸精品熟女在线观看 | 国产精品一区二区无线 | 国产亚洲精品成人 | 欧美一级黄色网 | 天天干天天舔天天射 | 中文字幕有码视频 | 中文字幕观看av | 久久久久久久福利 | 免费色网站 | 久久久久久国产精品日本 | 欧美视频成人 | 日本亚洲一区二区三区 | 九九这里只有精品视频 | 蜜臀中文字幕 | 国产无遮挡又黄又爽免费视频 | 粉嫩av一区二区三区免费观看 | 免费观看高清在线 | 亚洲av综合av一区二区三区 | 色老久久| 亚洲无遮挡 | 福利在线电影 | 伊人66| 亚洲综合图区 | 久久久久久亚洲中文字幕无码 | 999精品在线视频 | 成人区视频 | 午夜黄色大片 | 国产在线免费视频 | 国产精品一区二区三区四 | 奶波霸巨乳一二三区乳 | 新国产视频 | 亚洲爱色 | 亚洲国产成人在线观看 | 少妇又紧又色又爽又刺激视频 | 中文字幕一区二区人妻在线不卡 | 国产成人免费视频网站 | 羞羞影院体验区 | 五月天婷婷在线视频 | 日韩免费毛片 | 亚天堂 | 欧洲性生活视频 | 88av视频 | 91免费精品 | 久久99国产综合精品免费 | 欧美在线一卡 | 日美一级片 | 精东传媒在线观看 | 国产精品美女毛片真酒店 | 欧美色插| 51自拍视频| 99热r| 69视频一区二区 | 免费视频国产 | 日韩大片在线免费观看 | 国产一区免费 | 色老大影院 | 久久婷婷av | 人与性动交zzzzbbbb | 亚洲免费av网址 | 成人美女在线观看 | 国产人妻精品一区二区三区 | 国产av一区二区三区传媒 |