DES算法,头文件

DES算法,头文件


自己改写过,请指教
#ifndef __DES_H
#define __DES_H

class DES
{
public:
// Encrypt/decrypt the data in "data", according to the "key".
// Caller is responsible for confirming the buffer size of "data"
// points to is 8*"blocks" bytes.
// The data encrypted/decrypted is stored in data.
// The return code is 1:success, other:failed.
int encrypt ( char key[8], char* data, int blocks = 1 );
int decrypt ( char key[8], char* data, int blocks = 1 );

// Encrypt/decrypt any size data,according to a special method.
// Before calling yencrypt, copy data to a new buffer with size
// calculated by extend.
int yencrypt ( char key[8], char* data, int size );
int ydecrypt ( char key[8], char* in, int blocks, int* size = 0 );

int extend ( int size ) { return (size/8+1)*8; };

private:
void des(unsigned char* in, unsigned char* out, int blocks);
void des_block(unsigned char* in, unsigned char* out);

private:
unsigned long KnL[32];
enum Mode { ENCRYPT, DECRYPT };
void deskey(unsigned char key[8], Mode md);
void usekey(unsigned long *);
void cookey(unsigned long *);

private:
void scrunch(unsigned char *, unsigned long *);
void unscrun(unsigned long *, unsigned char *);
void desfunc(unsigned long *, unsigned long *);

private:
static unsigned char Df_Key[24];
static unsigned short bytebit[8];
static unsigned long bigbyte[24];
static unsigned char pc1[56];
static unsigned char totrot[16];
static unsigned char pc2[48];
static unsigned long SP1[64];
static unsigned long SP2[64];
static unsigned long SP3[64];
static unsigned long SP4[64];
static unsigned long SP5[64];
static unsigned long SP6[64];
static unsigned long SP7[64];
static unsigned long SP8[64];

};

#endif


中华技术网整理发布 http://www.asfocus.com http://www.netqu.com

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DES算法的C语言代码及实现 首先新建头文件des_encode.H 内容如下: void EncodeMain(); //EncodeMain function void DecodeMain(); //Sorry ,it has not used void Decode(int *str,int *keychar); //decode :input 8 chars,8 keychars void Encode(int *str,int *keychar); //encode: input 8 chars,8 keychars void keyBuild(int *keychar); //create key array void StrtoBin(int *midkey,int *keychar); //change into binary void keyCreate(int *midkey2,int movebit,int i); //call by keyBuild void EncodeData(int *lData,int *rData,int *srt); //encodedata function void F(int *rData,int *key); //F function void Expand(int *rData,int *rDataP); //Expand function void ExchangeS(int *rDataP,int *rData); //S-diagram change void ExchangeP(int *rData); //P change void FillBin(int *rData,int n,int s); // data to binary;call by S-Diagram change function void DecodeData(int *str,int *lData,int *rData); //DecodeData from binary int IP1[]={58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, //initial change 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7, }; int IP2[]={40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, //opp initial change 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 }; int s[][4][16]={{ //S-diagram array {14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7}, {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8}, {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0}, {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13} }, { {15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10}, {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5}, {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15}, {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9} }, { {10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8}, {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1}, {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7}, {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12} }, { {7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15}, {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9}, {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4}, {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14} }, { {2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9}, {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6}, {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14}, {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3} }, { {12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11}, {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8}, {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6}, {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13} }, { {4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1}, {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6}, {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2}, {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12} }, { {13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7}, {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2}, {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8}, {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11} } }; int Ex[48]={ 32,1,2,3,4,5, //Expand array 4,5,6,7,8,9, 8,9,10,11,12,13, 12,13,14,15,16,17, 16,17,18,19,20,21, 20,21,22,23,24,25, 24,25,26,27,28,29, 28,29,30,31,32,1 }; int P[32]={16,7,20,21, //P-change 29,12,28,17, 1,15,23,26, 5,18,31,10, 2,8,24,14, 32,27,3,9, 19,13,30,6, 22,11,4,25 }; int PC1[56]={57,49,41,33,25,17,9, //PC-1 in keyBuild 1,58,50,42,34,26,18, 10,2,59,51,43,35,27, 19,11,3,60,52,44,36, 63,55,47,39,31,33,15, 7,62,54,46,38,30,22, 14,6,61,53,45,37,29, 21,13,5,28,20,12,4 }; int PC2[48]={14,17,11,24,1,5, //PC-2 in keyBuild 3,28,15,6,21,10, 23,19,12,4,26,8, 16,7,27,20,13,2, 41,52,31,37,47,55, 30,40,51,45,33,48, 44,49,39,56,34,53, 46,42,50,36,29,32 }; 再创建des.cpp 内容如下: #include<stdio.h> #include<string.h> #include"des_encode.h" int key[16][48]; char str[8]; void main() //main function { EncodeMain(); } void EncodeMain() //EncodeMain function { int i; char keychar[8]; int key2[8]; int strkey[8]; printf("请输入8个要加密的字符:\n"); for(i=0;i<8;i++) scanf("%c",&str[i]); getchar(); for(i=0;i<8;i++) strkey[i]=str[i]; printf("\n输入明文的十六进制为:\n"); for(i=0;i<8;i++) printf("%10x",strkey[i]); printf("\n请输入密钥(8个字符):\n"); for(i=0;i<8;i++) scanf("%c",&keychar[i]); for(i=0;i<8;i++) key2[i]=keychar[i]; getchar(); // printf("%c",keychar[i]); Encode(strkey,key2); printf("\n加密后十六进制密文是:\n"); for(i=0;i<8;i++) printf("%10x",strkey[i]); printf("\n\n清输入解密密码\n"); for(i=0;i<8;i++) scanf("%c",&keychar[i]); for(i=0;i<8;i++) key2[i]=keychar[i]; Decode(strkey,key2); for(i=0;i<8;i++) printf("%10x",strkey[i]); for(i=0;i<8;i++) str[i]=strkey[i]; printf("\n明文为:\t"); for(i=0;i<8;i++) printf("%c",str[i]); printf("\n\n"); } void keyBuild(int *keychar){ //create key array int i,j; int movebit[]={1,1,2,2,2,2,2,2, 1,2,2,2,2,2,2,1}; int midkey2[56]; int midkey[64]; StrtoBin(midkey,keychar); for(i=0;i<56;i++) midkey2[i]=midkey[PC1[i]-1]; for(i=0;i<16;i++) keyCreate(midkey2,movebit[i],i); } void StrtoBin(int *midkey,int *keychar){ //change into binary int trans[8],i,j,k,n; n=0; for(i=0;i<8;i++){ j=0; while(keychar[i]!=0){ trans[j]=keychar[i]%2; keychar[i]=keychar[i]/2; j++; } for(k=j;k<8;k++)trans[k]=0; for(k=0;k<8;k++) midkey[n++]=trans[7-k]; } } void keyCreate(int *midkey2,int movebit,int n){ int i,temp[4]; temp[0]=midkey2[0]; temp[1]=midkey2[1]; temp[2]=midkey2[28]; temp[3]=midkey2[29]; if(movebit==2){ for(i=0;i<26;i++){ midkey2[i]=midkey2[i+2]; midkey2[i+28]=midkey2[i+30]; } midkey2[26]=temp[0];midkey2[27]=temp[1]; midkey2[54]=temp[2];midkey2[55]=temp[3]; } else { for(i=0;i<27;i++){ midkey2[i]=midkey2[i+1]; midkey2[i+28]=midkey2[i+29]; } midkey2[27]=temp[0];midkey2[55]=temp[2]; } for(i=0;i<48;i++) key[n][i]=midkey2[PC2[i]-1]; } void EncodeData(int *lData,int *rData,int *str){ //encodedata function int i,j,temp[8],lint,rint;//int h; int data[64]; lint=0,rint=0; for(i=0;i<4;i++){ j=0; while(str[i]!=0){ temp[j]=str[i]%2; str[i]=str[i]/2; j++; } while(j<8)temp[j++]=0; for(j=0;j<8;j++) lData[lint++]=temp[7-j]; j=0; while(str[i+4]!=0){ temp[j]=str[i+4]%2; str[i+4]=str[i+4]/2; j++; } while(j<8)temp[j++]=0; for(j=0;j<8;j++)rData[rint++]=temp[7-j]; } for(i=0;i<32;i++){ data[i]=lData[i]; data[i+32]=rData[i]; } for(i=0;i<32;i++){ lData[i]=data[IP1[i]-1];//printf("P1:%5d:%5d,%5d\n",IP1[i],lData[i],data[IP1[i]-1]); rData[i]=data[IP1[i+32]-1]; } } void F(int *rData,int *key){ //F function int i,rDataP[48]; Expand(rData,rDataP); for(i=0;i<48;i++){ rDataP[i]=rDataP[i]^key[i];// printf("%10d",rDataP[i]);if((i+1)%6==0)printf("\n"); } ExchangeS(rDataP,rData); ExchangeP(rData); } void Expand(int *rData,int *rDataP){ //Expand function int i; for(i=0;i<48;i++) rDataP[i]=rData[Ex[i]-1]; } void ExchangeS(int *rDataP,int *rData){ //S-diagram change int i,n,linex,liney; linex=liney=0; for(i=0;i<48;i+=6){ n=i/6; //printf("%10d\n",(rDataP[i]<<1)); linex=(rDataP[i]<<1)+rDataP[i+5]; liney=(rDataP[i+1]<<3)+(rDataP[i+2]<<2)+(rDataP[i+3]<<1)+rDataP[i+4]; FillBin(rData,n,s[n][linex][liney]); } } void ExchangeP(int *rData){ //P change int i,temp[32]; for(i=0;i<32;i++) temp[i]=rData[i]; for(i=0;i<32;i++) rData[i]=temp[P[i]-1]; } void FillBin(int *rData,int n,int s){ // data to binary;call by S-Diagram change function int temp[4],i; for(i=0;i<4;i++){ temp[i]=s%2; s=s/2; } for(i=0;i<4;i++) rData[n*4+i]=temp[3-i]; } void DecodeData(int *str,int *lData,int *rData){ //DecodeData from binary int i;int a,b;int data[64]; a=0,b=0; for(i=0;i<32;i++){ data[i]=lData[i]; data[i+32]=rData[i]; } for(i=0;i<32;i++){ lData[i]=data[IP2[i]-1]; rData[i]=data[IP2[i+32]-1]; } for(i=0;i<32;i++){ a=(lData[i]&0x1)+(a<<1); b=(rData[i]&0x1)+(b<<1); if((i+1)%8==0){ str[i/8]=a;a=0;//printf("%d",i/8); str[i/8+4]=b;b=0;//printf("%d",i/8+4); } } } void Encode(int *str,int *keychar){ //encode: input 8 chars,8 keychars int lData[32],rData[32],temp[32],rDataP[48]; int i,j; keyBuild(keychar); EncodeData(lData,rData,str); for(i=0;i<16;i++){ for(j=0;j<32;j++) temp[j]=rData[j]; F(rData,key[i]); for(j=0;j<32;j++){ rData[j]=rData[j]^lData[j]; } for(j=0;j<32;j++) lData[j]=temp[j]; } DecodeData(str,rData,lData); } void Decode(int *str,int *keychar){ //decode :input 8 chars,8 keychars int lData[32],rData[32],temp[32],rDataP[48]; int i,j; keyBuild(keychar); EncodeData(lData,rData,str); //这个位置 for(i=0;i<16;i++){ for(j=0;j<32;j++) temp[j]=rData[j]; F(rData,key[15-i]); for(j=0;j<32;j++){ rData[j]=rData[j]^lData[j]; } for(j=0;j<32;j++){ lData[j]=temp[j]; } } DecodeData(str,rData,lData); }
### 回答1: DES(Data Encryption Standard)算法是最早的加密标准之一,使用对称密钥加密方法,对数据进行加密以保障数据的机密性、完整性和可用性。C语言可以通过各种方式实现DES算法,这里简要介绍一种常见的实现方法。 首先,需要引入相关的头文件,包括"stdio.h"、"stdlib.h"、"string.h"等。 接下来,需要定义一些常量,如密钥长度、子密钥轮数等。同时,需要定义一些结构体和数组,如: - DESSubKey:存储子密钥的结构体 - IP:初始置换矩阵 - IPInv:初始置换的逆矩阵 - E:扩展矩阵 - S:S盒 - P:P盒 然后,需要实现一些函数,如: - IPPerm:实现初始置换 - IPInvPerm:实现初始置换的逆置换 - ExtendPerm:实现扩展置换 - SBoxPerm:实现S盒置换 - PBoxPerm:实现P盒置换 - KeySchedule:生成子密钥 - DESRound:DES算法单轮加密操作 最后,可以实现一个DES加密函数,接收一个明文和一个密钥,返回加密后的密文。该函数主要包括以下步骤: - 检查明文和密钥长度是否符合要求 - 生成子密钥 - 进行初始置换 - 进行16轮加密 - 进行末置换 以上是一种常见的DES算法实现方法,但由于DES算法已经不再安全,建议使用更为安全的加密算法,如AES(Advanced Encryption Standard)。 ### 回答2: DES(Data Encryption Standard)是一种对称加密算法,它使用同一个密钥进行加密和解密,密钥长度为56位。下面是在C语言中实现DES算法的代码: 首先需要引入DES算法头文件#include "..\..\crypto\des\des.h" 定义DES算法所需的变量:char key[8]; //8字节密钥 unsigned char plaintext[8]; //明文 unsigned char ciphertext[8]; //密文 接下来,使用DES_set_key函数来设置密钥: DES_cblock key32; //key32用于存储56位密钥转换后的64位密钥 unsigned char key[8]; //输入的8字节密钥 memcpy(key, "12345678", 8); //设置密钥的值 memset(key32, 0, 8); //初始化64位密钥 DES_set_key_checked(&key, &key32); //将8字节密钥转换成64位密钥并设置为DES算法的密钥 然后,使用DES_ecb_encrypt函数对明文进行加密: DES_cblock input32; //input32用于存储8字节明文转换后的64位明文 DES_cblock output32; //output32用于存储8字节密文 memset(input32, 0, 8); //初始化64位明文 memcpy(input32, plaintext, 8); //设置明文的值 DES_ecb_encrypt(&input32, &output32, &key32, DES_ENCRYPT); //对明文进行加密 最后,使用DES_ecb_encrypt函数对密文进行解密: DES_cblock input32; //input32用于存储8字节密文转换后的64位密文 DES_cblock output32; //output32用于存储8字节明文 memset(input32, 0, 8); //初始化64位密文 memcpy(input32, ciphertext, 8); //设置密文的值 DES_ecb_encrypt(&input32, &output32, &key32, DES_DECRYPT); //对密文进行解密 通过以上代码,我们就可以在C语言中实现DES算法的加密和解密功能。 ### 回答3: DES算法是对称加密算法中的一种,它使用固定长度的密钥将数据块转换为加密数据块。该算法由IBM研发,在1977年被NSA标准化,成为一种广受使用的加密标准。在实现DES算法时,需要用到C语言进行编程。 在实现DES算法时,需要使用多个函数来完成加密和解密的过程。首先,需要定义几个常量,以及一些用于加密和解密的函数。这些函数包括: 1. IP置换函数(Initial Permutation),用于对64位明文按照规定的顺序重新排列。 2. F函数,用于对32位数据进行压缩和扩展,以及与子密钥进行异或操作和替换操作。 3. PC1函数和PC2函数,分别用于从64位密钥中生成56位子密钥。 4. E置换函数(Expansion Permutation),用于将32位数据扩展为48位数据。 5. P置换函数(Permutation),用于对32位数据按照规定的顺序进行重新排列。 在进行加密和解密的过程中,需要使用的主要函数包括: 1. KeySchedule函数,用于生成16个48位子密钥。 2. DES_Encrypt函数和DES_Decrypt函数,用于分别进行加密和解密的操作。 在具体实现DES算法时,需要参考DES标准的具体实现方式和协议。同时,还需要考虑到实现过程中可能出现的安全漏洞和攻击手段,以及如何进行防御和修补。因此,在进行DES算法的实现时,需要认真学习和理解相关的知识,才能够编写出安全可靠的加密算法代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值