c语言实现qp的编码和解码

2019-04-19  本文已影响0人  rain99_0550

最近研究邮件透明加密技术,用到了qp编码,但是c库中有没有代码。于是按照rfc,使用c语言编写qp的编解码。这里关于邮件透明加密技术,推荐天御云安的隐密邮,部署简单,不影响用户使用习惯,非常好的一款产品。网址: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) // 软回车,跳过

        {

            srcStr.data += 3;

            srcStr.len += 3;

        }

        else

        {

            if (*(srcStr.data) == '=') // 是编码字节

            {

                sscanf((const char *)(srcStr.data),"=hhX",destStr.data);

                destStr.data++;

                srcStr.data += 3;

                srcStr.len += 3;

            }

            else // 非编码字节   

            {

                *(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; // 输出的行长度计数

    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个字节

        if (nLineLen  >= nMaxLineLen - 3)

        {

            sprintf((char *)destStr.data,"=\r\n");

            destStr.data += 3;

            nDstLen += 3;

            nLineLen = 0;

        }

    }

    dest->len = nDstLen;

    return ;

}

关键字:qp  qouted-printable 邮件安全 透明加密

上一篇下一篇

猜你喜欢

热点阅读