http://ting.tyblog.com/index.shtml
站点公告
站点日历
<<  < 2011 - 12 >  >>
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
站点信息
用户登陆
最新日志
最新评论
最新留言
群组圈子
友情链接
我的相册
Data Encryption Standard (DES)[ 2006-12-12 13:10:00 | By: Eric ]
/*
*This program is about the DES algorithm.
*Author : Ting
*E-mail:kilvdn@yahoo.com.cn 
*Addr: China Unversity of Gerscience ( WuHan )
*/

#i nclude <stdio.h>
#i nclude <string.h>
int key[64] , tempkey[56] , subkey[16][48] ;           
int choose ;
int zhxz1[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
        };
int zhxz2[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    
        };
       
int shiftleft[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
void ChooseI(){
    for (int i=0; i<56; i++)   
        tempkey[i] = key[zhxz1[i]-1];   
}
void ChooseSubKey( int n ){
    for (int i=0; i<48; i++)
    subkey[n][i]=tempkey[zhxz2[i]-1];
}
void ShiftL( int n ){
    int temp ;
    temp = tempkey[0];
    for ( int i=0; i<27; i++ )
    tempkey[i]=tempkey[i+1];
    tempkey[27]=temp;
    temp = tempkey[28] ;
    for ( int i=28; i<55; i++ )
    tempkey[i]=tempkey[i+1];
    tempkey[55]=temp;
    if (shiftleft[n]==2){
        temp = tempkey[0];
        for ( int i=0; i<27; i++ )
        tempkey[i]=tempkey[i+1];
        tempkey[27]=temp;
        temp = tempkey[28] ;
        for ( int i=28; i<55; i++ )
        tempkey[i]=tempkey[i+1];
        tempkey[55]=temp;   
    }   
}
void MakeSubKey(){
    ChooseI();
    for ( int i=0; i<16; i++){
        ShiftL( i ) ;
        ChooseSubKey( i ) ;
    }   
}
int plaintext[64] , ciphertext[64] , ans[64];
int 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
        };
           
typedef struct{
    int num[32];   
}PlainNum ;
PlainNum l[17],r[17];
int temp[48],s_temp[32];
int expanper[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
        };
int s_box[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
};
int permuted[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
        };
/*初始转换IP*/           
void Init_Per(){
    for ( int i=0;i<32;i++)
        l[0].num[i]=plaintext[ip[i]-1];
    for ( int i=0;i<32;i++)
        r[0].num[i]=plaintext[ip[i+32]-1];
}
void De_Per(){
    for ( int i=0;i<32;i++)
        r[0].num[i]=plaintext[ip[i]-1];
    for ( int i=0;i<32;i++)   
        l[0].num[i]=plaintext[ip[i+32]-1];
}

/*选择运算E(Expansion Permutation)*/
void ExpanPer( int n ){
    for ( int i=0;i<48;i++)
        temp[i]=r[n-1].num[expanper[i]-1];
}
/*置换运算P*/
void Permute(){
    for ( int i=0;i<32;i++)
        temp[i]=s_temp[permuted[i]-1];
}
/*S盒运算SBOX*/
void SBOX(){
    int row , col , svalue;
    for ( int i=0;i<8;i++){
        row=temp[i*6]*2+temp[i*6+5];
        col=temp[i*6+1]*8+temp[i*6+2]*4+temp[i*6+3]*2+temp[i*6+4];
        svalue=s_box[i][row][col];
        s_temp[i*4]=svalue/8 ;
        svalue %= 8;
        s_temp[i*4+1]=svalue/4;
        svalue %= 4;
        s_temp[i*4+2]=svalue/2;
        svalue %= 2;
        s_temp[i*4+3]=svalue ;
    }
}
/*加密函数*/
void EncryFunc( int n ){
    for ( int i=0;i<32;i++)
        l[n].num[i]=r[n-1].num[i];
    for ( int i=0;i<48;i++)
        temp[i]=r[n-1].num[expanper[i]-1];
    for ( int i=0;i<48;i++)
        temp[i] = temp[i]^subkey[n-1][i];
    SBOX();
    Permute();
    for ( int i=0;i<32;i++)
    r[n].num[i] = temp[i]^l[n-1].num[i];       
}
/*解密函数*/
void DecryFunc( int n ){   
    for ( int i=0;i<48;i++)
        temp[i]=l[n-1].num[expanper[i]-1];   
    for ( int i=0;i<48;i++)
        temp[i] = temp[i]^subkey[16-n][i];
    SBOX();
    for ( int i=0;i<32;i++)
        temp[i]=s_temp[permuted[i]-1];   
    for ( int i=0;i<32;i++)
        r[n].num[i]=l[n-1].num[i];
    for ( int i=0;i<32;i++)
        l[n].num[i] = temp[i]^r[n-1].num[i];   
}
/*逆初始置换IP-1*/
void IP_r(){
    for ( int i=0;i<32;i++)
        ans[i]=r[16].num[i];
    for ( int i=0;i<32;i++)
        ans[32+i]=l[16].num[i];
    for ( int i=0;i<64;i++)
        ciphertext[ip[i]-1]=ans[i];
}
void DIP_r(){
    for ( int i=0;i<32;i++)
        ans[i]=l[16].num[i];
    for ( int i=0;i<32;i++)
        ans[32+i]=r[16].num[i];
    for ( int i=0;i<64;i++)
        ciphertext[ip[i]-1]=ans[i];
}
/*加密过程*/
void Encryption(){
    Init_Per( ) ;
    for (int i=1;i<=16;i++)
    EncryFunc( i ) ;   
    IP_r();   
    printf("得出的密文为: ");   
    for ( int i=0;i<64;i++)
    printf("%d",ciphertext[i]);
    printf(" ");
}
/*解密过程*/
void Decryption(){
    De_Per();
    for (int i=1;i<=16;i++)
    DecryFunc( i ) ;
    DIP_r();
    printf("得出的明文为: ");
    for ( int i=0;i<64;i++)
    printf("%d",ciphertext[i]);
    printf(" ");   
}
char plain[100] , des_key[100];
int len_plain , len_key ;
int main(){
    while (1){
        printf("请选择 1 加密 2 解密: ");       
        scanf("%d",&choose);
        switch (choose){
            case 1 : printf("请输入明文: ");break;
            case 2 : printf("请输入密文: ");break;   
        }
       
        scanf("%s",plain);
        printf("请输入密钥: ");
        scanf("%s",des_key);
        for ( int i=0;i<64;i++){
            plaintext[i]=plain[i]-'0';
            key[i]=des_key[i]-'0';
        }                   
        MakeSubKey();
        switch(choose){
                case 1 : Encryption();break;
                case 2 : Decryption();break;
        }
    }
    return 0 ;   
}
/*
明文:(gZig^ZkZ)0110011101011010011010010110011101011110010110100110101101011010
密钥:([ZWgjVgn)0101101101011010010101110110011101101010010101100110011101101110
密文:1001011101001010111111111011111110000110000000100010110100011111
*/

阅读全文 | 回复(0) | 引用通告 | 编辑
  • 标签:Cryptography DES 
  • 发表评论:

     

    天涯博客欢迎您!