内容碰高如下:
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)))
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)