QT三方库 Openssl Des 算法实现

QT三方库 Openssl Des 算法实现 ,可直接套用接口

DECcpp文件
在这里插入图片描述

//使用前请在pro文件中包含你的openssl三方库,路径为你openssl在电脑中的位置。
//LIBS += -L"G:/OpenSSL-Win32/lib"
//LIBS += -L"G:/OpenSSL-Win32/lib" -llibeay32
//LIBS += -L"G:/OpenSSL-Win32/lib" -lssleay32
//INCLUDEPATH += $$quote(G:/OpenSSL-Win32/include)


#include "DES.h"
#include "HEX.h"

enum Except{ EXCEP_ZERO,EXCEP_ONE};

QDES::QDES()
{

}

//3Des_cbc加密
QString QDES::m3Des_cbc_encrypt(char *clText,char *key1,char *key2,char *key3)
{
    int i = 0;
        int len = 0;
        int nlen = 0;

        char ch = '\0';
//        char *key1 = "4041424344454647";  /* 原始密钥, 十六进制字符串 */
//        char *key2 = "48494A4B4C4D4E4F";  /* 原始密钥, 十六进制字符串 */
//        char *key3 = "4041424344454647";  /* 原始密钥, 十六进制字符串 */
        //	char *data = "01820003000000000000000000000000";  /* 原始明文, 十六进制字符串 */
        char *data = clText;
        unsigned char src[64] = {0};
        unsigned char out[64] = {0};
        //unsigned char tmp[64] = {0};

        unsigned char *ptr  = NULL;
        unsigned char block[8] = {0};
        DES_key_schedule ks1, ks2, ks3;
        DES_cblock ivec;
        DES_cblock ivsetup = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

        /* 设置密码表 */
        ptr = p->hex2bin(key1, strlen(key1), &nlen);
        memcpy(block, ptr, sizeof(block));
        free(ptr);
        DES_set_key_unchecked((const_DES_cblock *)block, &ks1);

        ptr = p->hex2bin(key2, strlen(key2), &nlen);
        memcpy(block, ptr, sizeof(block));
        free(ptr);
        DES_set_key_unchecked((const_DES_cblock *)block, &ks2);

        ptr = p->hex2bin(key3, strlen(key3), &nlen);
        memcpy(block, ptr, sizeof(block));
        free(ptr);
        DES_set_key_unchecked((const_DES_cblock *)block, &ks3);

        ptr = p->hex2bin(data, strlen(data), &nlen);
        memcpy(src, ptr, nlen);
        free(ptr);

        len = (nlen / 8 + (nlen % 8 ? 1: 0)) * 8;

        ch = 8 - nlen % 8;
        memset(src + nlen, ch, (8 - nlen % 8) % 8);


        memcpy(ivec, ivsetup, sizeof(ivsetup));
        /* 按照8字节数据进行加密,length=8 */
        for (i = 0; i < len; i += 8) {
            DES_ede3_cbc_encrypt(src + i, out + i, 8, &ks1, &ks2, &ks3, &ivec, DES_ENCRYPT);
        }


        const char *result[24];
        //const char *mR = new char;
        printf("加密后数据: ");
        for (i = 0; i < len; i++) {
            //		printf("%02X" , *(out + i));
            result[i] = p->bin2hex((out + i),1);
        }
        QString mValue;
        int valLen = strlen((char *)result);
        for (int j=0;j<len;j++)
        {
            QString temp(result[j]);
            mValue += temp;
        }
        printf(clText);
        return mValue;
}

//3Des_cbc加密
QString QDES::m3Des_cbc_nokey_encrypt(char *clText, char *LKey, char *RKey)
{
    int i = 0;
        int len = 0;
        int nlen = 0;


        char ch = '\0';
        char *key1 = LKey;  /* 原始密钥, 十六进制字符串 */
        char *key2 = RKey;  /* 原始密钥, 十六进制字符串 */
        char *key3 = LKey;  /* 原始密钥, 十六进制字符串 */
        //	char *data = "01820003000000000000000000000000";  /* 原始明文, 十六进制字符串 */
        char *data = clText;
        unsigned char src[64] = {0};
        unsigned char out[64] = {0};
        //unsigned char tmp[64] = {0};

        unsigned char *ptr  = NULL;
        unsigned char block[8] = {0};
        DES_key_schedule ks1, ks2, ks3;
        DES_cblock ivec;
        DES_cblock ivsetup = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

        /* 设置密码表 */
        ptr = p->hex2bin(key1, strlen(key1), &nlen);
        memcpy(block, ptr, sizeof(block));
        free(ptr);
        DES_set_key_unchecked((const_DES_cblock *)block, &ks1);

        ptr = p->hex2bin(key2, strlen(key2), &nlen);
        memcpy(block, ptr, sizeof(block));
        free(ptr);
        DES_set_key_unchecked((const_DES_cblock *)block, &ks2);

        ptr = p->hex2bin(key3, strlen(key3), &nlen);
        memcpy(block, ptr, sizeof(block));
        free(ptr);
        DES_set_key_unchecked((const_DES_cblock *)block, &ks3);

        ptr = p->hex2bin(data, strlen(data), &nlen);
        memcpy(src, ptr, nlen);
        free(ptr);

        len = (nlen / 8 + (nlen % 8 ? 1: 0)) * 8;

        ch = 8 - nlen % 8;
        memset(src + nlen, ch, (8 - nlen % 8) % 8);


        memcpy(ivec, ivsetup, sizeof(ivsetup));
        /* 按照8字节数据进行加密,length=8 */
        for (i = 0; i < len; i += 8) {
            DES_ede3_cbc_encrypt(src + i, out + i, 8, &ks1, &ks2, &ks3, &ivec, DES_ENCRYPT);
        }


        const char *result[24];
        //const char *mR = new char[];
        printf("加密后数据: ");
        for (i = 0; i < len; i++) {
            //		printf("%02X" , *(out + i));
            result[i] = p->bin2hex((out + i),1);
        }
        QString mValue;
        //int valLen = strlen((char *)result);
        for (int j=0;j<len;j++)
        {
            QString temp(result[j]);
            mValue += temp;
        }
        printf(clText);
        return mValue;
}

//3Des_ecb加密
QString QDES::m3Des_ecb_encrypt(QString clText, QString key)
{

    QString mValue;
        QT_TRY
        {
            int i = 0;
            int len = 0;
            int nlen = 0;

            char ch = '\0';
            // 	char *key1 = "0000000000000000";  /* 原始密钥, 十六进制字符串 */
            // 	char *key2 = "0000000000000000";  /* 原始密钥, 十六进制字符串 */
            // 	char *key3 = "0000000000000000";  /* 原始密钥, 十六进制字符串 */
            // 	char *data = "12345678123456781234567812345678";  /* 原始明文, 十六进制字符串 */
            QString lKey,rKey;
            lKey = key.left(16);
            rKey = key.right(16);
            char *key1 = lKey.toLatin1().data();   /* 原始密钥, 十六进制字符串 */
            char *key2 = rKey.toLatin1().data();   /* 原始密钥, 十六进制字符串 */
            char *key3 = lKey.toLatin1().data();   /* 原始密钥, 十六进制字符串 */
            char *data = clText.toLatin1().data(); /* 原始明文, 十六进制字符串 */
            unsigned char src[64] = {0};
            unsigned char out[64] = {0};
            unsigned char tmp[64] = {0};

            unsigned char *ptr  = NULL;
            unsigned char block[8] = {0};

            DES_key_schedule ks1, ks2, ks3;

            /* 设置密码表 */
            ptr = p->hex2bin(key1, strlen(key1), &nlen);
            memcpy(block, ptr, sizeof(block));
            free(ptr);

            DES_set_key_unchecked((const_DES_cblock *)block, &ks1);

            ptr = p->hex2bin(key2, strlen(key2), &nlen);
            memcpy(block, ptr, sizeof(block));
            free(ptr);
            DES_set_key_unchecked((const_DES_cblock *)block, &ks2);

            ptr = p->hex2bin(key3, strlen(key3), &nlen);
            memcpy(block, ptr, sizeof(block));
            free(ptr);
            DES_set_key_unchecked((const_DES_cblock *)block, &ks3);

            ptr = p->hex2bin(data, strlen(data), &nlen);
            memcpy(src, ptr, nlen);
            free(ptr);

            len = (nlen / 8 + (nlen % 8 ? 1: 0)) * 8;

            ch = 8 - nlen % 8;
            memset(src + nlen, ch, (8 - nlen % 8) % 8);

            printf("加密前数据: ");
            for (i = 0; i < len; i++) {
                printf("%02X", *(src + i));
            }
            printf("\n");

            for (i = 0; i < len; i += 8) {
                DES_ecb3_encrypt((const_DES_cblock *)(src + i), (const_DES_cblock *)(out + i), &ks1, &ks2, &ks3, DES_ENCRYPT);
            }

            const char *result[79] ;

            /*把解密后的数据转成16进制数*/
            for (i = 0; i < len; i++) {
                result[i] = p->bin2hex((out + i),1);
            }

            /*再把解密的数据装成CString*/
            for (int j=0;j<len;j++)
            {
                QString temp(result[j]);
                mValue += temp;
            }

            return mValue;
        }
        QT_CATCH(Except ex)
        {
            if(ex == EXCEP_ZERO) QT_RETHROW;
            return mValue;
        }

}

//3Des_ecb解密
QString QDES::m3Des_ecb_decrypt(QString clText, QString key)
{
    QString mValue;
        QT_TRY
        {
            int i = 0;
            int len = 0;
            int nlen = 0;
            char ch = '\0';
            // 	char *key1 = "0000000000000000";  /* 原始密钥, 十六进制字符串 */
            // 	char *key2 = "0000000000000000";  /* 原始密钥, 十六进制字符串 */
            // 	char *key3 = "0000000000000000";  /* 原始密钥, 十六进制字符串 */
            // 	char *data = "12345678123456781234567812345678";  /* 原始明文, 十六进制字符串 */
            QString lKey,rKey;
            lKey = key.left(16);
            rKey = key.right(16);
            char *key1 = lKey.toLatin1().data();   /* 原始密钥, 十六进制字符串 */
            char *key2 = rKey.toLatin1().data();   /* 原始密钥, 十六进制字符串 */
            char *key3 = lKey.toLatin1().data();   /* 原始密钥, 十六进制字符串 */
            char *data = clText.toLatin1().data(); /* 原始明文, 十六进制字符串 */
            unsigned char src[64] = {0};
            unsigned char out[64] = {0};
            unsigned char tmp[64] = {0};

            unsigned char *ptr  = NULL;
            unsigned char block[8] = {0};
            DES_key_schedule ks1, ks2, ks3;

            /* 设置密码表 */
            ptr = p->hex2bin(key1, strlen(key1), &nlen);
            memcpy(block, ptr, sizeof(block));
            free(ptr);
            DES_set_key_unchecked((const_DES_cblock *)block, &ks1);

            ptr = p->hex2bin(key2, strlen(key2), &nlen);
            memcpy(block, ptr, sizeof(block));
            free(ptr);
            DES_set_key_unchecked((const_DES_cblock *)block, &ks2);

            ptr = p->hex2bin(key3, strlen(key3), &nlen);
            memcpy(block, ptr, sizeof(block));
            free(ptr);
            DES_set_key_unchecked((const_DES_cblock *)block, &ks3);

            ptr = p->hex2bin(data, strlen(data), &nlen);
            memcpy(src, ptr, nlen);
            free(ptr);

            len = (nlen / 8 + (nlen % 8 ? 1: 0)) * 8;

            ch = 8 - nlen % 8;
            memset(src + nlen, ch, (8 - nlen % 8) % 8);

            printf("加密前数据: ");
            for (i = 0; i < len; i++) {
                printf("%02X", *(src + i));
            }
            printf("\n");

            for (i = 0; i < len; i += 8) {
                DES_ecb3_encrypt((const_DES_cblock *)(src + i), (const_DES_cblock *)(out + i), &ks1, &ks2, &ks3, DES_DECRYPT);
            }
            QString mValue;
            const char *result[128] ;

            /*把解密后的数据转成16进制数*/
            for (i = 0; i < len; i++) {
                result[i] = p->bin2hex((out + i),1);
            }

            /*再把解密的数据装成CString*/
            for (int j=0;j<len;j++)
            {
                QString temp(result[j]);
                mValue += temp;
            }

            return mValue;
        }
        QT_CATCH(Except ex)
        {
            if(ex == EXCEP_ZERO) QT_RETHROW;
            return mValue;
    }
}


//QDes_cbc加密
QString QDES::mDes_cbc_encrypt(char *clText, char *key)
{
    QString mValue;
        QT_TRY
        {
            DES_key_schedule ks;
            DES_cblock ivec = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

            int i = 0;
            int len = 0;
            int nlen = 0;

            // 	char *data = "848200001082CD0CACFA92293B800000";  /* 原始明文, 十六进制字符串 */
            // 	char *okey = "D527FB5519C316C9";  /* 原始密钥, 十六进制字符串 */

            char *data = clText;  /* 原始明文, 十六进制字符串 */
            char *okey = key;  /* 原始密钥, 十六进制字符串 */  //赋值

            unsigned char ch = '\0';
            unsigned char *ptr = NULL;

            unsigned char src[16] = {0}; /* 补齐后的明文, data补齐后的1/2长度 */
            unsigned char dst[16] = {0}; /* 解密后的明文, data补齐后的1/2长度 */

            unsigned char block[8] = {0};

            /* 设置密码表 */
            ptr = p->hex2bin(okey, strlen(okey), &nlen);
            memcpy(block, ptr, 8);
            free(ptr);
            DES_set_key_unchecked((const_DES_cblock*)block, &ks);

            /* 分析补齐明文所需空间及补齐填充数据 */
            len = strlen((char *)data);
            ptr = p->hex2bin(data, len, &nlen);
            len = (nlen / 8 + (nlen % 8 ? 1: 0)) * 8;
            memcpy(src, ptr, len);
            free(ptr);

            ch = 8 - nlen % 8;
            memset(src + nlen, ch, 8 - nlen % 8);

            printf("加密之前: ");
            for (i = 0; i < len; i++) {
                printf("%.2X", *(src + i));
            }
            printf("\n");

            /* 加密块链式加密 */
            DES_ncbc_encrypt(src, dst, sizeof(src), &ks, &ivec, DES_ENCRYPT);

            //	unsigned char *result[16] ;
            const char *result[36] ;
            printf("加密之后: ");
            int j=0;
            /*把解密后的结果转成16进制数*/
            for (i = 0; i < len; i++) {
                result[i] = p->bin2hex((dst + i),1);

            }
            /*再把解密的数据转成CString*/

            //	int valLen = strlen((char *)result);
            for (int j=0;j<len;j++)
            {
                QString temp(result[j]);
                mValue += temp;
            }

            free(src);
            free(dst);

            return mValue;
        }
        QT_CATCH(Except ex)
        {
        if(ex == EXCEP_ZERO) QT_RETHROW;
        return mValue;
        }
}

//QDes_cbc解密
QString QDES::mDes_cbc_decrypt(char *clText, char *key)
{
    QString mValue;
        QT_TRY
        {
            DES_key_schedule ks;
            DES_cblock ivec = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

            int i = 0;
            int len = 0;
            int nlen = 0;

            // 	char *data = "848200001082CD0CACFA92293B800000";  /* 原始明文, 十六进制字符串 */
            // 	char *okey = "D527FB5519C316C9";  /* 原始密钥, 十六进制字符串 */

            char *data = clText;  /* 原始明文, 十六进制字符串 */
            char *okey = key;  /* 原始密钥, 十六进制字符串 */  //赋值

            unsigned char ch = '\0';
            unsigned char *ptr = NULL;

            unsigned char src[16] = {0}; /* 补齐后的明文, data补齐后的1/2长度 */
            unsigned char dst[16] = {0}; /* 解密后的明文, data补齐后的1/2长度 */

            unsigned char block[8] = {0};

            /* 设置密码表 */
            ptr = p->hex2bin(okey, strlen(okey), &nlen);
            memcpy(block, ptr, 8);
            free(ptr);
            DES_set_key_unchecked((const_DES_cblock*)block, &ks);

            /* 分析补齐明文所需空间及补齐填充数据 */
            len = strlen((char *)data);
            ptr = p->hex2bin(data, len, &nlen);
            len = (nlen / 8 + (nlen % 8 ? 1: 0)) * 8;
            memcpy(src, ptr, len);
            free(ptr);

            ch = 8 - nlen % 8;
            memset(src + nlen, ch, 8 - nlen % 8);

            printf("加密之前: ");
            for (i = 0; i < len; i++) {
                printf("%.2X", *(src + i));
            }
            printf("\n");

            /* 加密块链式加密 */
            DES_ncbc_encrypt(src, dst, sizeof(src), &ks, &ivec, DES_DECRYPT);

            //	unsigned char *result[16] ;
            const char *result[128] ;
            printf("加密之后: ");

            /*把解密后的结果转成16进制数*/
            for (i = 0; i < len; i++) {
                result[i] = p->bin2hex((dst + i),1);

            }
            /*再把解密的数据装成CString*/

            //	int valLen = strlen((char *)result);
            for (int j=0;j<len;j++)
            {
                QString temp(result[j]);
                mValue += temp;
            }

            //	free(src);
            free(dst);

            return mValue;
        }
        QT_CATCH(Except ex)
        {
        if(ex == EXCEP_ZERO) QT_RETHROW;
        return mValue;
        }

}



DES.h文件

#ifndef QDES_H
#define QDES_H

#include <QMainWindow>
#include <QObject>
#include <QWidget>
#include <openssl/ssl.h>
#include <openssl/sha.h>
#include <openssl/aes.h>
#include <openssl/des.h>
#include <openssl/hmac.h>
#include "HEX.h"

class QDES
{
public:
    QDES(void);
    ~QDES(void);

    QString m3Des_cbc_encrypt(char *clText,char *key1,char *key2,char *key3);
    QString m3Des_cbc_nokey_encrypt(char *clText,char *LKey,char *RKey);
    QString m3Des_ecb_encrypt(QString clText,QString key);
    QString m3Des_ecb_decrypt(QString clText,QString key);
    QString mDes_cbc_encrypt(char *clText,char *key);
    QString mDes_cbc_decrypt(char *clText,char *key);

    QHEX *p = new QHEX;
};

#endif // QDES_H

HEX.C文件

#include "HEX.h"

QHEX::QHEX()
{

}

/************************************************************************
 * 二进制字节数组转换十六进制字符串函数
 * 输入:
 *       data 二进制字节数组
 *       size 二进制字节数组长度
 * 输出:
 *       十六进制字符串,需要free函数释放空间,失败返回NULL
 *
 * author: tonglulin@gmail.com by www.qmailer.net
 ************************************************************************/
char *QHEX::bin2hex(unsigned char *data, int size)
{
    int  i = 0;
        int  v = 0;
        char *p = NULL;
        char *buf = NULL;
        char base_char = 'A';

        buf = p = (char *)malloc(size * 2 + 1);
        for (i = 0; i < size; i++) {
            v = data[i] >> 4;
            *p++ = v < 10 ? v + '0' : v - 10 + base_char;

            v = data[i] & 0x0f;
            *p++ = v < 10 ? v + '0' : v - 10 + base_char;
        }

        *p = '\0';
        return buf;
}


/************************************************************************
 * 十六进制字符串转换二进制字节数组
 * 输入:
 *       data 十六进制字符串
 *       size 十六进制字符串长度,2的倍数
 *       outlen 转换后的二进制字符数组长度
 * 输出:
 *       二进制字符数组,需要free函数释放空间,失败返回NULL
 *
 * author: tonglulin@gmail.com by www.qmailer.net
 ************************************************************************/
unsigned char *QHEX::hex2bin(const char *data, int size, int *outlen)
{
    int i = 0;
      int len = 0;
      char char1 = '\0';
      char char2 = '\0';
      unsigned char value = 0;
      unsigned char *out = NULL;

      if (size % 2 != 0) {
          return NULL;
      }

      len = size / 2;
      out = (unsigned char *)malloc(len * sizeof(char) + 1);
      if (out == NULL) {
          return NULL;
      }

      while (i < len) {
          char1 = *data;
          if (char1 >= '0' && char1 <= '9') {
              value = (char1 - '0') << 4;
          }
          else if (char1 >= 'a' && char1 <= 'f') {
              value = (char1 - 'a' + 10) << 4;
          }
          else if (char1 >= 'A' && char1 <= 'F') {
              value = (char1 - 'A' + 10) << 4;
          }
          else {
              free(out);
              return NULL;
          }
          data++;

          char2 = *data;
          if (char2 >= '0' && char2 <= '9') {
              value |= char2 - '0';
          }
          else if (char2 >= 'a' && char2 <= 'f') {
              value |= char2 - 'a' + 10;
          }
          else if (char2 >= 'A' && char2 <= 'F') {
              value |= char2 - 'A' + 10;
          }
          else {
              free(out);
              return NULL;
          }

          data++;
          *(out + i++) = value;
      }
      *(out + i) = '\0';

      if (outlen != NULL) {
          *outlen = i;
      }

      return out;
}
#ifndef QHEX_H
#define QHEX_H

#include <QMainWindow>
#include <QObject>
#include <QWidget>

class QHEX
{
public:
    QHEX(void);
    ~QHEX(void);


    char *bin2hex(unsigned char *data, int size);

    unsigned char *hex2bin(const char *data, int size, int *outlen);
};

#endif // QHEX_H

在博主资源里有win 32 位的openssl三方库的下载,自取不客气,麻烦给个小小的赞~

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值