灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3444回复:0

[C语言]mac下Des CBC加密

楼主#
更多 发布于:2013-07-08 13:08
加密步骤如下:

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

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

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

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

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

3Des.h文件


[cpp]
#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) */

#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文件


[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=0xFF;
    }
    unsigned char RevertData[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    for (int i=0; i<sizeof(RevertData); i++) {
        RevertData=~RandomData;
    }
    
    DesEncrypt_ECB(key, RandomData);
    DesEncrypt_ECB(key, RevertData);
    
    for (int i=0; i<16; i++) {
        if(i<8)
            key=RandomData;
        else
            key=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;
}

#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=0xFF;
    }
    unsigned char RevertData[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    for (int i=0; i<sizeof(RevertData); i++) {
        RevertData=~RandomData;
    }
  
    DesEncrypt_ECB(key, RandomData);
    DesEncrypt_ECB(key, RevertData);
  
    for (int i=0; i<16; i++) {
        if(i<8)
            key=RandomData;
        else
            key=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函数


[cpp]
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);
    }
    free(macdata);
    free(key);

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);
    }
    free(macdata);
    free(key);

喜欢0 评分0
游客

返回顶部