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(