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

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

  1. 跨平台的游戏客户端Socket封装,调整

    原文链接:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019359.html 头文件: #pragma once #ifdef WIN32 ...

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

    1.一个不错的可逆加密算法XXTEA 之前无意中看到了TexturePacker 使用了XXTEA来加密图片资源.所以花了点时间来看了下XXTEA. 一般有两种加密算法:1.像md5,SHA1,等ha ...

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

    { 单元名:跨平台的TCP客户端库封装 作者:5bug 网站:http://www.5bug.wang } unit uCPTcpClient; interface uses System.Class ...

  4. AES加密算法C++实现

    我从网上下载了一套AES加密算法的C++实现,代码如下: (1)aes.h #ifndef SRC_UTILS_AES_H #define SRC_UTILS_AES_H class AES { pu ...

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

    C/C++的跨平台特性相比于Java更加原生(Java是一次编译到处运行,而C/C ++则需要拿着源码重新编译一遍),实现一个C/C++跨平台程序一般有几点做法: 1.使用Qt 2.使用ANSI C/ ...

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

    跨平台,是HTML5最重要的能力之一.而Hybrid H5因强依赖于具体App,往往不具有跨平台性.这时,将强依赖关系解耦,即可恢复HTML5的跨平台能力.近期我负责手Q红包打赏项目的前端开发,因项目 ...

  7. 写给开发人员的实用密码学(七)—— 非对称密钥加密算法 RSA/ECC

    本文部分内容翻译自 Practical-Cryptography-for-Developers-Book,笔者补充了密码学历史以及 openssl 命令示例,并重写了 RSA/ECC 算法原理.代码示 ...

  8. ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存

    ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 part 1:给我点时间,允许我感慨一下2016年 正好有时间,总结一下最近使用的一些技术,也算是为2016年画上一个完 ...

  9. 【腾讯Bugly干货分享】微信小程序开发思考总结——腾讯“信用卡还款”项目实践

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/58212d0fa7a7574c4f4cc3c5 作者:peggy 小程序概述 1 ...

随机推荐

  1. iOS学习之Object-C语言集合

    一.数组类      1.C语言数组的特点:数组是一个有序的集合,用来存储相同数据类型的元素,通过下标访问数组中的元素,下标从0开始.      2.OC中的数组只能存储对象类型(必须是NSObjec ...

  2. IOS内存管理「4」- ARC 和垃圾回收机制的基本概念

  3. 条款9:不要在构造和析构过程中调用virtual函数

    如下是一个股票交易的例子: class Transaction // 交易的基类 { public: Transaction(); ; // 用于记录交易日志 }; Transaction::Tran ...

  4. FTP上传文件夹

    文件上传类 using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; usi ...

  5. Qt 读取txt文件乱码的解决办法

    Qt 读取txt文本乱码问题 2015-05-20 15:46 方法一:使用QString的fromLocal8Bit()函数 复制代码 QFile txtfile(filePath);        ...

  6. 团队作业php

    <?php$kouwei=$_GET["select"];$daxiao=$_GET["RadioGroup1"];$peiliao=$_GET[&quo ...

  7. iptables的recent模块

    看到文章中用recent模块控制对主机的访问. 配置方法如下: iptables -A INPUT -p icmp --icmp-type 8 -m length --length 78 -j LOG ...

  8. CSS3 绘制360安仔小精灵[原创]

    Css3图形通常由矩形,圆形,椭圆,三角形,梯形等组合而成. 矩形,为display:block的块级元素设定宽高,便能实现, 圆角矩形,椭圆,圆形,则通过border-radius 属性来得到. 圆 ...

  9. vmware workstation 10.0

    2013.9.3 vmware workstation 10.0 build 1295980新增功能– 可以将windows 8.1物理pc转变为虚拟机:unity模式增强,与windows 8.1 ...

  10. 【BZOJ】【2178】圆的面积并

    自适应辛普森积分 Orz Hzwer 辛普森真是个强大的东西……很多东西都能积= = 这题的正解看上去很鬼畜,至少我这种不会计算几何的渣渣是写不出来……(对圆的交点求图包,ans=凸包的面积+一堆弓形 ...