当前位置:编程学习 > 网站相关 >>

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

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;
 
示例结果:

\


/2012/1128/20121128124746534.zip

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,