美文网首页
c语言实现qp的编码和解码

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

作者: rain99_0550 | 来源:发表于2019-04-19 16:46 被阅读0次

    最近研究邮件透明加密技术,用到了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 邮件安全 透明加密

    相关文章

      网友评论

          本文标题:c语言实现qp的编码和解码

          本文链接:https://www.haomeiwen.com/subject/tdlcgqtx.html