• [C语言]mac下Des CBC加密


    加密步骤如下:

    1)首先将数据按照8个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,用指定的PADDING数据补位)

    2)第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)

    3)第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2

    4)之后的数据以此类推,得到Cn

    5)按顺序连为C1C2C3......Cn即为加密结果。

    3Des.h文件

    #ifndef _3DES
    #define _3DES
    #include <strings.h>
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif /* __cplusplus */
        unsigned char* GetKey(unsigned char *RandomData);
        void  DesEncrypt_ECB(unsigned char *key, unsigned char *data);
        unsigned char* DesEncrypt_CBC(unsigned char *key, unsigned char *data,int len);
    #ifdef __cplusplus
    };
    #endif /* __cplusplus */
    #endif /* defined(_3DES) */


    3Des.cpp文件

    #include "3DES.h"
    #include "DES.h"
    #include <iostream>
    unsigned char* GetKey(unsigned char *RandomData){
        unsigned char* key=(unsigned char*)malloc(16);
        for (int i=0; i<16; i++) {
            key[i]=0xFF;
        }
        unsigned char RevertData[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
        for (int i=0; i<sizeof(RevertData); i++) {
            RevertData[i]=~RandomData[i];
        }
        
        DesEncrypt_ECB(key, RandomData);
        DesEncrypt_ECB(key, RevertData);
        
        for (int i=0; i<16; i++) {
            if(i<8)
                key[i]=RandomData[i];
            else
                key[i]=RevertData[i-8];
        }
        return key;
    }
    void  DesEncrypt_ECB(unsigned char *key, unsigned char *data){
        DesEncrypt(key,data);
    	DesDecrypt(key,data);
    	DesEncrypt(key,data);
    
    }
    unsigned char*  DesEncrypt_CBC(unsigned char *key, unsigned char *data, int len){
        unsigned char* data2=(unsigned char*)malloc(8);
    	unsigned char data3[8];
        int sum=len/8+1;
        int yushu=len%8;
        for (int i=0;i<sum;i++) {
            for (int j=0; j<8; j++) {
                if(i<sum-1){
                    data2[j]=data[i*8+j];
                    if(j==7&&i==0){
                        DesEncrypt(key, data2);
                        for (int k=0; k<8; k++) {
                            data3[k]=data2[k];
                        }
                    }else if(j==7&&i>0){
                        for (int k=0; k<8; k++) {
                            data2[k]^=data3[k];
                        }
                        DesEncrypt(key, data2);
                        for (int k=0; k<8; k++) {
                            data3[k]=data2[k];
                        }
                    }
                }else if(yushu==0&&i==sum-1&&j==7){
    				data2[0]=0x80;
    				for(int k=1;k<8;k++){
    					data2[k]=0x00;
    				}
                    for (int k=0; k<8; k++) {
                        data2[k]^=data3[k];
                    }
                    DesEncrypt(key, data2);
                    
                }else if(yushu>0){
                    if(j<yushu){
                        data2[j]=data[i*8+j];
                    }else if(j==yushu){
                        data2[j]=0x80;
                    }else if(j>yushu&&j!=7){
                        data2[j]=0x00;
                    }else if(j==7){
                        data2[j]=0x00;
                        for (int k=0; k<8; k++) {
                            data2[k]^=data3[k];
                        }
                        DesEncrypt(key, data2);
                    }
                    
                }
            }
        }
        return data2;
    }
    


    main函数

    unsigned char RandomData[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
        unsigned char* key=GetKey(RandomData);
        
        
        
        unsigned char data[17]={0x14,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
    	unsigned char* macdata=DesEncrypt_CBC(key,data,sizeof(data));
        for (int i=0; i<8; i++) {
            printf("%x\n",macdata[i]);
        }
        free(macdata);
        free(key);
    



  • 相关阅读:
    【队列】队列的分类和实现
    【JSP】EL表达式语言
    【JSP】JSP的介绍和基本原理
    【JSP】JSP Action动作标签
    【Servlet】关于RequestDispatcher的原理
    【JSP】JSP指令
    【JSP】JSP中的Java脚本
    【算法】表达式求值--逆波兰算法介绍
    C语言指针详解
    移动架构-MVVM框架
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3125161.html
Copyright © 2020-2023  润新知