博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

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

Posted on 2012-11-24 23:49  扬名  阅读(12122)  评论(1编辑  收藏  举报

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下载:https://files.cnblogs.com/pure/testXXTEA.zip