找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7325|回复: 2

[开源] VS2010下Unicode的Base64加密解密程序

  [复制链接]

2

主题

11

回帖

0

精华

铜牌会员

积分
45
发表于 2011-5-8 02:05:01 | 显示全部楼层 |阅读模式
很早就弄好的一份代码,发上来之前,又修改了几处(Analysis 的警告)。实际上也就是字符转换,然后使用了别人原有的Base64加解密程序。界面如下:
1.png
加解密代码放在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[nLeng];
    ZeroMemory(pInput, nLeng);
    char *pOutput = new char[nLeng];     
    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[nLeng];
    ZeroMemory(pInput, nLeng);
    char *pOutput = new char[nLeng];     
    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[i++];
        c *= 256;
        if (i < size)
        {
            c += q;
        }
        i++;
        c *= 256;
        if (i < size)
        {
            c += q;
        }
        i++;
        p[0] = base64_chars[(c & 0x00fc0000) >> 18];
        p[1] = base64_chars[(c & 0x0003f000) >> 12];
        p[2] = base64_chars[(c & 0x00000fc0) >> 6];
        p[3] = base64_chars[(c & 0x0000003f) >> 0];
        if (i > size)
        {
            p[3] = '=';
        }
        if (i > size + 1)
        {
            p[2] = '=';
        }
        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 下无警告编译通过的。

1

主题

26

回帖

0

精华

银牌会员

积分
329
发表于 2011-11-3 11:43:28 | 显示全部楼层
ms CAPICOM好像就是unicode的加密方式

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-6-8 10:25:34 | 显示全部楼层
很好很好 感谢您的分享
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表