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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++ Opensll RSA分段加密

發布時間:2023/12/20 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++ Opensll RSA分段加密 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?開發環境是VC++6.0,調用opensll編譯生成的靜態庫,采用分段加密需要注意的分隔符是什么?

避免導致超過最大明文長度的加密數據解析不出來。

最終對接的是與java平臺的RSA加密,平臺負責提供公鑰,我們根據提供的公鑰的進行加密,平臺把加密數據正確解析出來就ok了。

開發中遇見的問題:我們最終編譯出來的是動態庫,動態庫中編譯opensll,組件調用動態庫就會出現問題,具體問題截圖我就不展示了。

解決方法:就是組件編譯opensll頭文件就可以了。

CHAR * CUtfRSADlg::my_encrypt(CHAR *str, CHAR *path_key) {// str:需要加密的明文。path_key:公鑰路徑int err;CHAR*p_en;RSA *p_rsa;FILE *file,*frsa;int flen, rsa_len;file = fopen((const char *) path_key, "r");if ((file) == NULL) {perror("open key file error");return NULL;}if ((p_rsa = PEM_read_RSA_PUBKEY(file, NULL, NULL, NULL)) == NULL) {ERR_print_errors_fp(stdout);return NULL;}rsa_len = RSA_size(p_rsa);p_en = ( CHAR *)malloc(rsa_len +1);string s = str;memset(p_en, 0, rsa_len +1);string ss = _UnicodeToUtf8(str);string strRet = "";int nlen = ss.length();int pdBlock = rsa_len -11;/*因為我采用是RSA_PKCS1_PADDING 加密明文的長度 = 公鑰加密的明文 - 11*/int nCount = (nlen / pdBlock) + 1;//分段次數unsigned char* pClearData = (unsigned char*)ss.c_str();char * sun = new char[nCount*rsa_len];memset(sun,0,nCount*rsa_len+1);for (int i = 0; i < nCount; i++){int nSize = 0;pdBlock = (nlen > pdBlock) ? pdBlock : nlen;nSize = RSA_public_encrypt(pdBlock, (const unsigned char*)pClearData, (unsigned char*)p_en, p_rsa,RSA_PKCS1_PADDING);pClearData += pdBlock;nlen -= pdBlock;if (nSize >= 0){strRet += std::string(p_en, nSize);//strRet += ::;當加密的長度超過最大加密明文的長度,需采用分段加密,分段加密的之后有的平臺會用分隔符區分開需要注意下}memcpy(sun+i*128,p_en,nSize);memset(p_en, 0,nSize);}CString str3 = (const char *)sun;CHAR* decode = base64Encode(strRet.data(),strRet.size() ,false);frsa=fopen("ps_rsa","wb");fwrite((void *)decode,1,strlen((const char *)decode),frsa);printf("rsa_len:%d\n",rsa_len);fclose(frsa);RSA_free(p_rsa);fclose(file);return p_en; }

RSA算法的具體描述如下:?[5]?

(1)任意選取兩個不同的大素數p和q計算乘積

?[5]??;

(2)任意選取一個大整數e,滿足

?,整數e用做加密鑰(注意:e的選取是很容易的,例如,所有大于p和q的素數都可用)?[5]??;

(3)確定的解密鑰d,滿足

?,即

?是一個任意的整數;所以,若知道e和

,則很容易計算出d?[5]??;

(4)公開整數n和e,秘密保存d?[5]??;

(5)將明文m(m<n是一個整數)加密成密文c,加密算法為?[5]?

(6)將密文c解密為明文m,解密算法為?[5]?

然而只根據n和e(注意:不是p和q)要計算出d是不可能的。因此,任何人都可對明文進行加密,但只有授權用戶(知道d)才可對密文解密?[5]??。

總結

以上是生活随笔為你收集整理的VC++ Opensll RSA分段加密的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。