⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 DES完全自己实现!能对输入字符串或者选定实现CBC
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <windows.h>
#pragma hdrstop


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
String fileopen="",filesave="";
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void IpPer(BOOL *p,BOOL *l,BOOL *r);      //64位明文分成两部分
void pc1(BOOL *key,BOOL *c,BOOL *d);
void move(BOOL *c,BOOL *d,int len);       //循环左移产生子密钥
void pc2(BOOL *key_sub,BOOL *c,BOOL *d);
void expand(BOOL *r_expand,BOOL *r,BOOL *key_sub);
void s_box(BOOL *r,BOOL *r_expand);
void p_box(BOOL *r);
void ip_f(BOOL *crypt,BOOL *l,BOOL *r);
void en_decrypt(BOOL *text,BOOL *key,char ch);
void getsubkey(BOOL *key,BOOL key_sub[][48]);
void btbit(BOOL *out,BYTE * in,int len);
void btbyte(BYTE *out,BOOL *in,int ien);
void xor(BOOL *out,BOOL *in,int len);
void iv_keychange(BOOL *key,BOOL *iv,BYTE *key_in,BYTE *iv_in);   //初始iv和用户密码转换为64位二进制
//---------------------------------------------------------------------------
void IpPer(BOOL *p,BOOL *l,BOOL *r)
{
        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};
        int i;
        for(i=0;i<32;i++)
        {
                l[i]=p[ip[i]-1];
                r[i]=p[ip[i+32]-1];
        }
}
//---------------------------------------------------------------------------
void pc1(BOOL *key,BOOL *c,BOOL *d)
{
        int pc1[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 i;
        for(int i=0;i<28;i++)
        {
                c[i]=key[pc1[i]-1];
                d[i]=key[pc1[i+28]-1];
        }
}
//---------------------------------------------------------------------------
void move(BOOL *c,BOOL *d,int len)
{
        int i;
        BOOL tmp1,tmp2,tmp3,tmp4;
        if(len==1)
        {
                tmp1=c[0];
                tmp2=d[0];
                for(i=0;i<27;i++)
                {
                        c[i]=c[i+1];
                        d[i]=d[i+1];
                }
                c[i]=tmp1;
                d[i]=tmp2;
        }
        else if(len==2)
        {
                tmp1=c[0];
                tmp2=c[1];
                tmp3=d[0];
                tmp4=d[1];
                for(i=0;i<26;i++)
                {
                        c[i]=c[i+2];
                        d[i]=d[i+2];
                }
                c[i]=tmp1;
                d[i++]=tmp3;
                c[i]=tmp2;
                d[i]=tmp4;
        }
}
//---------------------------------------------------------------------------
void pc2(BOOL *key_sub,BOOL *c,BOOL *d)
{
        int pc2[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};
        for(int i=0;i<48;i++)
        {
                if(pc2[i]>28)
                        key_sub[i]=d[pc2[i]-28-1];
                else if(pc2[i]<=28)
                        key_sub[i]=c[pc2[i]-1];
        }
}
//---------------------------------------------------------------------------
void expand(BOOL *r_expand,BOOL *r,BOOL *key_sub)
{
        int expand[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 i;
        for(i=0;i<48;i++)
        {
                r_expand[i]=r[expand[i]-1];
        }
        xor(r_expand,key_sub,48);
}
//---------------------------------------------------------------------------
void s_box(BOOL *r,BOOL *r_expand)
{
        BOOL s[8][4][16]={{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},
                {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},
                {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},
                {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},
                {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},
                {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},
                {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},
                {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 i,j,k,count,tmp;
        for(i=0;i<8;i++)
        {
                tmp=s[i][r_expand[6*i+5]+r_expand[6*i]*2][r_expand[6*i+1]*8+r_expand[6*i+2]*4+r_expand[6*i+3]*2+r_expand[6*i+4]];
                for(count=3;count>=0;count--)
                {
                        r[4*i+count]=tmp%2;
                        tmp=tmp/2;
                }
        }
}
//---------------------------------------------------------------------------
void p_box(BOOL *r)
{
        BOOL p[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};
        int i;
        BOOL tmp[32];
        for(i=0;i<32;i++)
        {
                tmp[i]=r[i];
        }
        for(i=0;i<32;i++)
        {
                r[i]=tmp[p[i]-1];
        }
}

//---------------------------------------------------------------------------
void ip_f(BOOL *crypt,BOOL *l,BOOL *r)
{
        BOOL ip_f[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};
        int i;
        for(i=0;i<64;i++)
        {
                if(ip_f[i]>32)
                        crypt[i]=l[ip_f[i]-33];
                else if(ip_f[i]<=32)
                        crypt[i]=r[ip_f[i]-1];
        }



}
//---------------------------------------------------------------------------
void en_decrypt(BOOL *text,BOOL *key,char ch)
{
        BOOL l[32],r[32],key_sub[16][48],r_expand[48],tmp,l_tmp[32];
        int i,j,k;

        IpPer(text,l,r);
        getsubkey(key,key_sub);
        for(i=0;i<16;i++)
        {
                for(j=0;j<32;j++)
                {
                        l_tmp[j]=l[j];           //(ch=='e'||'E')?i:15-i
                        l[j]=r[j];
                }
                expand(r_expand,r,key_sub[(ch=='e'||ch=='E')?i:15-i]);
                s_box(r,r_expand);
                p_box(r);
                xor(r,l_tmp,32);
        }
        ip_f(text,l,r);

}
//---------------------------------------------------------------------------
void getsubkey(BOOL *key,BOOL key_sub[][48])
{
        BOOL c[28],d[28];
        int len[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
        pc1(key,c,d);
        int i;
        for(i=0;i<16;i++)
        {
                move(c,d,len[i]);
                pc2(key_sub[i],c,d);
        }
}
//---------------------------------------------------------------------------
void btbit(BOOL *out,BYTE * in,int len)
{
        int i;
        for(i=0;i<len;i++)
                out[i]=(in[i/8]>>(7-i%8))&1;
}
//---------------------------------------------------------------------------
void btbyte(BYTE *out,BOOL *in,int len)
{
        int i,j,tmp;
        for(i=0;i<len/8;i++)
        {
                tmp=1;
                out[i]=0;
                for(j=7;j>=0;j--)
                {
                        out[i]+=in[8*i+j]*tmp;
                        tmp*=2;
                }
        }
}
//---------------------------------------------------------------------------
void xor(BOOL *out,BOOL *in,int len)
{
        for(int i=0;i<len;i++)
        {
                out[i]=out[i]^in[i];
        }

}
//---------------------------------------------------------------------------
void iv_keychange(BOOL *key,BOOL *iv,BYTE *key_in,BYTE *iv_in)
{
        DWORD i;
        BYTE tmp_key[8],tmp_iv[8];
        BYTE ed1[17],ed2[17];
        strcpy(ed1,key_in);
        strcpy(ed2,iv_in);
        for(i=0;i<16;i++)
        {
                if(ed1[i]>='0'&&ed1[i]<='9')
                        ed1[i]=ed1[i]-48;
                else if(ed1[i]>='a'&&ed1[i]<='z')
                        ed1[i]=ed1[i]-87;
                else if(ed1[i]>='A'&&ed1[i]<='Z')
                        ed1[i]=ed1[i]-55;
                if(ed2[i]>='0'&&ed2[i]<='9')
                        ed2[i]=ed2[i]-48;
                else if(ed2[i]>='a'&&ed2[i]<='z')
                        ed2[i]=ed2[i]-87;
                else if(ed2[i]>='A'&&ed2[i]<='Z')

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -