最近研究郵件透明加密技術(shù)绘证,用到了qp編碼隧膏,但是c庫(kù)中有沒(méi)有代碼。于是按照rfc,使用c語(yǔ)言編寫qp的編解碼嚷那。這里關(guān)于郵件透明加密技術(shù)胞枕,推薦天御云安的隱密郵,部署簡(jiǎn)單魏宽,不影響用戶使用習(xí)慣腐泻,非常好的一款產(chǎn)品。網(wǎng)址:https://mail.tyyunan.com/
void DecodeQP(ngx_str_t *dest,ngx_str_t *src)
{?
? ? ngx_str_t srcStr;
? ? ngx_str_t destStr;
? ? srcStr.data = src->data;
? ? srcStr.len = 0;
? ? destStr.data = dest->data;
? ? destStr.len = 0;
? ? while (srcStr.len < src->len)
? ? {
? ? ? ? if (ngx_strncmp(srcStr.data,"=\r\n", 3) == 0) // 軟回車队询,跳過(guò)
? ? ? ? {
? ? ? ? ? ? srcStr.data += 3;
? ? ? ? ? ? srcStr.len += 3;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? if (*(srcStr.data) == '=') // 是編碼字節(jié)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? sscanf((const char *)(srcStr.data),"=hhX",destStr.data);
? ? ? ? ? ? ? ? destStr.data++;
? ? ? ? ? ? ? ? srcStr.data += 3;
? ? ? ? ? ? ? ? srcStr.len += 3;
? ? ? ? ? ? }
? ? ? ? ? ? else // 非編碼字節(jié)? ?
? ? ? ? ? ? {
? ? ? ? ? ? ? ? *(destStr.data)++ = *(srcStr.data)++;
? ? ? ? ? ? ? ? srcStr.len++;
? ? ? ? ? ? }
? ? ? ? ? ? destStr.len++;
? ? ? ? }
? ? }
? ? dest->len = destStr.len;
? ? return;
}
void EncodeQP(ngx_str_t *dest,ngx_str_t *src, ngx_int_t nMaxLineLen)
{
? ? ngx_str_t srcStr;
? ? ngx_str_t destStr;
? ? ngx_int_t nDstLen;
? ? ngx_int_t nLineLen; // 輸出的行長(zhǎng)度計(jì)數(shù)
? ? nDstLen = 0;
? ? nLineLen = 0;
? ? size_t i = 0;
? ? srcStr.data = src->data;
? ? srcStr.len = src->len;
? ? destStr.data = dest->data;
? ? destStr.len = 0;
? ? for(i = 0; i < src->len; i++, srcStr.data++){
? ? ? ? // ASCII 33-60, 62-126原樣輸出派桩,其余的需編碼
? ? ? ? if ((*(srcStr.data) >= '!') && (*(srcStr.data) <= '~') && (*(srcStr.data) != '=')){
? ? ? ? ? ? *destStr.data++ = *srcStr.data;
? ? ? ? ? ? nDstLen++;
? ? ? ? ? ? nLineLen++;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? sprintf((char *)destStr.data, "=hhX", *srcStr.data);
? ? ? ? ? ? destStr.data += 3;
? ? ? ? ? ? nDstLen += 3;
? ? ? ? ? ? nLineLen += 3;
? ? ? ? }
? ? ? ? // 輸出換行,不算\r\n最多每行nMaxLineLen個(gè)字節(jié)
? ? ? ? if (nLineLen? >= nMaxLineLen - 3)
? ? ? ? {
? ? ? ? ? ? sprintf((char *)destStr.data,"=\r\n");
? ? ? ? ? ? destStr.data += 3;
? ? ? ? ? ? nDstLen += 3;
? ? ? ? ? ? nLineLen = 0;
? ? ? ? }
? ? }
? ? dest->len = nDstLen;
? ? return ;
}
關(guān)鍵字:qp? qouted-printable 郵件安全 透明加密