当前位置:编程学习 > 网站相关 >>

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


[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[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; 
   

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,