跨平台的加密算法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. UML 中的用例图解析以及starUML详细介绍

    UML中的用例(Use Case)概念分析及StarUML实例 在UML 中use case 似 乎最簡單的,用例建模的最主要功能就是用来表达系统的功能性需求或行为,依我的理解用例建模可分为用例图和用 ...

  2. 代码实现Autolayout

    代码实现Autolayout的步骤 利用NSLayoutConstraint类创建具体的约束对象 添加约束对象到相应的view上 - (void)addConstraint:(NSLayoutCons ...

  3. Vim实用命令

    [n]yy:从当前行复制n行 [n]p:粘贴n次 [n]dd:删除当前行往下的n行 /  : 向后查找 ?:向前查找 u → undo 撤销上一操作 <C-r> → redo 0 → 开启 ...

  4. 百度翻译API

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...

  5. 基于AutoCAD的空间数据共享平台雏形

    好久没有更新博客了,今天先透露一个新的产品——AutoMap.我自己对于这个产品的定位是“基于AutoCAD的空间数据共享平台”.用一句话来概括AutoMap的功能:为用户提供一个在AutoCAD下访 ...

  6. WPS for ubuntu14

    QGtkStyle could not resolve GTK. Make sure you have installed the proper libraries. sudo apt-get ins ...

  7. URAL 1920 Titan Ruins: the Infinite Power of Magic

    大意: 有一张N*N的网格,你每次可以走一步,每格只能走一次,有没有一种方法让走了L步后回到一个距原点1步远的格子?  没有输出Unsuitable device,否则输出Overwhelming p ...

  8. openstack与VMware workStation的区别

    免责声明:     本文中使用的部分图片来自于网络,如有侵权,请联系博主进行删除 最近一直在研究云计算,恰好有个同事问了我一个问题:你们研究的openstack到底是什么东西?跟VMware Work ...

  9. [bzoj 3687]简单题 bitset的运用

    题意 给定一个正整数集,求所有子集算术和的异或和   题解 每次加入一个元素x,用原集合a xor (a<< x) 然后每一个值统计一下 bitset看起来很优越,是一个能位运算的布尔数组 ...

  10. 简单shell脚本

      简单shell脚本备忘   #!/bin/sh num= ] do table_num=`printf %03d ${num}` echo album_info_${table_num} #mys ...