zoukankan      html  css  js  c++  java
  • 跨平台的加密算法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
    ", encodeBuffer);
        char* decodeBuffer =  new char[XXTEA::XXTEAGetBufferLength(length, false)];
        XXTEA::XXTEADecode(decodeBuffer, encodeBuffer, length, key);
        printf("decodeBuffer: %s
    ", decodeBuffer);
        delete encodeBuffer;
        delete decodeBuffer;
    复制代码

    示例结果:

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

  • 相关阅读:
    MYSQL判断某个表是否已经存在
    百度、雅虎、谷歌搜索引擎接口调用注意事项
    Codeigniter整合Tank Auth权限类库的教程
    短链接的生成算法
    自定义String
    运算符和结合性
    字符串类封装
    运算符重载
    数组类封装
    友元
  • 原文地址:https://www.cnblogs.com/LiLihongqiang/p/5844116.html
Copyright © 2011-2022 走看看