用C语言来实现DES加密算法 很急 两天内(c语言实现des简化加密算法)

2023-03-05 1:14:04 密语知识 思思

DES虽然不难但是挺繁复的,代码如下,关键点都有英文解释,仔细看。各个函数的功能都可以从函数名看出来。

#include "pch.h"

#include "misc.h"

#include "des.h"

NAMESPACE_BEGIN(CryptoPP)

/* Tables defined in the Data Encryption Standard documents

* Three of these tables, the initial permutation, the final

* permutation and the expansion operator, are regular enough that

* for speed, we hard-code them. They're here for reference only.

* Also, the S and P boxes are used by a separate program, gensp.c,

* to build the combined SP box, Spbox[]. They're also here just

* for reference.

*/

#ifdef notdef

/* initial permutation IP */

static byte ip[] = {

58, 50, 42, 34, 26, 18, 10, 2,

60, 52, 44, 36, 28, 20, 12, 4,

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

};

/* final permutation IP^-1 */

static byte fp[] = {

40, 8, 48, 16, 56, 24, 64, 32,

39, 7, 47, 15, 55, 23, 63, 31,

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

};

/* expansion operation matrix */

static byte ei[] = {

32, 1, 2, 3, 4, 5,

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

};

/* The (in)famous S-boxes */

static byte sbox[8][64] = {

/* S1 */

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,

/* S2 */

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,

/* S3 */

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,

/* S4 */

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,

/* S5 */

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,

/* S6 */

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,

/* S7 */

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,

/* S8 */

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

};

/* 32-bit permutation function P used on the output of the S-boxes */

static byte p32i[] = {

16, 7, 20, 21,

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

};

#endif

/* permuted choice table (key) */

static const byte pc1[] = {

57, 49, 41, 33, 25, 17, 9,

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, 23, 15,

7, 62, 54, 46, 38, 30, 22,

14, 6, 61, 53, 45, 37, 29,

21, 13, 5, 28, 20, 12, 4

};

/* number left rotations of pc1 */

static const byte totrot[] = {

1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28

};

/* permuted choice key (table) */

static const byte pc2[] = {

14, 17, 11, 24, 1, 5,

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

};

/* End of DES-defined tables */

/* bit 0 is left-most in byte */

static const int bytebit[] = {

0200,0100,040,020,010,04,02,01

};

/* Set key (initialize key schedule array) */

DES::DES(const byte *key, CipherDir dir)

: k(32)

{

SecByteBlock buffer(56+56+8);

byte *const pc1m=buffer; /* place to modify pc1 into */

byte *const pcr=pc1m+56; /* place to rotate pc1 into */

byte *const ks=pcr+56;

register int i,j,l;

int m;

for (j=0; j56; j++) { /* convert pc1 to bits of key */

l=pc1[j]-1; /* integer bit location */

m = l 07; /* find bit */

pc1m[j]=(key[l3] /* find which key byte l is in */

bytebit[m]) /* and which bit of that byte */

? 1 : 0; /* and store 1-bit result */

}

for (i=0; i16; i++) { /* key chunk for each iteration */

memset(ks,0,8); /* Clear key schedule */

for (j=0; j56; j++) /* rotate pc1 the right amount */

pcr[j] = pc1m[(l=j+totrot[i])(j28? 28 : 56) ? l: l-28];

/* rotate left and right halves independently */

for (j=0; j48; j++){ /* select bits individually */

/* check bit that goes to ks[j] */

if (pcr[pc2[j]-1]){

/* mask it in if it's there */

l= j % 6;

ks[j/6] |= bytebit[l] 2;

}

}

/* Now convert to odd/even interleaved form for use in F */

k[2*i] = ((word32)ks[0] 24)

| ((word32)ks[2] 16)

| ((word32)ks[4] 8)

| ((word32)ks[6]);

k[2*i+1] = ((word32)ks[1] 24)

| ((word32)ks[3] 16)

| ((word32)ks[5] 8)

| ((word32)ks[7]);

}

if (dir==DECRYPTION) // reverse key schedule order

for (i=0; i16; i+=2)

{

std::swap(k[i], k[32-2-i]);

std::swap(k[i+1], k[32-1-i]);

}

}

/* End of C code common to both versions */

/* C code only in portable version */

// Richard Outerbridge's initial permutation algorithm

/*

inline void IPERM(word32 left, word32 right)

{

word32 work;

work = ((left 4) ^ right) 0x0f0f0f0f;

right ^= work;

left ^= work 4;

work = ((left 16) ^ right) 0xffff;

right ^= work;

left ^= work 16;

work = ((right 2) ^ left) 0x33333333;

left ^= work;

right ^= (work 2);

work = ((right 8) ^ left) 0xff00ff;

left ^= work;

right ^= (work 8);

right = rotl(right, 1);

work = (left ^ right) 0xaaaaaaaa;

left ^= work;

right ^= work;

left = rotl(left, 1);

}

inline void FPERM(word32 left, word32 right)

{

word32 work;

right = rotr(right, 1);

work = (left ^ right) 0xaaaaaaaa;

left ^= work;

right ^= work;

left = rotr(left, 1);

work = ((left 8) ^ right) 0xff00ff;

right ^= work;

left ^= work 8;

work = ((left 2) ^ right) 0x33333333;

right ^= work;

left ^= work 2;

work = ((right 16) ^ left) 0xffff;

left ^= work;

right ^= work 16;

work = ((right 4) ^ left) 0x0f0f0f0f;

left ^= work;

right ^= work 4;

}

*/

// Wei Dai's modification to Richard Outerbridge's initial permutation

// algorithm, this one is faster if you have access to rotate instructions

// (like in MSVC)

inline void IPERM(word32 left, word32 right)

{

word32 work;

right = rotl(right, 4U);

work = (left ^ right) 0xf0f0f0f0;

left ^= work;

right = rotr(right^work, 20U);

work = (left ^ right) 0xffff0000;

left ^= work;

right = rotr(right^work, 18U);

work = (left ^ right) 0x33333333;

left ^= work;

right = rotr(right^work, 6U);

work = (left ^ right) 0x00ff00ff;

left ^= work;

right = rotl(right^work, 9U);

work = (left ^ right) 0xaaaaaaaa;

left = rotl(left^work, 1U);

right ^= work;

}

inline void FPERM(word32 left, word32 right)

{

word32 work;

right = rotr(right, 1U);

work = (left ^ right) 0xaaaaaaaa;

right ^= work;

left = rotr(left^work, 9U);

work = (left ^ right) 0x00ff00ff;

right ^= work;

left = rotl(left^work, 6U);

work = (left ^ right) 0x33333333;

right ^= work;

left = rotl(left^work, 18U);

work = (left ^ right) 0xffff0000;

right ^= work;

left = rotl(left^work, 20U);

work = (left ^ right) 0xf0f0f0f0;

right ^= work;

left = rotr(left^work, 4U);

}

// Encrypt or decrypt a block of data in ECB mode

void DES::ProcessBlock(const byte *inBlock, byte * outBlock) const

{

word32 l,r,work;

#ifdef IS_LITTLE_ENDIAN

l = byteReverse(*(word32 *)inBlock);

r = byteReverse(*(word32 *)(inBlock+4));

#else

l = *(word32 *)inBlock;

r = *(word32 *)(inBlock+4);

#endif

IPERM(l,r);

const word32 *kptr=k;

for (unsigned i=0; i8; i++)

{

work = rotr(r, 4U) ^ kptr[4*i+0];

l ^= Spbox[6][(work) 0x3f]

^ Spbox[4][(work 8) 0x3f]

^ Spbox[2][(work 16) 0x3f]

^ Spbox[0][(work 24) 0x3f];

work = r ^ kptr[4*i+1];

l ^= Spbox[7][(work) 0x3f]

^ Spbox[5][(work 8) 0x3f]

^ Spbox[3][(work 16) 0x3f]

^ Spbox[1][(work 24) 0x3f];

work = rotr(l, 4U) ^ kptr[4*i+2];

r ^= Spbox[6][(work) 0x3f]

^ Spbox[4][(work 8) 0x3f]

^ Spbox[2][(work 16) 0x3f]

^ Spbox[0][(work 24) 0x3f];

work = l ^ kptr[4*i+3];

r ^= Spbox[7][(work) 0x3f]

^ Spbox[5][(work 8) 0x3f]

^ Spbox[3][(work 16) 0x3f]

^ Spbox[1][(work 24) 0x3f];

}

FPERM(l,r);

#ifdef IS_LITTLE_ENDIAN

*(word32 *)outBlock = byteReverse(r);

*(word32 *)(outBlock+4) = byteReverse(l);

#else

*(word32 *)outBlock = r;

*(word32 *)(outBlock+4) = l;

#endif

}

void DES_EDE_Encryption::ProcessBlock(byte *inoutBlock) const

{

e.ProcessBlock(inoutBlock);

d.ProcessBlock(inoutBlock);

e.ProcessBlock(inoutBlock);

}

void DES_EDE_Encryption::ProcessBlock(const byte *inBlock, byte *outBlock) const

{

e.ProcessBlock(inBlock, outBlock);

d.ProcessBlock(outBlock);

e.ProcessBlock(outBlock);

}

void DES_EDE_Decryption::ProcessBlock(byte *inoutBlock) const

{

d.ProcessBlock(inoutBlock);

e.ProcessBlock(inoutBlock);

d.ProcessBlock(inoutBlock);

}

void DES_EDE_Decryption::ProcessBlock(const byte *inBlock, byte *outBlock) const

{

d.ProcessBlock(inBlock, outBlock);

e.ProcessBlock(outBlock);

d.ProcessBlock(outBlock);

}

void TripleDES_Encryption::ProcessBlock(byte *inoutBlock) const

{

e1.ProcessBlock(inoutBlock);

d.ProcessBlock(inoutBlock);

e2.ProcessBlock(inoutBlock);

}

void TripleDES_Encryption::ProcessBlock(const byte *inBlock, byte *outBlock) const

{

e1.ProcessBlock(inBlock, outBlock);

d.ProcessBlock(outBlock);

e2.ProcessBlock(outBlock);

}

void TripleDES_Decryption::ProcessBlock(byte *inoutBlock) const

{

d1.ProcessBlock(inoutBlock);

e.ProcessBlock(inoutBlock);

d2.ProcessBlock(inoutBlock);

}

void TripleDES_Decryption::ProcessBlock(const byte *inBlock, byte *outBlock) const

{

d1.ProcessBlock(inBlock, outBlock);

e.ProcessBlock(outBlock);

d2.ProcessBlock(outBlock);

}

求一个用c语言写的DES加密算法~~

using system;

using system.security.cryptography;

using system.io;

using system.text;

public class encryptstringdes {

public static void main(string);

return;

}

// 使用utf8函数加密输入参数

utf8encoding utf8encoding = new utf8encoding();

byte.tochararray());

// 方式一:调用默认的des实现方法des_csp.

des des = des.create();

// 方式二:直接使用des_csp()实现des的实体

//des_csp des = new des_csp();

// 初始化des加密的密钥和一个随机的、8比特的初始化向量(iv)

byte iv = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef};

des.key = key;

des.iv = iv;

// 建立加密流

symmetricstreamencryptor sse = des.createencryptor();

// 使用cryptomemorystream方法获取加密过程的输出

cryptomemorystream cms = new cryptomemorystream();

// 将symmetricstreamencryptor流中的加密数据输出到cryptomemorystream中

sse.setsink(cms);

// 加密完毕,将结果输出到控制台

sse.write(inputbytearray);

sse.closestream();

// 获取加密数据

byte);

}

console.writeline();

//上面演示了如何进行加密,下面演示如何进行解密

symmetricstreamdecryptor ssd = des.createdecryptor();

cms = new cryptomemorystream();

ssd.setsink(cms);

ssd.write(encrypteddata);

ssd.closestream();

byte decryptedchararray = utf8encoding.getchars(decrypteddata);

console.writeline("解密后数据:");

console.write(decryptedchararray);

console.writeline();

}

}

编译:

d:\csharpcsc des_demo.cs

microsoft (r) c# compiler version 7.00.8905

copyright (c) microsoft corp 2000. all rights reserved.

运行实例:

d:\csharpdes_demo.exe 使用c#编写des加密程序的framework

加密结果:

3d 22 64 c6 57 d1 c4 c3 cf 77 ce 2f d0 e1 78 2a 4d ed 7a a8 83 f9 0e 14 e1 ba 38

7b 06 41 8d b5 e9 3f 00 0d c3 28 d1 f9 6d 17 4b 6e a7 41 68 40

用c语言写des加密算法

#include stdio.h #include string.h #include windows.h #include conio.h #include "Schedle.h" class CShift{ public: DWORDLONG mask[16]; int step[16]; CShift(){ for(int i=0;i16;i++){ step[i]=2; mask[i]=0xc000000; } step[0]=step[1]=step[8]=step[15]=1; mask[0]=mask[1]=mask[8]=mask[15]=0x8000000; } }; class CDES{ public: CDES(){ m_dwlKey=0; m_dwlData=0; ConvertTableToMask(dwlKey_PC_1,64); //PrintTable(dwlKey_PC_1,7,8); ConvertTableToMask(dwlKey_PC_2,56); ConvertTableToMask(dwlData_IP,64); ConvertTableToMask(dwlData_Expansion,32); ConvertTableToMask(dwlData_FP,64); ConvertTableToMask(dwlData_P,32); Generate_S(); } void PrintBit(DWORDLONG); void EncryptKey(char *); unsigned char* EncryptData(unsigned char *); unsigned char* DescryptData(unsigned char*); private: void ConvertTableToMask(DWORDLONG *,int); void Generate_S(void); void PrintTable(DWORDLONG*,int,int); DWORDLONG ProcessByte(unsigned char*,BOOL); DWORDLONG PermuteTable(DWORDLONG,DWORDLONG*,int); void Generate_K(void); void EncryptKernel(void); DWORDLONG Generate_B(DWORDLONG,DWORDLONG*); /*For verify schedule permutation only*/ DWORDLONG UnPermuteTable(DWORDLONG,DWORDLONG*,int); /**************************************/ DWORDLONG dwlData_S[9][4][16]; CShift m_shift; DWORDLONG m_dwlKey; DWORDLONG m_dwlData; DWORDLONG m_dwl_K[17]; }; void CDES::EncryptKey(char *key){ printf("\nOriginal Key: %s",key); m_dwlKey=ProcessByte((unsigned char*)key,TRUE); // PrintBit(m_dwlKey); m_dwlKey=PermuteTable(m_dwlKey,dwlKey_PC_1,56); // PrintBit(m_dwlKey); Generate_K(); // printf("\n******************************************\n"); } void CDES::Generate_K(void){ DWORDLONG C[17],D[17],tmp; C[0]=m_dwlKey28; D[0]=m_dwlKey0xfffffff; for(int i=1;i=16;i++){ tmp=(C[i-1]m_shift.mask[i-1])(28-m_shift.step[i-1]); C[i]=((C[i-1]m_shift.step[i-1])|tmp)0x0fffffff; tmp=(D[i-1]m_shift.mask[i-1])(28-m_shift.step[i-1]); D[i]=((D[i-1]m_shift.step[i-1])|tmp)0x0fffffff; m_dwl_K[i]=(C[i]28)|D[i]; m_dwl_K[i]=PermuteTable(m_dwl_K[i],dwlKey_PC_2,48); } } DWORDLONG CDES::ProcessByte(unsigned char *key,BOOL shift){ unsigned char tmp; DWORDLONG byte=0; int i=0; while(i8){ while(*key){ if(byte!=0) byte=8; tmp=*key; if(shift) tmp=1; byte|=tmp; i++; key++; } if(i8) byte=8; i++; } return byte; } DWORDLONG CDES::PermuteTable(DWORDLONG dwlPara,DWOR 基于des算法的rfid安全系统

DLONG* dwlTable,int nDestLen){ int i=0; DWORDLONG tmp=0,moveBit; while(inDestLen){ moveBit=1; if(dwlTable[i]dwlPara){ moveBit=nDestLen-i-1; tmp|=moveBit; } i++; } return tmp; } DWORDLONG CDES::UnPermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLen){ DWORDLONG tmp=0; int i=nDestLen-1; while(dwlPara!=0){ if(dwlPara0x01) tmp|=dwlTable[i]; dwlPara=1; i--; } return tmp; } void CDES::PrintTable(DWORDLONG *dwlPara,int col,int row){ int i,j; for(i=0;irow;i++){ printf("\n"); getch(); for(j=0;jcol;j++) PrintBit(dwlPara[i*col+j]); } } void CDES::PrintBit(DWORDLONG bitstream){ char out[76]; int i=0,j=0,space=0; while(bitstream!=0){ if(bitstream0x01) out[i++]='1'; else out[i++]='0'; j++; if(j%8==0){ out[i++]=' '; space++; } bitstream=bitstream1; } out[i]='\0'; strcpy(out,strrev(out)); printf("%s **:%d\n",out,i-space); } void CDES::ConvertTableToMask(DWORDLONG *mask,int max){ int i=0; DWORDLONG nBit=1; while(mask[i]!=0){ nBit=1; nBit=max-mask[i]; mask[i++]=nBit; } } void CDES::Generate_S(void){ int i; int j,m,n; m=n=0; j=1; for(i=0;i512;i++){ dwlData_S[j][m][n]=OS[i]; n=(n+1)%16; if(!n){ m=(m+1)%4; if(!m) j++; } } } unsigned char * CDES::EncryptData(unsigned char *block){ unsigned char *EncrytedData=new unsigned char(15); printf("\nOriginal Data: %s\n",block); m_dwlData=ProcessByte(block,0); // PrintBit(m_dwlData); m_dwlData=PermuteTable(m_dwlData,dwlData_IP,64); EncryptKernel(); // PrintBit(m_dwlData); DWORDLONG bit6=m_dwlData; for(int i=0;i11;i++){ EncrytedData[7-i]=(unsigned char)(bit60x3f)+46; bit6=6; } EncrytedData[11]='\0'; printf("\nAfter Encrypted: %s",EncrytedData); for(i=0;i8;i++){ EncrytedData[7-i]=(unsigned char)(m_dwlData0xff); m_dwlData=8; } EncrytedData[8]='\0'; return EncrytedData; } void CDES::EncryptKernel(void){ int i=1; DWORDLONG L[17],R[17],B[9],EK,PSB; L[0]=m_dwlData32; R[0]=m_dwlData0xffffffff; for(i=1;i=16;i++){ L[i]=R[i-1]; R[i-1]=PermuteTable(R[i-1],dwlData_Expansion,48); //Expansion R EK=R[i-1]^m_dwl_K[i]; //E Permutation PSB=Generate_B(EK,B); //P Permutation R[i]=L[i-1]^PSB; } R[16]=32; m_dwlData=R[16]|L[16]; m_dwlData=PermuteTable(m_dwlData,dwlData_FP,64); } unsigned char* CDES::DescryptData(unsigned char *desData){ int i=1; unsigned char *DescryptedData=new unsigned char(15); DWORDLONG L[17],R[17],B[9],EK,PSB; DWORDLONG dataPara; dataPara=ProcessByte(desData,0); dataPara=PermuteTable(dataPara,dwlData_IP,64); R[16]=dataPara32; L[16]=dataPara0xffffffff; for(i=16;i=1;i--){ R[i-1]=L[i]; L[i]=PermuteTable(L[i],dwlData_Expansion,48); //Expansion L EK=L[i]^m_dwl_K[i]; //E Permutation PSB=Generate_B(EK,B); //P Permutation L[i-1]=R[i]^PSB; } L[0]=32; dataPara=L[0]|R[0]; dataPara=PermuteTable(dataPara,dwlData_FP,64); // PrintBit(dataPara); for(i=0;i8;i++){ DescryptedData[7-i]=(unsigned char)(dataPara0xff); dataPara=8; } DescryptedData[8]='\0'; printf("\nAfter Decrypted: %s\n",DescryptedData); return DescryptedData; } DWORDLONG CDES::Generate_B(DWORDLONG EKPara,DWORDLONG *block){ int i,m,n; DWORDLONG tmp=0; for(i=8;i0;i--){ block[i]=EKPara0x3f; m=(int)(block[i]0x20)4; m|=block[i]0x01; n=(int)(block[i]1)2; block[i]=dwlData_S[i][m][n]; EKPara=6; } for(i=1;i=8;i++){ tmp|=block[i]; tmp=4; } tmp=4; tmp=PermuteTable(tmp,dwlData_P,32); return tmp; } void main(void){ CDES des; des.EncryptKey("12345678"); unsigned char *result=des.EncryptData((unsigned char*)"DemoData"); des.DescryptData(result); }[1]

如何实现C语言的DES加密算法实现,请关注

可能很长 ,这是在我以前一个程序里摘出来的。 原理:用户输入创建密码,机器读取,并把每一位密码进行加密,这里就是把每一位的 ASCII码加一(也可以有其他的加密方式),然后保存在文件里。解密时从文件中读取保存的乱码,然后把它每一位的asc

DES加密算法C语言实现

/*********************************************************************/

/*-文件名:des.h */

/*- */

/*-功能: 实现DES加密算法的加密解密功能 */

/*********************************************************************/

typedef int INT32;

typedef char INT8;

typedef unsigned char ULONG8;

typedef unsigned short ULONG16;

typedef unsigned long ULONG32;

/*如果采用c++编译器的话采用如下宏定义

#define DllExport extern "C" __declspec(dllexport)

*/

#define DllExport __declspec(dllexport)

/*加密接口函数*/

DllExport INT32 DdesN(ULONG8 *data, ULONG8 **key, ULONG32 n_key,ULONG32 readlen);

DllExport INT32 desN(ULONG8 *data, ULONG8 **key, ULONG32 n_key,ULONG32 readlen);

DllExport INT32 des3(ULONG8 *data, ULONG8 *key,ULONG32 n ,ULONG32 readlen);

DllExport INT32 Ddes3(ULONG8 *data,ULONG8 *key,ULONG32 n ,ULONG32 readlen);

DllExport INT32 des(ULONG8 *data, ULONG8 *key,INT32 readlen);

DllExport INT32 Ddes(ULONG8 *data,ULONG8 *key,INT32 readlen);

*********************************************************************/

/*-文件名:des.c */

/*- */

/*-功能: 实现DES加密算法的加密解密功能 */

//*********************************************************************/

#include stdlib.h

#include stdio.h

#include string.h

#include memory.h

#include malloc.h

#include "des.h"

#define SUCCESS 0

#define FAIL -1

#define READFILESIZE 512

#define WZ_COMMEND_NUM 4

#define WZUSEHELPNUM 19

#define DESONE 1

#define DESTHREE 2

#define DESMULTI 3

INT8 *WZ_Commend_Help[] =

{

"基于DES的加密解密工具v1.0 ",/*0*/

"追求卓越,勇于创新 ",

"----著者 : 吴真--- ",

" "

};

INT8 *WZ_USE_HELP[]={

"输入5+n个参数:",

"\t1.可执行文件名 *.exe",

"\t2.操作类型 1:一层加密;2:一层解密;",

"\t\t13:N层单密钥加密;23:N层单密钥解密;",

"\t\t39:N层多密钥加密;49:N层多密钥解密",

"\t3.读出数据的文件名*.txt",

"\t4.写入数据的文件名*.txt",

"\t5.密钥(8字节例如:wuzhen12)",

"\t[6].N层单密钥的层数或者...二层加密|解密密钥",

"\t[7].三层加密|解密密钥",

"\t[8]. ...",

"\t[N].N层加密|解密密钥",

"\t 例1: des 1 1.txt 2.txt 12345678",

"\t : des 2 2.txt 3.txt 12345678",

"\t 例2: des 13 1.txt 2.txt tiantian 5",

"\t : des 23 2.txt 3.txt tiantian 5",

"\t 例3: des 39 1.txt 2.txt 12345678 tiantian gaoxinma",

"\t : des 49 2.txt 3.txt 12345678 tiantian gaoxinma",

"******************************"

};

INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length);/*以16进制写入文件*/

INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len);/*16进制解码*/

INT32 file_enc(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag);

INT32 file_dec(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag);

void wz_print_help();

INT32 main(INT32 argc,INT8 *argv[])

{

INT8 *FILENAME1,*FILENAME2;

FILE *fp, *fp2;

ULONG8 *key ;

ULONG8 **superkey ;/*n层加密解密密钥*/

ULONG8 n_superkey ;

ULONG32 num;

if ( argc = 5 (atoi(argv[1]) == 39 || atoi(argv[1]) == 49 ) )

{

n_superkey = argc - 4 ;

superkey = ( INT8 **)calloc(1, n_superkey*sizeof( void *) ) ;

for ( num = 0 ; num n_superkey ; num++)

{

superkey[num] = argv[4+num] ;

}

}

else if ( argc == 6 (atoi(argv[1]) == 13 || atoi(argv[1]) == 23 ) (atoi(argv[5])) 0)

{

}

else if ( argc == 5 ( atoi(argv[1]) == 1 || atoi(argv[1]) == 2 ))

{

}

else

{

wz_print_help();

return FAIL;

}

FILENAME1 = argv[2];

FILENAME2 = argv[3];

if ((fp= fopen(FILENAME1,"rb")) == NULL || (fp2 = fopen(FILENAME2,"wb"))==NULL)

{

printf("Can't open file\n");

return FAIL;

}

key = argv[4] ;

switch( atoi(argv[1] ))

{

case 1: /*加密*/

file_enc(fp,fp2,key,0, NULL,0, DESONE);

printf("\n \tDES 一层加密完毕,密文存于%s文件\n",FILENAME2);

break;

case 2:

file_dec(fp,fp2,key,0, NULL, 0,DESONE);

printf("\n \tDES 一层解密完毕,密文存于%s文件\n",FILENAME2);

break;

case 13:

file_enc(fp,fp2,key,atoi(argv[5]),NULL,0,DESTHREE);

printf("\n \tDES %u层单密钥加密完毕,密文存于%s文件\n",atoi(argv[5]),FILENAME2);

break;

case 23:

file_dec(fp,fp2,key,atoi(argv[5]),NULL,0,DESTHREE);

printf("\n \tDES %u层单密钥解密完毕,密文存于%s文件\n",atoi(argv[5]),FILENAME2);

break;

case 39:

file_enc(fp,fp2,NULL,0,superkey,n_superkey,DESMULTI);

printf("\n \tDES 多密钥加密完毕,密文存于%s文件\n",FILENAME2);

free(superkey);

superkey = NULL;

break;

case 49:

file_dec(fp,fp2,NULL,0,superkey,n_superkey,DESMULTI);

printf("\n \tDES 多密钥加密完毕,密文存于%s文件\n",FILENAME2);

free(superkey);

superkey = NULL;

break;

default:

printf("请选择是加密|解密 plese choose encrypt|deencrypt\n");

break;

}

fclose(fp);

fclose(fp2);

return SUCCESS;

}

void wz_print_help()

{

INT32 i ;

printf("\t");

for ( i = 0 ; i 22 ; i++)

{

printf("%c ",5);

}

printf("\n");

for( i = 0 ; i WZ_COMMEND_NUM ; i++)

{

printf("\t%c\t%s %c\n",5,WZ_Commend_Help[i],5);

}

printf("\t");

for ( i = 0 ; i 22 ; i++)

{

printf("%c ",5);

}

printf("\n");

for( i = 0 ; i WZUSEHELPNUM ; i++)

{

printf("\t%s\n",WZ_USE_HELP[i]);

}

return ;

}

INT32 file_enc(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag)

{

INT32 filelen = 0,readlen = 0,writelen = 0;

ULONG32 totalfilelen = 0 ;/*统计实际的文件的长度*/

ULONG8 readbuf[READFILESIZE] = { 0 };

filelen = fread( readbuf, sizeof( INT8 ), READFILESIZE, readfile );

while( filelen == READFILESIZE )

{

totalfilelen += READFILESIZE;

switch(flag)

{

case DESONE:

des( readbuf,key,READFILESIZE);

break;

case DESTHREE:

des3( readbuf, key ,keynum,READFILESIZE);

break;

case DESMULTI:

desN( readbuf, superkey ,n_superkey,READFILESIZE);

break;

}

hextofile( readbuf, writefile, READFILESIZE );/*以16进制形式写入文件*/

memset(readbuf,0,READFILESIZE);

filelen = fread( readbuf, sizeof( INT8 ), READFILESIZE, readfile );

}

/*这是从文件中读出的最后一批数据,长度可能会等于0,所以要先判断*/

if ( filelen 0 )

{

/*如果从文件中读出的长度不等于0,那么肯定有8个字节以上的空间

文件长度存在最后8个字节中*/

totalfilelen += filelen;

memcpy( readbuf[READFILESIZE-8], (ULONG8*)totalfilelen,4);

switch(flag)

{

case DESONE:

des( readbuf,key,READFILESIZE);

break;

case DESTHREE:

des3( readbuf, key ,keynum,READFILESIZE);

break;

case DESMULTI:

desN( readbuf, superkey ,n_superkey,READFILESIZE);

break;

}

hextofile( readbuf, writefile,READFILESIZE );/*以16进制形式写入文件*/

memset(readbuf,0 ,READFILESIZE);

}

else /*filelen == 0*/

{

memcpy( readbuf[0], (ULONG8*)totalfilelen,4);

switch(flag)

{

case DESONE:

des( readbuf,key,8);

break;

case DESTHREE:

des3( readbuf, key ,keynum,8);

break;

case DESMULTI:

desN( readbuf, superkey ,n_superkey,8);

break;

}

hextofile( readbuf, writefile, 8);/*以16进制形式写入文件*/

}

return SUCCESS;

}

INT32 file_dec(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag)

{

INT32 filelen = 0,readlen = 0,writelen = 0;

ULONG32 totalfilelen = 0 ;/*统计实际的文件的长度*/

INT32 num = 0;

ULONG8 readbuf[READFILESIZE] = { 0 };

ULONG8 sendbuf[READFILESIZE*2] = { 0 };

fseek(readfile,-16,SEEK_END);/*最后16个字节的表示文件长度的空间*/

filelen = fread( sendbuf, sizeof( INT8 ), 16, readfile );

encodehex( readbuf,sendbuf,8);

switch(flag)

{

case DESONE:

Ddes( readbuf,key,8);

break;

case DESTHREE:

Ddes3( readbuf, key ,keynum,8);

break;

case DESMULTI:

DdesN( readbuf, superkey ,n_superkey,8);

break;

}

/*解密*/

memcpy((ULONG8*)totalfilelen, readbuf[0],4);/*得到文件总长*/

memset(readbuf,0 ,8);

memset(sendbuf,0 ,16);

num = totalfilelen/READFILESIZE;/*有几个READFILESIZE组*/

totalfilelen %= READFILESIZE;

fseek(readfile,0,SEEK_SET);/*跳到文件头*/

while(num--)

{

filelen = fread( sendbuf, sizeof( INT8 ), READFILESIZE*2, readfile );

encodehex( readbuf,sendbuf,READFILESIZE);

switch(flag)

{

case DESONE:

Ddes( readbuf,key,READFILESIZE);

break;

case DESTHREE:

Ddes3( readbuf, key ,keynum,READFILESIZE);

break;

case DESMULTI:

DdesN( readbuf, superkey ,n_superkey,READFILESIZE);

break;

}

writelen = fwrite(readbuf, sizeof( INT8 ), READFILESIZE, writefile);

memset(readbuf,0 ,READFILESIZE);

memset(sendbuf,0 ,READFILESIZE*2);

}

if ( totalfilelen 0 )/*最后一块有多余的元素*/

{

filelen = fread( sendbuf, sizeof( INT8 ), READFILESIZE*2, readfile );

encodehex( readbuf,sendbuf,READFILESIZE);

switch(flag)

{

case DESONE:

Ddes( readbuf,key,READFILESIZE);

break;

case DESTHREE:

Ddes3( readbuf, key ,keynum,READFILESIZE);

break;

case DESMULTI:

DdesN( readbuf, superkey ,n_superkey,READFILESIZE);

break;

}

writelen = fwrite(readbuf, sizeof( INT8 ), totalfilelen, writefile);

memset(readbuf,0 ,READFILESIZE);

memset(sendbuf,0 ,READFILESIZE*2);

}

return SUCCESS;

}

INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length)

{

ULONG32 writelen = 0 ;

/*以16进制形式写入文件*/

while( writelen length)

{

if(buf[writelen] == 0)

{

fprintf( writefile, "%x", 0 );

fprintf( writefile, "%x", 0 );

}

else if (buf[writelen] 0x10)

{

fprintf( writefile, "%x", 0 );

fprintf( writefile, "%x", buf[writelen] );

}

else

{

fprintf( writefile, "%x", buf[writelen] );

}

writelen++;

}

return SUCCESS;

}

INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len)

{

ULONG8 *readfirst = frombuf ;

ULONG8 *readend = frombuf[1] ;

INT8 *s;

ULONG8 y[2] ;

ULONG32 i;

for ( i = 0 ; i len ; i++)

{

y[0] = *readfirst ;

y[1] = *readend ;

readfirst += 2 ;

readend += 2 ;

tobuf[i] = (ULONG8)strtol((INT8*)y, s, 16);

}

return SUCCESS;

}