#include "memory.h"
#include "stdio.h"
enum {encrypt,decrypt};//ENCRYPT:加密,DECRYPT:解密
void des_run(char out[18],char in[18],bool type=encrypt);
//设置密钥
void des_setkey(const char key[8]);
static void f_func(bool in[32],const bool ki[48]);//f 函数
static void s_func(bool out[32],const bool in[48]);//s 盒代替
static void transform(bool *out, bool *in, const char *table, int len);//变换
static void xor(bool *ina, const bool *inb, int len);//异或
static void rotatel(bool *in, int len, int loop);//循环左移
static void bytetobit(bool *out,const char *in, int bits); //字节组转换成位组
static void bittobyte(char *out, const bool *in, int bits);//位组转换成字节组
//置换 IP 表
const static char ip_table[64]={
//将 58 位换到第 1 位,50 位换到第 2 位...
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};
//逆置换 IP-1 表
const static char ipr_table[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};
//E 位选择表
static const char e_table[48]={
//将数据的右半部分 R 从 32bit 扩展到了 48bit,这个操作改变了位的次序,
//重复了某些位的次序(进行异或运算,或者进行压缩)
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};
//P 换位表
const static char p_table[32]={
//定义 P 盒置换,S 盒替代运算后的 32bit 输出依照 P 盒进行置换
//这里给出了第位移至的位置,如:第 21 位移到了第 4 位,同时 4 位移到了第 31 位处
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};
//pc1 选位表
const static char pc1_table[56]={
57,49,41,33,25,17,9,1,