VC++ Opensll RSA分段加密
生活随笔
收集整理的這篇文章主要介紹了
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分段加密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android telephony概述
- 下一篇: SWF播放