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

📄 unit1.cpp

📁 DES完全自己实现!能对输入字符串或者选定实现CBC
💻 CPP
📖 第 1 页 / 共 4 页
字号:
                        ed2[i]=ed2[i]-55;
        }
        for(i=0;i<8;i++)
        {
                tmp_key[i]=ed1[2*i]*16+ed1[2*i+1];
                tmp_iv[i]=ed2[2*i]*16+ed2[2*i+1];
        }
        btbit(key,tmp_key,64);
        btbit(iv,tmp_iv,64);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Encrypt1Click(TObject *Sender)
{
        if(Memo1->Text.Length()==0)
        {
                MessageBox(Handle,"请输入十六进制明文!","提示:",MB_OK|MB_ICONEXCLAMATION);
                return;
        }

        int len,len2,i,j,k,pi;
        String str1,str2;
        BYTE crypt[8];
        bool flag=0;
        BYTE *plaintext;

        DWORD start,end;
        DWORD all_len=0;              //计算效率
        double effic;
        start=GetTickCount();

        BOOL key[64];
        BOOL iv[64];
        iv_keychange(key,iv,Edit1->Text.c_str(),Edit2->Text.c_str());
        str1=Memo1->Lines->Text;
        len=str1.Length();
        BYTE *s=(BYTE *)malloc(len+1);
        strcpy(s,str1.c_str());
        s[len]='\0';
        if(len%2==1)
                len2=(len+1)/2;          //计算明文长度
        else
                len2=len/2;

        if(RadioButton1->Checked==true)
        {                                      //CBC模式
                if(len2%8!=0)
                {
                        flag=1;              //0填充
                        pi=8-len2%8;
                        len2=len2+pi;
                }
                for(i=0;i<len;i++)
                {
                        if(s[i]>='0'&&s[i]<='9')
                                s[i]=s[i]-48;
                        else if(s[i]>='a'&&s[i]<='z')
                                s[i]=s[i]-87;
                        else if(s[i]>='A'&&s[i]<='Z')
                                s[i]=s[i]-55;
                }
                plaintext=(BYTE *)malloc(len2);
                all_len=len2;
                memset(plaintext,0,len2);
                for(i=0;i<len/2;i++)              //转化成字节存储
                {
                        plaintext[i]=s[2*i]*16+s[2*i+1];
                }
                if(len%2==1)
                        plaintext[i]=s[2*i]*16;
                if(flag==1)
                        plaintext[len2-1]=pi;
                BOOL text[64];
                BOOL iv_tmp[64];
                str2="";
                for(i=0;i<len2/8;i++)
                {
                        btbit(text,&plaintext[8*i],64);
                        xor(iv,text,64);
                        en_decrypt(iv,key,'e');
                        btbyte(crypt,iv,64);
                        for(j=0;j<8;j++)
                                str2.cat_printf("%2.2x",crypt[j]);
                }
                free(plaintext);
        }
        else if(RadioButton2->Checked==true)
        {
                BOOL c_tmp[64];
                BYTE byte_ptext;
                BOOL bool_ptext;                   //CFB-1模式
                BOOL bool_crytext[8];
                BYTE byte_crytext;

                str2="";
                for(i=0;i<len;i++)
                {
                        if(s[i]>='0'&&s[i]<='9')
                                s[i]=s[i]-48;
                        else if(s[i]>='a'&&s[i]<='z')
                                s[i]=s[i]-87;
                        else if(s[i]>='A'&&s[i]<='Z')
                                s[i]=s[i]-55;
                }
                plaintext=(BYTE *)malloc(len2);
                all_len=len2;
                memset(plaintext,0,len2);
                for(i=0;i<len/2;i++)
                {
                        plaintext[i]=s[2*i]*16+s[2*i+1];
                }
                if(len%2==1)
                        plaintext[i]=s[2*i]*16;
                for(i=0;i<8*len2;i++)
                {
                        for(k=0;k<64;k++)
                                c_tmp[k]=iv[k];
                        en_decrypt(c_tmp,key,'e');
                        byte_ptext=plaintext[i/8];
                        bool_ptext=(byte_ptext>>(7-i%8))&1;
                        bool_ptext=bool_ptext^c_tmp[0];
                        bool_crytext[i%8]=bool_ptext;
                        if(i%8==7)
                        {
                                btbyte(&byte_crytext,bool_crytext,8);
                                str2.cat_printf("%2.2x",byte_crytext);
                        }
                        for(k=0;k<63;k++)
                                iv[k]=iv[k+1];
                        iv[63]=bool_ptext;

                }
                free(plaintext);
        }
        else if(RadioButton3->Checked==true)
        {
                BOOL c_bool[8];
                BYTE c_print;                     //CFB_8模式
                BOOL c_tmp[64];
                str2="";
                for(i=0;i<len;i++)
                {
                        if(s[i]>='0'&&s[i]<='9')
                                s[i]=s[i]-48;
                        else if(s[i]>='a'&&s[i]<='z')
                                s[i]=s[i]-87;
                        else if(s[i]>='A'&&s[i]<='Z')
                                s[i]=s[i]-55;
                }
                plaintext=(BYTE *)malloc(len2);
                memset(plaintext,0,len2);
                all_len=len2;
                for(i=0;i<len/2;i++)
                {
                        plaintext[i]=s[2*i]*16+s[2*i+1];
                }
                if(len%2==1)
                        plaintext[i]=s[2*i]*16;
                for(i=0;i<len2;i++)
                {
                        for(k=0;k<64;k++)
                                c_tmp[k]=iv[k];
                        en_decrypt(c_tmp,key,'e');
                        btbit(c_bool,&plaintext[i],8);
                        xor(c_tmp,c_bool,8);
                        btbyte(&c_print,c_tmp,8);
                        for(k=0;k<64-8;k++)
                                iv[k]=iv[k+8];
                        for(k=0;k<8;k++)
                                iv[64-8+k]=c_tmp[k];
                        str2.cat_printf("%2.2x",c_print);
                }
                free(plaintext);
        }
        else if(RadioButton4->Checked==true)
        {
                BOOL c_bool[64];
                BYTE c_print[8];
                BOOL c_tmp[64];
                str2="";
                for(i=0;i<len;i++)                     //CFB-64模式
                {
                        if(s[i]>='0'&&s[i]<='9')
                                s[i]=s[i]-48;
                        else if(s[i]>='a'&&s[i]<='z')
                                s[i]=s[i]-87;
                        else if(s[i]>='A'&&s[i]<='Z')
                                s[i]=s[i]-55;
                }
                plaintext=(BYTE *)malloc(len2);
                memset(plaintext,0,len2);
                all_len=len2;
                for(i=0;i<len/2;i++)
                {
                        plaintext[i]=s[2*i]*16+s[2*i+1];
                }
                if(len%2==1)
                        plaintext[i]=s[2*i]*16;
                for(i=0;i<(len2-1)/8+1;i++)
                {
                        for(k=0;k<64;k++)
                                c_tmp[k]=iv[k];
                        en_decrypt(c_tmp,key,'e');
                        btbit(c_bool,&plaintext[8*i],8*((len2-8*i)<8?(len2-8*i):8));
                        xor(c_tmp,c_bool,64);
                        btbyte(c_print,c_tmp,64);
                        for(k=0;k<64;k++)
                                c_bool[k]=c_tmp[k];
                        for(k=0;k<64;k++)
                                iv[k]=c_bool[k];
                        if(len2-8*i<8)
                        {
                                for(k=0;k<len2-8*i;k++)
                                        str2.cat_printf("%2.2x",c_print[k]);
                        }
                        else
                        {
                                for(k=0;k<8;k++)
                                        str2.cat_printf("%2.2x",c_print[k]);
                        }
                }
                free(plaintext);
        }
        Memo2->Lines->Text=str2;
        free(s);

        end=GetTickCount();
        effic=(end-start)*1.0/1000/all_len;
        String tmp="运行速度:";
        tmp+=FloatToStrF(effic,ffFixed,0,7);
        tmp+="sec/byte!";
        MessageBox(Handle,tmp.c_str(),"提示:",MB_OK|MB_ICONEXCLAMATION);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Decrypt1Click(TObject *Sender)
{
        if(Memo2->Text.Length()==0)
        {
                MessageBox(Handle,"请输入十六进制密文!","提示:",MB_OK|MB_ICONEXCLAMATION);
                return;
        }

        int len,len2,i,j,k,pi;
        String str1,str2;
        BYTE crypt[8];
        bool flag=0;
        BYTE *plaintext;

        DWORD start,end;
        DWORD all_len=0;
        double effic;
        start=GetTickCount();

        BOOL key[64];
        BOOL iv[64];
        iv_keychange(key,iv,Edit1->Text.c_str(),Edit2->Text.c_str());
        
        str2=Memo2->Lines->Text;
        len=str2.Length();
        BYTE *s=(BYTE *)malloc(len+1);
        strcpy(s,str2.c_str());
        s[len]='\0';
        if(len%2==1)
                len2=(len+1)/2;
        else
                len2=len/2;
        if(RadioButton1->Checked==true)
        {
                if(len2%8!=0)
                {
                        flag=1;
                        pi=8-len2%8;
                        len2=len2+pi;
                }
                for(i=0;i<len;i++)
                {
                        if(s[i]>='0'&&s[i]<='9')
                                s[i]=s[i]-48;
                        else if(s[i]>='a'&&s[i]<='z')
                                s[i]=s[i]-87;
                        else if(s[i]>='A'&&s[i]<='Z')
                                s[i]=s[i]-55;
                }
                plaintext=(BYTE *)malloc(len2);
                memset(plaintext,0,len2);
                all_len=len2;
                for(i=0;i<len/2;i++)
                {
                        plaintext[i]=s[2*i]*16+s[2*i+1];
                }
                if(len%2==1)
                        plaintext[i]=s[2*i]*16;
                if(flag==1)
                        plaintext[len2-1]=pi;
                BOOL text[64];
                BOOL iv_tmp[64];
                str1="";
                for(i=0;i<len2/8;i++)
                {
                        btbit(text,&plaintext[8*i],64);
                        for(j=0;j<64;j++)
                        {
                                iv_tmp[j]=text[j];
                        }
                        en_decrypt(text,key,'d');
                        xor(text,iv,64);
                        for(j=0;j<64;j++)
                        {
                                iv[j]=iv_tmp[j];
                        }
                        btbyte(crypt,text,64);
                        if(crypt[7]>=1&&crypt[7]<=7)
                                k=8-crypt[7];
                        else
                                k=8;
                        for(j=0;j<k;j++)
                                str1.cat_printf("%2.2x",crypt[j]);
                }
                free(plaintext);
        }

⌨️ 快捷键说明

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