DES加密的C语言实现

DES(Data Encryption Standard)原理:Wikipedia https://en.wikipedia.org/wiki/Data_Encryption_Standard

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define fPath "F:\\Plaintext.txt" //Can't be Chinese

const int num = 16;
const int length = 64;
const int cdlength = 28;
const int keylength = 48;
const int lrlength = 32;

void HexToBinary(int Hex[], int Binary[]);
void BinaryToHex(int Binary[], int Hex[]);
int IntPow(int x, int n);
void GetSubkey(int key[], int Subkey[][keylength]);
void LeftMove(int x[], int y[], int n);
void Replace(int C[], int D[], int key[]);
void Combine(int C[], int D[], int key[]);
void Encrypt(int Plaintext[], int Subkey[][keylength], int Ciphertext[]);
void ReplaceIP(int Plaintext[], int L[], int R[]);
void ArrayCopy(int x[], int y[]);
void EncryptCore(int output[], int L[], int R[], int K[]);
void InverseReplaceIP(int output[], int L[], int R[]);
void ESelect(int output[], int x[]);
void Sbox(int x[], int y[]);
void Reorder(int x[], int output[]);
void Decrypt(int Ciphertext[], int Subkey[][keylength], int DePlaintext[]);
void Display(int x[], int n);
void DecToBinary(int x[], int n);
int AddToArray(int Cipher[], int input[], int flag);

int main()
{
    int i, Key[num], result[num], j, k, len, pos, s;
    int OriginKey[length], OriginPlaintext[length], OriginCipher[length], Ciphertext[length];
    int Subkey[num][keylength], Cipher[10000], flag = 0;

    char input[10000];
    FILE *fp = NULL;

    if((fp = fopen(fPath, "r")) == NULL)
    {
        printf("Can't open file!\n");
        exit(1);
    }

    for(i = 0; (input[i] = fgetc(fp)) != EOF; i++) {}

    fclose(fp);

    len = i;
    int cycle = ceil(len / 8.0);
    int plain[cycle * 64], temp[len], cmd[8];
    pos = 0;

    for(i = 0; i < len; i++)
    {
        temp[i] = (int)(input[i]);
        DecToBinary(cmd, temp[i]);

        for(j = 0; j < 8; j++, pos++)
        {
            plain[pos] = cmd[j];
        }
    }

    for(; pos < cycle * 64; pos++)
    {
        plain[pos] = 0;
    }

    printf("Enter your 16 bits hexadecimal key:\n");

    for(i = 0; i < num; i++)
    {
        scanf("%x", &Key[i]);
    }

    HexToBinary(Key, OriginKey);
    GetSubkey(OriginKey, Subkey);

    //Encrypt
    printf("\nThe Ciphertext is:\n");

    for(i = 0; i < cycle; i++)
    {
        for(j = 0; j < 64; j++)
        {
            OriginPlaintext[j] = plain[i * 64 + j];
        }

        Encrypt(OriginPlaintext, Subkey, Ciphertext);
        flag = AddToArray(Cipher, Ciphertext, flag);

        BinaryToHex(Ciphertext, result);

        for(k = 0; k < 16; k++)
        {
            printf("%x", result[k]);
        }
    }

    //Decrypt
    printf("\n\nThe Plantext is:\n");

    for(i = 0; i < cycle; i++)
    {
        for(j = 0; j < 64; j++)
        {
            Ciphertext[j] = Cipher[i * 64 + j];
        }

        Decrypt(Ciphertext, Subkey, OriginCipher);

        for(k = 0; k < 8; k++)
        {
            for(s = 0; s < 8; s++)
            {
                cmd[s] = OriginCipher[k * 8 + s];
            }

            if(BinaryToDec(cmd) != 0)
            {
                printf("%c", BinaryToDec(cmd));
            }
        }
    }

    printf("\n");
    return 0;
}

/* Add Ciphertext to the Array and return the position */
int AddToArray(int Cipher[], int input[], int flag)
{
    int i;

    for(i = 0; i < 64; i++, flag++)
    {
        Cipher[flag] = input[i];
    }

    return flag;
}

/* Binary to Dec */
int BinaryToDec(int x[])
{
    int i, result = 0;

    for(i = 0; i < 8; i++)
    {
        if(x[i] == 1)
        {
            result += IntPow(2, 7 - i);
        }
    }

    return result;
}

/* Dec to Binary */
void DecToBinary(int x[], int n)
{
    int i, num = n;
    x[0] = 0;

    for(i = 1; i < 8; i++)
    {
        if(num >= IntPow(2, 8 - i - 1))
        {
            x[i] = 1;
            num -= IntPow(2, 8 - i - 1);
        }
        else
        {
            x[i] = 0;
        }
    }
}

/* x^n */
int IntPow(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值