您好,登錄后才能下訂單哦!
1)數據格式
明文按64位分組,密鑰要求是64位長度
2)明文填充方式
DES加密算法中要求明文長度必須是8個字節對齊。如果對于任意一段數據,加密前需要對最后一塊
填充到8個字節,解密后需要刪除填充的數據
填充有三種模式有
ZeroPadding,數據長度不對齊,填充0,對于明文以/0結束,可以區分出來
PKCS7Padding,假設數據長度需要填充n(n>0)個字節對齊,那么填充n個字節,每個字節都是n;如果數據本身已經對齊,則
填充一塊長度為塊大小的數據,每個字節都是塊大小。
PKCS5Padding, PKCS7Padding的子集,塊大小固定為8個字節
提供一段PKCS5Padding填充代碼
?ch = 8 - nlen % 8;
?memset(src + nlen, ch, ch);//padding5填充
說明nlen是明文長度,src + nlen是明文最后的指針, nlen%8有多少個字節沒有對齊,然后8 - nlen%8補充這么多的字節數
3)向量
在CBC(不光是DES算法)模式下,iv通過隨機數(或偽隨機)機制產生是一種比較常見的方法。iv的作用主要是用于產生密文的第一個block,以使最終生成的密文產生差異(明文相同的情況下),使密碼***變得更為困難,除此之外iv并無其它用途。最大的好處是,即使相同的明文,相同的密鑰,也能產生不同的密文。
4)一般情況下,通過DES加密之后,發送出去都需要進行十六進制編碼,有的還需要進行Base64編碼,這一點要切記!
調用OpenSSL加密的算法
在這里明文的長度限制為4096,主要是里面保存對齊后明文的數據長度是硬編碼導致的
bool EncryptDataByDESOfIV(std::string& key, std::string& iv, char* input_data, unsigned char* encrypt_data, int *data_len)
{
?if (key.size() != 8)?return false;
?DES_key_schedule ks;
?DES_cblock ivec = { 0 };
?int i = 0;
?int len = 0;
?int nlen = 0;
?char *data = (char *)input_data;? /* 原始明文, 十六進制字符串 */
?char *okey = (char *)key.c_str();????????????????? /* 原始密鑰, 十六進制字符串 */
?memcpy(&ivec, iv.c_str(), iv.size());
?unsigned char ch = '\0';
?unsigned char *ptr = NULL;
?unsigned char src[4096] = { 0 };
?unsigned char *dst = nullptr;
?DES_set_key_unchecked((const_DES_cblock*)okey, &ks);
?/* 分析補齊明文所需空間及補齊填充數據 */
?nlen = strlen((char *)data);
?//len = (nlen / 8 + (nlen % 8 ? 1 : 0)) * 8;
?len = nlen + 8 - (nlen % 8);
?dst = (unsigned char *)calloc(1, len);
?memcpy(src, data, len);
?ch = 8 - nlen % 8;
?memset(src + nlen, ch, 8 - nlen % 8);//padding7填充
?//printf("加密之前: ");
?//for (i = 0; i < len; i++) {
?//?printf("%.2X", *(src + i));
?//}
?//printf("\n");
?/* 加密塊鏈式加密 */
?DES_ncbc_encrypt(src, dst, len, &ks, &ivec, DES_ENCRYPT);
?memcpy(encrypt_data, dst, len);
?*data_len = len;
?//printf("加密之后: ");
?//for (i = 0; i < len; i++) {
?//?printf("%.2X", *(dst + i));
?//}
?//printf("\n");
?free(dst);
?return true;
}
提供一種在線解密工具,驗證加密是否正確: http://tool.chacuo.net/cryptdes
?
引用
https://www.cnblogs.com/chenggang816/p/10542673.html
https://www.cnblogs.com/azbane/p/10179660.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。