跨平台的加密算法XXTEA的封装
XXTEA算法的结构非常简单,只需要执行加法、异或和寄存的硬件即可,且软件实现的代码非常短小,具有可移植性。易做图地址:http://en.易做图.org/wiki/XXTEA
XXTEA可对连续内存数据进行方便快速的加密解密,且比较安全,但其使用不是很方便,因此有了此次封装。
封装好的接口如下:
//
// XXTEA.h
//
// Created by Yuming on 12-7-24.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
/*
* 此类是对XXTEA官方算法进行的封装,XXTEA信息详见http://en.易做图.org/wiki/XXTEA
*/
#ifndef XXTEA_h
#define XXTEA_h
#include "stdlib.h"
#include "stdio.h"
#include <string.h>
#ifndef XXTEA_TYPE
#define XXTEA_TYPE int // 一种32位长的数据类型,因int在32bit和64bit系统中都是32位的,故直接用int
#endif
class XXTEA {
public:
XXTEA();
~XXTEA();
public:
/**
* @brief 获得输出缓冲区的长度
*
* @param nLength 输入缓冲区长度
* @param isEncode TRUE 即为加密,FALSE即为解密
*
* @return 返回所需长度
*/
static size_t XXTEAGetBufferLength(size_t nLength, bool isEncode);
/**
* @brief 对数据流进行加密
*
* @param lpDstBuffer 目标缓冲区
* @param lpSrcBuffer 源缓冲区
* @param nLength 源缓冲区长度
* @param lpKey 密钥
*
* @return 加密是否成功
*/
static bool XXTEAEncode(char* lpDstBuffer, const char* lpSrcBuffer, size_t nLength, const XXTEA_TYPE* lpKey);
/**
* @brief 对数据流进行解密
*
* @param lpDstBuffer 目标缓冲区
* @param lpSrcBuffer 源缓冲区
* @param nLength 源缓冲区长度
* @param lpKey 密钥
*
* @return 解密是否成功
*/
static bool XXTEADecode(char* lpDstBuffer, const char* lpSrcBuffer, size_t nLength, const XXTEA_TYPE* lpKey);
private:
/**
* @brief XXTEA官方算法,此类即是对其进行封装,详见http://en.易做图.org/wiki/XXTEA
*
* @param v 加解密数据流
* @param n 加解密长度,n > 1为加密,n < -1为解密
* @param k 密钥 注意:形式参数k需和MX中的k对应
*
* @return 返回0表示加解密成功,返回1表示失败
*/
static long btea(XXTEA_TYPE* v, long n, const XXTEA_TYPE* k);
/**
* @brief 正常字符串以16进制保存
*
* @param surBuffer 源缓冲区
* @param length 源缓冲区长度
* @param dstBuffer 目标缓冲区
*/
static void StringToHex(const char* surBuffer, int length, char* dstBuffer);
/**
* @brief 16进制字符串解析成正常字符串
*
* @param surBuffer 源缓冲区
* @param dstBuffer 目标缓冲区
*
* @return 目标缓冲区的长度
*/
static int HexToString(const char* surBuffer, char* dstBuffer);
};
#endif
加密解密示例代码:
char srcBuffer[] = "hello world! 你好!";
size_t length = XXTEA::XXTEAGetBufferLength(strlen(srcBuffer) + 1, true);
char* encodeBuffer = new char[length];
XXTEA_TYPE key[4] = {0x12345678, 0x734a67fc, 0x3367a642, 0x78432562};
XXTEA::XXTEAEncode(encodeBuffer, srcBuffer, strlen(srcBuffer) +1, key);
printf("encodeBuffer: %s\r\n", encodeBuffer);
char* decodeBuffer = new char[XXTEA::XXTEAGetBufferLength(length, false)];
XXTEA::XXTEADecode(decodeBuffer, encodeBuffer, length, key);
printf("decodeBuffer: %s\r\n", decodeBuffer);
delete encodeBuffer;
delete decodeBuffer;
示例结果:
/2012/1128/20121128124746534.zip
/2012/1128/20121128124746534.zip
补充:综合编程 , 安全编程 ,