织梦CMS - 轻松建站从此开始!

罗索

VS2010下Unicode的Base64加密解密程序

jackyhwei 发布于 2010-09-22 17:54 点击:次 
很早就弄好的一份代码,发上来之前,又修改了几处(Analysis 的警告)。实际上也就是字符转换,然后使用了别人原有的Base64加解密程序。
TAG:

很早就弄好的一份代码,发上来之前,又修改了几处(Analysis 的警告)。实际上也就是字符转换,然后使用了别人原有的Base64加解密程序。界面如下:

image

加解密代码放在code.cpp和code.h中,如果想用在其他地方,只要包含这个两个文件就行了。


Code.h

 

  1. #pragma once 
  2. #define DECODE_ERROR 0xffffffff 
  3. static char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ
  4. abcdefghijklmnopqrstuvwxyz0123456789+/"
  5.   
  6. int CStringEncodeBase64(const CString &szInput, CString &szOutput); 
  7. int CStringDecodeBase64(const CString &szInput, CString &szOutput); 
  8.   
  9. int base64_encode(const void *data, const int size, char **str); 
  10. static int pos(const char c); 
  11. static unsigned int token_decode(const char *token); 
  12. int base64_decode(const char *str, char *data); 

Code.cpp

  1. #include "stdafx.h" 
  2. #include "Code.h" 
  3.   
  4. int CStringEncodeBase64(const CString &szInput, CString &szOutput) 
  5.     int nRet = 0; 
  6.     int nLeng = 0; 
  7.     nLeng    = (szInput.GetLength() + 1)*sizeof(TCHAR); 
  8.     char *pInput = new char[nLeng]; 
  9.     ZeroMemory(pInput, nLeng); 
  10.     char *pOutput = new char[nLeng];     
  11.     ZeroMemory(pOutput, nLeng); 
  12.     //USES_CONVERSION; 
  13.     strcpy_s(pInput, nLeng, CT2A(szInput)); 
  14.     nRet = base64_encode((void *)pInput, strlen(pInput), &pOutput); 
  15.     szOutput = CA2T(pOutput); 
  16.     delete []pInput; 
  17.     delete []pOutput; 
  18.     return nRet; 
  19.   
  20. int CStringDecodeBase64(const CString &szInput, CString &szOutput) 
  21.     int nRet = 0; 
  22.     int nLeng = 0; 
  23.     nLeng    = (szInput.GetLength() + 1)*sizeof(TCHAR); 
  24.     char *pInput = new char[nLeng]; 
  25.     ZeroMemory(pInput, nLeng); 
  26.     char *pOutput = new char[nLeng];     
  27.     ZeroMemory(pOutput, nLeng); 
  28.     //USES_CONVERSION; 
  29.     strcpy_s(pInput, nLeng, CT2A(szInput)); 
  30.     nRet = base64_decode(pInput, pOutput); 
  31.     szOutput = CA2T(pOutput); 
  32.     delete [] pInput; 
  33.     delete [] pOutput; 
  34.     return nRet; 
  35.   
  36. int base64_encode(const void *data, const int size, char **str) 
  37.     char *s, *p; 
  38.     int i; 
  39.     int c; 
  40.     const unsigned char *q; 
  41.   
  42.     p = s = (char *) malloc(size * 4 / 3 + 4); 
  43.     if (p == NULL) 
  44.     { 
  45.         return -1; 
  46.     } 
  47.     q = (const unsigned char *) data; 
  48.     i = 0; 
  49.     for (i = 0; i < size;) 
  50.     { 
  51.         c = q[i++]; 
  52.         c *= 256; 
  53.         if (i < size) 
  54.         { 
  55.             c += q[i]; 
  56.         } 
  57.         i++; 
  58.         c *= 256; 
  59.         if (i < size) 
  60.         { 
  61.             c += q[i]; 
  62.         } 
  63.         i++; 
  64.         p[0] = base64_chars[(c & 0x00fc0000) >> 18]; 
  65.         p[1] = base64_chars[(c & 0x0003f000) >> 12]; 
  66.         p[2] = base64_chars[(c & 0x00000fc0) >> 6]; 
  67.         p[3] = base64_chars[(c & 0x0000003f) >> 0]; 
  68.         if (i > size) 
  69.         { 
  70.             p[3] = '='
  71.         } 
  72.         if (i > size + 1) 
  73.         { 
  74.             p[2] = '='
  75.         } 
  76.         p += 4; 
  77.     } 
  78.   
  79.     *p = 0; 
  80.     *str = s; 
  81.     return strlen(s); 
  82.   
  83.   
  84. static int pos(const char c) 
  85.     char *p; 
  86.     for (p = base64_chars; *p; p++) 
  87.     { 
  88.         if (*p == c) 
  89.         { 
  90.             return p – base64_chars; 
  91.         } 
  92.     } 
  93.     return -1; 
  94.   
  95. static unsigned int token_decode(const char *token) 
  96.     int i; 
  97.     unsigned int val = 0; 
  98.     int marker = 0; 
  99.     if (strlen(token) < 4) 
  100.     { 
  101.         return DECODE_ERROR; 
  102.     } 
  103.     for (i = 0; i < 4; i++) 
  104.     { 
  105.         val *= 64; 
  106.         if (token[i] == '='
  107.         { 
  108.             marker++; 
  109.         } 
  110.         else 
  111.         { 
  112.             if (marker > 0) 
  113.             { 
  114.                 return DECODE_ERROR; 
  115.             } 
  116.             else 
  117.             { 
  118.                 val += pos(token[i]); 
  119.             } 
  120.         }             
  121.     } 
  122.     if (marker > 2) 
  123.     { 
  124.         return DECODE_ERROR; 
  125.     } 
  126.     return (marker << 24) | val; 
  127.   
  128. int base64_decode(const char *str, char *data) 
  129.     const char *p; 
  130.     unsigned char *q; 
  131.   
  132.     q = (unsigned char *)data; 
  133.     for (p = str; *p && (*p == '=' || strchr(base64_chars, *p)); p += 4) 
  134.     { 
  135.         unsigned int val = token_decode(p); 
  136.         unsigned int marker = (val >> 24) & 0xff; 
  137.         if (val == DECODE_ERROR) 
  138.         { 
  139.             return -1; 
  140.         } 
  141.         *q++ = (val >> 16) & 0xff; 
  142.         if (marker < 2) 
  143.         { 
  144.             *q++ = (val >> 8) & 0xff; 
  145.         } 
  146.         if (marker < 1) 
  147.         { 
  148.             *q++ = val & 0xff; 
  149.         } 
  150.     } 
  151.     return q – (unsigned char *) data; 

代码是在VS2010中开启 Code Analysis 下无警告编译通过的。
 

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201009/10196.html]
本文出处:网络 作者:秩名
顶一下
(3)
60%
踩一下
(2)
40%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容