c语言实现DES算法的密钥生成算法

直接上源代码

要求是输入是密钥是十六位数,字母要大写

#include<stdio.h>

int main()
{
    int i,t,j=0;
    char key[16];    //初始输入
    int key1[64];    
    int key2[56];
    int key3[48];
    int c[28],c1[28];        //左右28位密钥
    int d[28],d1[28];
    int change1[28] = {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};    //置换数组
    int change2[28] = {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 change11[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 yiwei[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};        
    for(i = 0; i < 16; i++)        //输入密钥
    {
        scanf("%c",&key[i]);
    }
    for(i = 0; i < 16;i ++)//十六进制转换为01字符串
    {    
        if(key[i] == '0')
        {
            key1[j] = 0;
            key1[j+1] = 0;
            key1[j+2] = 0;
            key1[j+3] = 0;
        }
        if(key[i] == '1')
        {
            key1[j] = 0;
            key1[j+1] = 0;
            key1[j+2] = 0;
            key1[j+3] = 1;
        }
        if(key[i] == '2')
        {
            key1[j] = 0;
            key1[j+1] = 0;
            key1[j+2] = 1;
            key1[j+3] = 0;
        }
        if(key[i] == '3')
        {
            key1[j] = 0;
            key1[j+1] = 0;
            key1[j+2] = 1;
            key1[j+3] = 1;
        }
        if(key[i] == '4')
        {
            key1[j] = 0;
            key1[j+1] = 1;
            key1[j+2] = 0;
            key1[j+3] = 0;
        }
        if(key[i] == '5')
        {
            key1[j] = 0;
            key1[j+1] = 1;
            key1[j+2] = 0;
            key1[j+3] = 1;
        }
        if(key[i] == '6')
        {
            key1[j] = 0;
            key1[j+1] = 1;
            key1[j+2] = 1;
            key1[j+3] = 0;
        }
        if(key[i] == '7')
        {
            key1[j] = 0;
            key1[j+1] = 1;
            key1[j+2] = 1;
            key1[j+3] = 1;
        }
        if(key[i] == '8')
        {
            key1[j] = 1;
            key1[j+1] = 0;
            key1[j+2] = 0;
            key1[j+3] = 0;
        }
        if(key[i] == '9')
        {
            key1[j] = 1;
            key1[j+1] = 0;
            key1[j+2] = 0;
            key1[j+3] = 1;
        }
        if(key[i] == 'A')
        {
            key1[j] = 1;
            key1[j+1] = 0;
            key1[j+2] = 1;
            key1[j+3] = 0;
        }
        if(key[i] == 'B')
        {
            key1[j] = 1;
            key1[j+1] = 0;
            key1[j+2] = 1;
            key1[j+3] = 1;
        }
        if(key[i] == 'C')
        {
            key1[j] = 1;
            key1[j+1] = 1;
            key1[j+2] = 0;
            key1[j+3] = 0;
        }
        if(key[i] == 'D')
        {
            key1[j] = 1;
            key1[j+1] = 1;
            key1[j+2] = 0;
            key1[j+3] = 1;
        }
        if(key[i] == 'E')
        {
            key1[j] = 1;
            key1[j+1] = 1;
            key1[j+2] = 1;
            key1[j+3] = 0;
        }
        if(key[i] == 'F')
        {
            key1[j] = 1;
            key1[j+1] = 1;
            key1[j+2] = 1;
            key1[j+3] = 1;
        }
        j = j + 4; 
    }
    printf("\n");
    for(i = 0; i < 28; i++)        //密钥置换选择1,
    {
        j = change1[i];
        c[i] = key1[j - 1];
    }
    for(i = 0; i < 28; i++)    
    {
        j = change2[i];
        d[i] = key1[j - 1];
    }

    for(t = 0 ; t < 16;t++)            //16次循环
    {

        j = yiwei[t];
        for(i = 0; i < 28 ;i++)        //循环移位
        {
            
            if(j==1)
            {
                c1[i] = c[i+1];
                c1[27] = c[0];
                d1[i] = d[i+1];
                d1[27] = d[0];
            }
            else
            {
                c1[i] = c[i+2];
                c1[26] = c[0];
                c1[27] = c[1];
                d1[i] = d[i+2];
                d1[26] = d[0];
                d1[27] = d[1];
            }
        }
        for(i = 0; i < 48; i++)        //置换选择2
        {
            j = change11[i];
            if(j <= 28)
                key3[i] = c1[j - 1];
            else
                key3[i] = d1[j - 29];
        }
        for(i = 0; i < 28; i++)        //循环复原
        {
            c[i] = c1[i];
            d[i] = d1[i];
        }

        printf("第%d个子密钥为:\n",t+1);
        for(i = 0; i < 48; i++)
        {
            printf("%d",key3[i]);
        }
        printf("\n");
    }
    return 0;
}

实验结果:

猜你喜欢

转载自blog.csdn.net/qq_38115310/article/details/82965304