想学下SMTP 然后自己写个简单的邮件客户端,简单看了下SMTP的相关知识,感觉不是很难。但是不会base64加密算法,自己对加密知识是零基础。
对与这种“零基础”,如何学习?有什么好的资料和书本推荐下吗?谢谢了

解决方案 »

  1.   

    base64 可以使用搜索引擎查找 RFC 文档
      

  2.   

    http://download.csdn.net/source/2853248
      

  3.   

    base64编码很简单的啊const char EnBase64Tab[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
     
    int EncodeBase64(const unsigned char* pSrc, char* pDst, int nSrcLen)
    {
        unsigned char c1, c2, c3;    // 输入缓冲区读出3个字节
        int nDstLen = 0;             // 输出的字符计数
        int nDiv = nSrcLen / 3;      // 输入数据长度除以3得到的倍数
        int nMod = nSrcLen % 3;      // 输入数据长度除以3得到的余数
     
        // 每次取3个字节,编码成4个字符
        for (int i = 0; i < nDiv; i ++)
        {
            // 取3个字节
            c1 = *pSrc++;
            c2 = *pSrc++;
            c3 = *pSrc++;
     
            // 编码成4个字符
            *pDst++ = EnBase64Tab[c1 >> 2];
            *pDst++ = EnBase64Tab[((c1 << 4) | (c2 >> 4)) & 0x3f];
            *pDst++ = EnBase64Tab[((c2 << 2) | (c3 >> 6)) & 0x3f];
            *pDst++ = EnBase64Tab[c3 & 0x3f];
            nDstLen += 4;
         }
     
        // 编码余下的字节
        if (nMod == 1)
        {
            c1 = *pSrc++;
            *pDst++ = EnBase64Tab[(c1 & 0xfc) >> 2];
            *pDst++ = EnBase64Tab[((c1 & 0x03) << 4)];
            *pDst++ = '=';
            *pDst++ = '=';
            nDstLen += 4;
        }
        else if (nMod == 2)
        {
            c1 = *pSrc++;
            c2 = *pSrc++;
            *pDst++ = EnBase64Tab[(c1 & 0xfc) >> 2];
            *pDst++ = EnBase64Tab[((c1 & 0x03) << 4) | ((c2 & 0xf0) >> 4)];
            *pDst++ = EnBase64Tab[((c2 & 0x0f) << 2)];
            *pDst++ = '=';
            nDstLen += 4;
        }
     
        // 输出加个结束符
        *pDst = '\0';
     
        return nDstLen;
    }
    const char DeBase64Tab[] =
    {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x17
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x18-0x2a
        62,        // '+' 0x2B
        0, 0, 0, //0x2c-2e
        63,        // '/'
        52, 53, 54, 55, 56, 57, 58, 59, 60, 61,        // '0'-'9' 0x30-39
        0, 0, 0, 0, 0, 0, 0, //0x3A-40
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, //0x41-4D
        13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,        // 'A'-'Z' 0x4E-5A
        0, 0, 0, 0, 0, 0, //0x5B-60
        26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, //0x61-
        39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,        // 'a'-'z'
    };
     
    int DecodeBase64(const char* pSrc, unsigned char* pDst, int nSrcLen)
    {
        unsigned char c1, c2, c3, c4;    // 输入缓冲区读出4个字节
    unsigned char lc1, lc2;
        int nDstLen = 0;             // 输出的字符计数
        int nDiv = nSrcLen / 4;      // 输入数据长度除以4得到的倍数
     
        // 每次取4个字节,解码成3个字符
        for (int i = 0; i < nDiv; i ++)
        {
            // 取4个字节
            c1 = DeBase64Tab[*pSrc++];
            c2 = DeBase64Tab[*pSrc++];
    lc1 = *pSrc;
            c3 = DeBase64Tab[*pSrc++];
    lc2 = *pSrc;
    c4 = DeBase64Tab[*pSrc++];
     
    if (lc2 == '=')
    {
    if (lc1 == '=') 
    { //原文中除3后余数是1
    c3 = 0;
    c4 = 0;
    *pDst++ = (c1 << 2) | (c2 >> 4);
    nDstLen += 1;
    }
    else
    { //原文中除3后余数是2
    c4 = 0;
    *pDst++ = (c1 << 2) | (c2 >> 4);
    *pDst++ = (c2 << 4) | (c3 >> 2);
    nDstLen += 2;
    }
    break;
    }        // 解码成3个字符
    *pDst++ = (c1 << 2) | (c2 >> 4);
    *pDst++ = (c2 << 4) | (c3 >> 2);
    *pDst++ = (c3 << 6) | c4;        nDstLen += 3;
         }
     
        // 输出加个结束符
        *pDst = '\0';
     
        return nDstLen;
    }