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

跨平台的加密算法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;

示例结果:

Demo下载:http://files.cnblogs.com/pure/testXXTEA.zip

时间: 2024-12-30 03:00:53

跨平台的加密算法XXTEA 的封装的相关文章

XXTEA 加密算法 C++ C#兼容版本

1.一个不错的可逆加密算法XXTEA 之前无意中看到了TexturePacker 使用了XXTEA来加密图片资源.所以花了点时间来看了下XXTEA. 一般有两种加密算法:1.像md5,SHA1,等hash算法,是不可逆的.一般数据库存的用户名和密码就用这个. 2.本文所提到的XXTEA算法,是可逆的,有个key可以加密. 安全方面的东西还蛮多的,说到key,还有什么public key, private key,我都还给老师了.忘光了. 可逆加密算法的需求还是比较广的,像加密游戏存档(发现还是无

XXTEA 加密算法 C++ C#兼容版本号

1.一个不错的可逆加密算法XXTEA 之前无意中看到了TexturePacker 使用了XXTEA来加密图片资源.所以花了点时间来看了下XXTEA. 一般有两种加密算法:1.像md5,SHA1,等hash算法,是不可逆的.一般数据库存的username和password就用这个. 2.本文所提到的XXTEA算法,是可逆的,有个key能够加密. 安全方面的东西还蛮多的,说到key,还有什么public key, private key,我都还给老师了.忘光了. 可逆加密算法的需求还是比較广的,像加

分享一个Delphi跨平台Http库的封装,一个Delphi跨平台TCP库的封装

{ 单元名:跨平台的TCP客户端库封装 作者:5bug 网站:http://www.5bug.wang } unit uCPTcpClient; interface uses System.Classes, System.SysUtils, IdTCPClient, IdGlobal; type TOnRevDataEvent = procedure(const pData: Pointer; const pSize: Cardinal) of object; TCPTcpClient = cl

用C++实现的SDK跨平台心得体会

C/C++的跨平台特性相比于Java更加原生(Java是一次编译到处运行,而C/C ++则需要拿着源码重新编译一遍),实现一个C/C++跨平台程序一般有几点做法: 1.使用Qt 2.使用ANSI C/C++支持的函数 3.条件编译,如 #if defined(__symbian32__) #define xx_platform  xx_platform_symbian #elif defined(__win32__)||(_win32) #define xx_platform  xx_platf

解耦——Hybrid H5跨平台性思考

跨平台,是HTML5最重要的能力之一.而Hybrid H5因强依赖于具体App,往往不具有跨平台性.这时,将强依赖关系解耦,即可恢复HTML5的跨平台能力.近期我负责手Q红包打赏项目的前端开发,因项目涉及到多App跨平台兼容,对Hybrid H5的跨平台性有了一定的感悟和思考.在这里做下总结分享,希望能对大家有所收获. Hybrid H5跨平台性 进入正题之前,先解释下本文主题的两个名词. Hybrid H5,即混合了原生能力的HTML5.区别于纯粹Web端的HTML5,它可调用原生的能力,强依

AppCan移动技术全景图:创新、协作、支撑

开发者是移动互联网宏伟蓝图的最终实现者.如果你有创意.有技术,你可以开发一款服务上亿人的应用.所以,我感觉幸运,没有任何一个时代,能像现在这么好,技术人能够服务这么广大的市场,能够撬动百亿级的市场. 在2016AppCan移动开发者大会上,正益移动CTO赵庆华深情款款的做了以上的开场白,将自己14年的代码路.6年的创业感触一并融汇其中.作为一家技术型企业,赵庆华的每次演讲都是重头戏,而这次他将分享AppCan在整个发展历程中的思路和成果. 以下为演讲精华: 全景图:开发平台+正益工作(生态协同)

Memcached在.net中的应用

一,MemCached下载 服务端下载:http://memcachedproviders.codeplex.com/ 客户端下载:http://sourceforge.net/p/memcacheddotnet/code/HEAD/tarball?path=/trunk 二,服务端的安装及配置 1)        解压缩文件到c:\memcached(也可以选择任意位置) 2)        命令行输入 'c:\memcached\memcached.exe -d install' 3)   

四,memcached的机制

memcached机制: 1,基于c/s架构,协议简单. (1)c/s架构,此时memcached为服务端,我们可以使用如PHP,c/c++等程序连接memcached服务器. (2)memcached的服务器客户端通信并不适用XML等格式,而使用简单的基于文本行的协议.因此,通过telnet也能在memcached上保存数据.取得数据. 2,基于libevent的事件处理 (1)libevent是一套跨平台的事件处理接口的封装,能够兼容包括这操作系统:Windows/Linux/BSD/Sol

libev笔记

libev是一个开源库,实现了一个reactor模式事件驱动任务调度库.代码非常精简,包含所有实现的.c文件只有不到5000行. 支持的事件类型: ev_io ev_timer ev_periodic ev_signal ev_child ev_stat ev_idle ev_prepare  and ev_check ev_embed ev_fork ev_cleanup ev_async 常用的事件类型: ev_io,io就绪事件 ev_timer,定时器事件 ev_signal,信号事件