本文不討論rsa加密解密本身,只記錄使用方法及遇到的坑,rsa原理及注意事項可在網上查詢。
背景:公司的乙個需求,要求對接客戶的乙個平台,通訊方式為mqtt,資料報含token及json內容,在通訊過程中傳送的mqtt資訊必須帶上token,這個token是要從客戶平台獲取,通過http協議,post方法。
然後post方法的body資訊需要進行rsa加密(提供了公鑰和私鑰,公鑰加密私鑰解密),然後再base64加密。base64公司**裡已經有了,但rsa加密卻沒有,只能自己網上搜尋。在使用rsa加密過程中遇到了以下幾個問題:
1,用rsa加密時,如果密文長度是1024位(128位元組)的話,其要加密的明文只能是117位元組長度。我的post方法資料不止117位元組,無法滿足我目前的需求。
2,base64編碼問題
3,公鑰及私鑰是客戶提供的,但不是標準格式。
關於問題1、問題2:
找了很多網上的例子,實現的都是簡單的幾個字元的加密及解密,那些長串字元加密的直接拿過來又無法通過編譯。最後找到一些拿過來修修改改,終於可以用,記錄如下:
/**
** @brief 用公鑰進行加密,明文長於117位元組時需要進行分段處理
*/std::string crsaencrypt::rsapublickeyencryptsplit(const std::string &cleartext)
if(cleartext.length() % split_len != 0)
printf("before base64 len: %lu\n", result.length());
std::string encode_str = base64encode((uint8_t*)result.c_str(), result.length());
printf("after base64 len: %lu\n", encode_str.length());
return encode_str;
}
網上有些說,分段rsa加密後即進行base64編碼,但我這裡是rsa加密完成後再整體進行base64編碼,在進行rsa解碼時先base64解碼。
/**
** @brief 用私鑰進行解密,分段處理
*/std::string crsaencrypt::rsaprivatekeydecryptsplit(const std::string &text)
if(cleartext.length() % 128 != 0)
return result;
}
使用例子:
int main()
關於第3個問題,公鑰和私鑰有固定格式,要注意,因客戶只提供兩個字串,裡面並沒有包含固定的頭和尾字元,這樣可能會導致rsa 讀取金鑰時出錯。正確格式如下:
不同的頭尾標識,呼叫的openssl的庫函式可能不同,可自行baidu。
git clone [email protected]:tianyexing2008/c_cpp.git
及json庫目錄即可。
RSA加密和解密使用經歷說明
rsa加密和解密使用經歷說明 rsa金鑰資訊生成工具類 public class rsaencrypt2048 catch nosuchalgorithmexception e 初始化金鑰對生成器,金鑰大小為96 1024位 keypairgen.initialize init key size,n...
加密解密 使用對稱密碼加密檔案
造冰箱的大熊貓 cnblogs 2019 5 24 1 加密 gpg c file to be encrypted 其中,file to be encrypted 是待加密檔案。gpg只能加密檔案,不能加密資料夾。要對資料夾進行加密,需先將資料夾進行打包。加密後的檔案為 file to be enc...
RSA加密解密的使用!
根據公司的要求需要對一些資料保密,所以與公司做後台的開發人員進行對接測試,特此記錄 在進行加密解密之前我也是網上進行了大量的資料查閱,感覺比較詳細的在此列出,以做參考 由於我這裡與該方法實現有所出入,所以自己另外寫了個方法 我這邊的需求是這樣的 服務端建立公鑰 客戶端 用服務端提供的公鑰對使用者名稱...