您的位置:首页 > 其它

跨平台的加密算法XXTEA的封装

2013-09-18 12:42 239 查看
原文:/article/5174231.html

XXTEA算法的结构非常简单,只需要执行加法、异或和寄存的硬件即可,且软件实现的代码非常短小,具有可移植性。

维基百科地址:http://en.wikipedia.org/wiki/XXTEA

XXTEA可对连续内存数据进行方便快速的加密解密,且比较安全,但其使用不是很方便,因此有了此次封装。

封装好的接口如下:

//
//  XXTEA.h
//
//  Created by Yuming on 12-7-24.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

/*
* 此类是对XXTEA官方算法进行的封装,XXTEA信息详见http://en.wikipedia.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.wikipedia.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;


示例结果:



Demo下载:http://files.cnblogs.com/pure/testXXTEA.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: