谁可以给我一个c语言写的DES代码,要求(输入任意一个字符串,可以得到相应的密文)

谁可以给我一个c语言写的DES代码,要求(输入任意一个字符串,可以得到相应的密文),第1张

首先新建头文件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 binarycall 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=0i<8i++)

scanf("%c",&str[i])

getchar()

for(i=0i<8i++)

strkey[i]=str[i]

printf("\n输入明文的十六进制为:\n")

for(i=0i<8i++)

printf("%10x",strkey[i])

printf("\n请输入密钥(8个字符):\n")

for(i=0i<8i++)

scanf("%c",&keychar[i])

for(i=0i<8i++)

key2[i]=keychar[i]

getchar()

// printf("%c",keychar[i])

Encode(strkey,key2)

printf("\n加密后十六进制密文是:\n")

for(i=0i<8i++)

printf("%10x",strkey[i])

printf("\n\n清输入解密密码\n")

for(i=0i<8i++)

scanf("%c",&keychar[i])

for(i=0i<8i++)

key2[i]=keychar[i]

Decode(strkey,key2)

for(i=0i<8i++)

printf("%10x",strkey[i])

for(i=0i<8i++)

str[i]=strkey[i]

printf("\n明文为:\t")

for(i=0i<8i++)

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=0i<56i++)

midkey2[i]=midkey[PC1[i]-1]

for(i=0i<16i++)

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=0i<8i++){

j=0

while(keychar[i]!=0){

trans[j]=keychar[i]%2

keychar[i]=keychar[i]/2

j++

}

for(k=jk<8k++)trans[k]=0

for(k=0k<8k++)

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=0i<26i++){

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=0i<27i++){

midkey2[i]=midkey2[i+1]

midkey2[i+28]=midkey2[i+29]

}

midkey2[27]=temp[0]midkey2[55]=temp[2]

}

for(i=0i<48i++)

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=0i<4i++){

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=0j<8j++)

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=0j<8j++)rData[rint++]=temp[7-j]

}

for(i=0i<32i++){

data[i]=lData[i]

data[i+32]=rData[i]

}

for(i=0i<32i++){

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=0i<48i++){

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=0i<48i++)

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=0i<48i+=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=0i<32i++)

temp[i]=rData[i]

for(i=0i<32i++)

rData[i]=temp[P[i]-1]

}

void FillBin(int *rData,int n,int s){ // data to binarycall by S-Diagram change function

int temp[4],i

for(i=0i<4i++){

temp[i]=s%2

s=s/2

}

for(i=0i<4i++)

rData[n*4+i]=temp[3-i]

}

void DecodeData(int *str,int *lData,int *rData){//DecodeData from binary

int iint a,bint data[64]

a=0,b=0

for(i=0i<32i++){

data[i]=lData[i]

data[i+32]=rData[i]

}

for(i=0i<32i++){

lData[i]=data[IP2[i]-1]

rData[i]=data[IP2[i+32]-1]

}

for(i=0i<32i++){

a=(lData[i]&0x1)+(a<<1)

b=(rData[i]&0x1)+(b<<1)

if((i+1)%8==0){

str[i/8]=aa=0//printf("%d",i/8)

str[i/8+4]=bb=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=0i<16i++){

for(j=0j<32j++)

temp[j]=rData[j]

F(rData,key[i])

for(j=0j<32j++){

rData[j]=rData[j]^lData[j]

}

for(j=0j<32j++)

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=0i<16i++){

for(j=0j<32j++)

temp[j]=rData[j]

F(rData,key[15-i])

for(j=0j<32j++){

rData[j]=rData[j]^lData[j]

}

for(j=0j<32j++){

lData[j]=temp[j]

}

}

DecodeData(str,rData,lData)

}

OK了

如果还有问题

给我发站内信

//读取缓冲区的指散嫌明定位.

#define GET_BIT(p_array, bit_index) ((p_array[(bit_index) >>3] >>(7 - ((bit_index) &0x07))) &0x01)

//设置缓冲区的指定位.

#define SET_BIT(p_array,bit_index,bit_val) if(1==(bit_val))\

{p_array[(bit_index)>>3]|=0x01 <<(7 - ((bit_index)&0x07))}else {p_array[(bit_index)>>3]&=~(0x01<<(7 - ((bit_index)&0x07)))}

//加解密标识,这两个标识涉及到对表的读取位置,

//必须保证DES_ENCRYPT = 0 DES_DECRYPT = 1

CONST uint8 Table_IP[64] =

{

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

}

// 末置换

CONST uint8 Table_InverseIP[64] =

{

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

}

// 扩展置换

CONST uint8 Table_E[48] =

{

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

}

// 密钥初始置换

CONST uint8 Table_PC1[56] = {

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

}

//冲告 左右者滚移运算

CONST signed char Table_Move[2][16] =

{

//加密左移

{1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1},

//解密右移

{0, -1, -2, -2, -2, -2, -2, -2, -1, -2, -2, -2, -2, -2, -2, -1}

}

// 密钥压缩置换

CONST uint8 Table_PC2[48] =

{

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

}

// S盒

CONST uint8 Table_SBOX[8][4][16] =

{

// 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

}

// P盒置换

CONST uint8 Table_P[32] =

{

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

}

//对两块大小相同的内存区进行异或

//异或结果保存到第一块内存

//uint8 * p_buf_1 内存区1

//const uint8 * p_buf_2 内存区2

//uint8 bytes 内存区大小(单位:字节)

void Xor(uint8 * p_buf_1, uint8 * p_buf_2, uint8 bytes)

{

while(bytes >0)

{

bytes--

p_buf_1[bytes] ^= p_buf_2[bytes]

}

}

//将缓冲区从第bit_start位到第bit_end进行循环左移

//offset只能是1,2

//本段代码还可以优化。

void move_left(uint8 * p_input, uint8 bit_start, uint8 bit_end, uint8 offset)

{

uint8 IDATA b_val = 0

uint8 IDATA b_tmp1 = 0

uint8 IDATA b_tmp2 = 0

//读取bit_start位

b_tmp1 = GET_BIT(p_input, bit_start)

b_tmp2 = GET_BIT(p_input, bit_start + 1)

//循环左移offset位

for(bit_start <= (bit_end - offset)bit_start++)

{

b_val = GET_BIT(p_input, bit_start + offset)

SET_BIT(p_input, bit_start, b_val)

}

//将bit_start开始的offset位移到bit_end后头来

if (1 == offset)

{

SET_BIT(p_input, bit_end, b_tmp1)

}

else

{

SET_BIT(p_input, bit_end, b_tmp2)

SET_BIT(p_input, bit_end - 1, b_tmp1)

}

}

//将缓冲区从第bit_start位到第bit_end进行循环右移

//offset只能是1,2

//本段代码在性能上还可以优化。

void move_right(uint8 * p_input, uint8 bit_start, uint8 bit_end, uint8 offset)

{

uint8 IDATA b_val = 0

uint8 IDATA b_tmp1 = 0

uint8 IDATA b_tmp2 = 0

//读取bit_end位

b_tmp1 = GET_BIT(p_input, bit_end)

b_tmp2 = GET_BIT(p_input, bit_end - 1)

//循环左移offset位

for(bit_end >= (bit_start + offset)bit_end--)

{

b_val = GET_BIT(p_input, bit_end - offset)

SET_BIT(p_input, bit_end, b_val)

}

//将bit_end倒数的offset位移到bit_start来

if (1 == offset)

{

SET_BIT(p_input, bit_start, b_tmp1)

}

else

{

SET_BIT(p_input, bit_start, b_tmp2)

SET_BIT(p_input, bit_start + 1, b_tmp1)

}

}

//缓冲区移位

//offset大于0时左移

//offset小于0时右移

void move_bits(uint8 * p_input, uint8 bit_start, uint8 bit_end, char offset)

{

if(0 <offset) //左移

{

move_left(p_input, bit_start, bit_end, offset)

}

else if(0 >offset) //右移

{

move_right(p_input, bit_start, bit_end, -offset)

}

}

//通用置换函数, bits <= 64

//p_input与p_output不能指向同一个地址,否则置换会出错。

void Permutation(uint8 * p_input, uint8 * p_output, uint8 * Table, uint8 bits)

{

uint8 IDATA b_val = FALSE

uint8 IDATA bit_index = 0

for(bit_index = 0bit_index <bitsbit_index++)

{

b_val = GET_BIT(p_input, Table[bit_index] - 1)

SET_BIT(p_output, bit_index, b_val)

}

}

//获取从bit_s为起始的第1, 6 位组成行

uint8 S_GetLine(uint8 * p_data_ext, uint8 bit_s)

{

return (GET_BIT(p_data_ext, bit_s + 0) <<1) + GET_BIT(p_data_ext, bit_s + 5)

}

//获取从bit_s为起始的第2,3,4,5位组成列

uint8 S_GetRow(uint8 * p_data_ext, uint8 bit_s)

{

uint8 IDATA row

//2,3,4,5位组成列

row = GET_BIT(p_data_ext, bit_s + 1)

row <<= 1

row += GET_BIT(p_data_ext, bit_s + 2)

row <<= 1

row += GET_BIT(p_data_ext, bit_s + 3)

row <<= 1

row += GET_BIT(p_data_ext, bit_s + 4)

return row

}

///////////////////////////////////////////////////////////////

// 函 数 名 : des

// 函数功能 : DES加解密

// 处理过程 : 根据标准的DES加密算法用输入的64位密钥对64位密文进行加/解密

// 并将加/解密结果存储到p_output里

// 返 回 值 :

// 参数说明 : const char * p_data 输入, 加密时输入明文, 解密时输入密文, 64位(8字节)

// const char * p_key 输入, 密钥, 64位(8字节)

// char * p_output 输出, 加密时输出密文, 解密时输入明文, 64位(8字节)

// uint8 mode DES_ENCRYPT 加密 DES_DECRYPT 解密

///////////////////////////////////////////////////////////////

void des( unsigned char * p_data, unsigned char * p_key, unsigned char * p_output, unsigned char *InVet,DES_MODE mode)

{

uint8 IDATA loop = 0//16轮运算的循环计数器

uint8 XDATA key_tmp[8] //密钥运算时存储中间结果

uint8 XDATA sub_key[6] //用于存储子密钥

uint8 * p_left

uint8 * p_right

uint8 XDATA p_right_ext[8] //R[i]经过扩展置换生成的48位数据(6字节), 及最终结果的存储

uint8 XDATA p_right_s[4]//经过S_BOX置换后的32位数据(4字节)

uint8 IDATA s_loop = 0 //S_BOX置换的循环计数器

//CBC

for(loop = 0loop <8loop++) p_data[loop]^=InVet[loop]

//密钥第一次缩小换位, 得到一组56位的密钥数据

Permutation(p_key, key_tmp, Table_PC1, 56)

//明文初始化置换

Permutation(p_data, p_output, Table_IP, 64)

p_left = p_output//L0

p_right = &p_output[4]//R0

for(loop = 0loop <16loop++)

{

//把缩进小后的把这56位分为左28位和右28位,

//对左28位和右28位分别循环左/右移, 得到一组新数据

//加解密 *** 作时只在移位时有差异

move_bits(key_tmp, 0, 27, Table_Move[mode][loop])

move_bits(key_tmp, 28, 55, Table_Move[mode][loop])

//密钥第二次缩小换位,得到一组子48位的子密钥

Permutation(key_tmp, sub_key, Table_PC2, 48)

//R0扩展置换

Permutation(p_right, p_right_ext, Table_E, 48)

//将R0扩展置换后得到的48位数据(6字节)与子密钥进行异或

Xor(p_right_ext, sub_key, 6)

//S_BOX置换

for(s_loop = 0s_loop <4s_loop++)

{

uint8 IDATA s_line = 0

uint8 IDATA s_row = 0

uint8 IDATA s_bit = s_loop * 12

s_line = S_GetLine(p_right_ext, s_bit)

s_row = S_GetRow(p_right_ext, s_bit)

p_right_s[s_loop] = Table_SBOX[s_loop * 2][s_line][s_row]

s_bit += 6

s_line = S_GetLine(p_right_ext, s_bit)

s_row = S_GetRow(p_right_ext, s_bit)

p_right_s[s_loop] <<= 4

p_right_s[s_loop] += Table_SBOX[(s_loop * 2) + 1][s_line][s_row]

}

//P置换

Permutation(p_right_s, p_right_ext, Table_P, 32)

Xor(p_right_ext, p_left, 4)

memcpy(p_left, p_right, 4)

memcpy(p_right, p_right_ext, 4)

}

memcpy(&p_right_ext[4], p_left, 4)

memcpy(p_right_ext, p_right, 4)

//最后再进行一次逆置换, 得到最终加密结果

Permutation(p_right_ext, p_output, Table_InverseIP, 64)

memcpy(InVet,p_output,8)

}

.security.*

import javax.crypto.*

import javax.crypto.spec.SecretKeySpec

public class ThreeDes {

private static final String Algorithm = "DESede"//定义 加密算法,可用 DES,DESede,Blowfish

//keybyte为盯腊加密密钥,长度为24字节凯闭滑

//src为被加密的数据缓冲区(源)

public static byte[] encryptMode(byte[] keybyte, byte[] src) {

try {

//生成密钥

SecretKey deskey = new SecretKeySpec(keybyte, Algorithm)

//态让加密

Cipher c1 = Cipher.getInstance(Algorithm)

c1.init(Cipher.ENCRYPT_MODE, deskey)

return c1.doFinal(src)

} catch (java.security.NoSuchAlgorithmException e1) {

e1.printStackTrace()

} catch (javax.crypto.NoSuchPaddingException e2) {

e2.printStackTrace()

} catch (java.lang.Exception e3) {

e3.printStackTrace()

}

return null

}

//keybyte为加密密钥,长度为24字节

//src为加密后的缓冲区

public static byte[] decryptMode(byte[] keybyte, byte[] src) {

try {

//生成密钥

SecretKey deskey = new SecretKeySpec(keybyte, Algorithm)

//解密

Cipher c1 = Cipher.getInstance(Algorithm)

c1.init(Cipher.DECRYPT_MODE, deskey)

return c1.doFinal(src)

} catch (java.security.NoSuchAlgorithmException e1) {

e1.printStackTrace()

} catch (javax.crypto.NoSuchPaddingException e2) {

e2.printStackTrace()

} catch (java.lang.Exception e3) {

e3.printStackTrace()

}

return null

}

//转换成十六进制字符串

public static String byte2hex(byte[] b) {

String hs=""

String stmp=""

for (int n=0n<b.lengthn++) {

stmp=(java.lang.Integer.toHexString(b[n] &0XFF))

if (stmp.length()==1) hs=hs+"0"+stmp

else hs=hs+stmp

if (n<b.length-1) hs=hs+":"

}

return hs.toUpperCase()

}

public static void main(String[] args)

{

//添加新安全算法,如果用JCE就要把它添加进去

Security.addProvider(new com.sun.crypto.provider.SunJCE())

final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58, (byte)0x88, 0x10, 0x40, 0x38

, 0x28, 0x25, 0x79, 0x51, (byte)0xCB, (byte)0xDD, 0x55, 0x66

, 0x77, 0x29, 0x74, (byte)0x98, 0x30, 0x40, 0x36, (byte)0xE2}//24字节的密钥

String szSrc = "This is a 3DES test. 测试"

System.out.println("加密前的字符串:" + szSrc)

byte[] encoded = encryptMode(keyBytes, szSrc.getBytes())

System.out.println("加密后的字符串:" + new String(encoded))

byte[] srcBytes = decryptMode(keyBytes, encoded)

System.out.println("解密后的字符串:" + (new String(srcBytes)))

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12348978.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存