男人心计 发表于 2011-5-8 02:05:01

VS2010下Unicode的Base64加密解密程序

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

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


Code.cpp
#include "stdafx.h"
#include "Code.h"

int CStringEncodeBase64(const CString &szInput, CString &szOutput)
{
    int nRet = 0;
    int nLeng = 0;
    nLeng    = (szInput.GetLength() + 1)*sizeof(TCHAR);
    char *pInput = new char;
    ZeroMemory(pInput, nLeng);
    char *pOutput = new char;   
    ZeroMemory(pOutput, nLeng);
    //USES_CONVERSION;
    strcpy_s(pInput, nLeng, CT2A(szInput));
    nRet = base64_encode((void *)pInput, strlen(pInput), &pOutput);
    szOutput = CA2T(pOutput);
    delete []pInput;
    delete []pOutput;
    return nRet;
}

int CStringDecodeBase64(const CString &szInput, CString &szOutput)
{
    int nRet = 0;
    int nLeng = 0;
    nLeng    = (szInput.GetLength() + 1)*sizeof(TCHAR);
    char *pInput = new char;
    ZeroMemory(pInput, nLeng);
    char *pOutput = new char;   
    ZeroMemory(pOutput, nLeng);
    //USES_CONVERSION;
    strcpy_s(pInput, nLeng, CT2A(szInput));
    nRet = base64_decode(pInput, pOutput);
    szOutput = CA2T(pOutput);
    delete [] pInput;
    delete [] pOutput;
    return nRet;
}

int base64_encode(const void *data, const int size, char **str)
{
    char *s, *p;
    int i;
    int c;
    const unsigned char *q;

    p = s = (char *) malloc(size * 4 / 3 + 4);
    if (p == NULL)
    {
      return -1;
    }
    q = (const unsigned char *) data;
    i = 0;
    for (i = 0; i < size;)
    {
      c = q;
      c *= 256;
      if (i < size)
      {
            c += q;
      }
      i++;
      c *= 256;
      if (i < size)
      {
            c += q;
      }
      i++;
      p = base64_chars[(c & 0x00fc0000) >> 18];
      p = base64_chars[(c & 0x0003f000) >> 12];
      p = base64_chars[(c & 0x00000fc0) >> 6];
      p = base64_chars[(c & 0x0000003f) >> 0];
      if (i > size)
      {
            p = '=';
      }
      if (i > size + 1)
      {
            p = '=';
      }
      p += 4;
    }

    *p = 0;
    *str = s;
    return strlen(s);
}


static int pos(const char c)
{
    char *p;
    for (p = base64_chars; *p; p++)
    {
      if (*p == c)
      {
            return p - base64_chars;
      }
    }
    return -1;
}

static unsigned int token_decode(const char *token)
{
    int i;
    unsigned int val = 0;
    int marker = 0;
    if (strlen(token) < 4)
    {
      return DECODE_ERROR;
    }
    for (i = 0; i < 4; i++)
    {
      val *= 64;
      if (token == '=')
      {
            marker++;
      }
      else
      {
            if (marker > 0)
            {
                return DECODE_ERROR;
            }
            else
            {
                val += pos(token);
            }
      }            
    }
    if (marker > 2)
    {
      return DECODE_ERROR;
    }
    return (marker << 24) | val;
}

int base64_decode(const char *str, char *data)
{
    const char *p;
    unsigned char *q;

    q = (unsigned char *)data;
    for (p = str; *p && (*p == '=' || strchr(base64_chars, *p)); p += 4)
    {
      unsigned int val = token_decode(p);
      unsigned int marker = (val >> 24) & 0xff;
      if (val == DECODE_ERROR)
      {
            return -1;
      }
      *q++ = (val >> 16) & 0xff;
      if (marker < 2)
      {
            *q++ = (val >>& 0xff;
      }
      if (marker < 1)
      {
            *q++ = val & 0xff;
      }
    }
    return q - (unsigned char *) data;
}






Code.h
#pragma once
#define DECODE_ERROR 0xffffffff
static char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

int CStringEncodeBase64(const CString &szInput, CString &szOutput);
int CStringDecodeBase64(const CString &szInput, CString &szOutput);

int base64_encode(const void *data, const int size, char **str);
static int pos(const char c);
static unsigned int token_decode(const char *token);
int base64_decode(const char *str, char *data);



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

zzhgb 发表于 2011-11-3 11:43:28

ms CAPICOM好像就是unicode的加密方式

upring 发表于 2015-6-8 10:25:34

很好很好 感谢您的分享
页: [1]
查看完整版本: VS2010下Unicode的Base64加密解密程序