老师叫用MFC我做一个DES加密器,DES代码都找到了
我将自己的EDIT编辑框接收到的明文密钥都命成CString类型
         CString mingwen;
CString miyue;
CString miwen;
CString miwen1;
CString miyue1;
CString mingwen1;下面是DES代码的加密函数:void Encode(int *str,int *keychar)
最后它说:没有找到接受“void”类型的右操作数的运算符(或没有可接受的转换)
然后我改成了miwen=CString.Format("%d",Encode(strkey,key2));想转换类型
它又说“CString”: 将此类型用作表达式非法,如果谁要完整代码就说怎么样就合理使用在别处找的代码,而不出现这些问题感觉到自己连最简单的MFC都不会

解决方案 »

  1.   

    你没将Encode的返回值赋给另外一个变量吧?他返回的是void,没有返回值的。函数体里也不能有返回值。
      

  2.   

    你应该将接收密文的字符指针赋给Encode(int *str,int *keychar)形参的吧。
      

  3.   

    Encode处理之后的字符串是怎么返回的? 函数应该定义为char* 或者CString类型 然后返回这个处理后的字符串CString.Format("%d",Encode(strkey,key2)); 也一样啊 Encode(strkey,key2)处理后无返回值 所以报错啊
      

  4.   

    这就是我找的DES代码
    我想知道的就是如何把这个代码嵌入到MFC中
    在对话框中获得输入,显示输出
    请各位高手指教
    谢谢
    #include<stdio.h>
    #include<string.h>
    void EncodeMain();                                                  //EncodeMain function
    void DecodeMain();                                                 //Sorry ,it has not used
    void Decode(int *str,int *keychar);                            //decode :input 8 chars,8 keychars
    void Encode(int *str,int *keychar);                            //encode: input 8 chars,8 keychars
    void keyBuild(int *keychar);                                     //create key array
    void StrtoBin(int *midkey,int *keychar);                   //change into binary
    void keyCreate(int *midkey2,int movebit,int i);         //call by keyBuild
    void EncodeData(int *lData,int *rData,int *srt);        //encodedata function
    void F(int *rData,int *key);                                       //F function
    void Expand(int *rData,int *rDataP);                        //Expand function
    void ExchangeS(int *rDataP,int *rData);                   //S-diagram change 
    void ExchangeP(int *rData);                                    //P change
    void FillBin(int *rData,int n,int s);                             // data to binary;call by S-Diagram change function
    void DecodeData(int *str,int *lData,int *rData);        //DecodeData from binary
    int IP1[]={58, 50, 42, 34, 26, 18, 10, 2,  60, 52, 44, 36, 28, 20, 12, 4,    //initial change
    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 IP2[]={40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,    //opp initial change
    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 s[][4][16]={{                                                                              //S-diagram array
    {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 Ex[48]={  32,1,2,3,4,5,                                                               //Expand array
    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 P[32]={16,7,20,21,                                                                //P-change
    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 PC1[56]={57,49,41,33,25,17,9,                                                //PC-1 in keyBuild
    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,33,15,
    7,62,54,46,38,30,22,
    14,6,61,53,45,37,29,
    21,13,5,28,20,12,4
    };
    int PC2[48]={14,17,11,24,1,5,                                                     //PC-2 in keyBuild
    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
    };///////////////////////////////////////////////////////////////////////int key[16][48];
    char str[8];
    void main()                 //main function
    {
    EncodeMain();}
    void EncodeMain()           //EncodeMain function
    {
    int i; char keychar[8]; int key2[8];
    int strkey[8];
    printf("请输入8个要加密的字符:\n");
    for(i=0;i<8;i++)
    scanf("%c",&str[i]);
    getchar();
    for(i=0;i<8;i++)
    strkey[i]=str[i];
    printf("\n输入明文的十六进制为:\n");
    for(i=0;i<8;i++)
    printf("%10x",strkey[i]);
    printf("\n请输入密钥(8个字符):\n");
    for(i=0;i<8;i++)
    scanf("%c",&keychar[i]);
    for(i=0;i<8;i++)
    key2[i]=keychar[i];
    getchar();
    // printf("%c",keychar[i]);
    Encode(strkey,key2);
    printf("\n加密后十六进制密文是:\n");
    for(i=0;i<8;i++)
    printf("%10x",strkey[i]);
    printf("\n\n清输入解密密码\n");
    for(i=0;i<8;i++)
    scanf("%c",&keychar[i]);
    for(i=0;i<8;i++)
    key2[i]=keychar[i];
    Decode(strkey,key2);
    for(i=0;i<8;i++)
    printf("%10x",strkey[i]);
    for(i=0;i<8;i++)
    str[i]=strkey[i];
    printf("\n明文为:\t");
    for(i=0;i<8;i++)
    printf("%c",str[i]);
    printf("\n\n");}
    void keyBuild(int *keychar){            //create key array
    int i,j;
    int movebit[]={1,1,2,2,2,2,2,2,
    1,2,2,2,2,2,2,1};
    int midkey2[56];
    int midkey[64];
    StrtoBin(midkey,keychar);
    for(i=0;i<56;i++)
    midkey2[i]=midkey[PC1[i]-1];
    for(i=0;i<16;i++)
    keyCreate(midkey2,movebit[i],i);
    }
    void StrtoBin(int *midkey,int *keychar){     //change into binary
    int trans[8],i,j,k,n;
    n=0;
    for(i=0;i<8;i++){
    j=0;
    while(keychar[i]!=0){
    trans[j]=keychar[i]%2;
    keychar[i]=keychar[i]/2;
    j++;
    }
    for(k=j;k<8;k++)trans[k]=0;
    for(k=0;k<8;k++)
    midkey[n++]=trans[7-k];
    }
    }
    void keyCreate(int *midkey2,int movebit,int n){
    int i,temp[4];
    temp[0]=midkey2[0];
    temp[1]=midkey2[1];
    temp[2]=midkey2[28];
    temp[3]=midkey2[29];
    if(movebit==2){
    for(i=0;i<26;i++){
    midkey2[i]=midkey2[i+2];
    midkey2[i+28]=midkey2[i+30];
    }
    midkey2[26]=temp[0];midkey2[27]=temp[1];
    midkey2[54]=temp[2];midkey2[55]=temp[3];  }
    else
    { for(i=0;i<27;i++){
    midkey2[i]=midkey2[i+1];
    midkey2[i+28]=midkey2[i+29];
    }
    midkey2[27]=temp[0];midkey2[55]=temp[2];
    }
    for(i=0;i<48;i++)
    key[n][i]=midkey2[PC2[i]-1];
    }
    void EncodeData(int *lData,int *rData,int *str){   //encodedata function
    int i,j,temp[8],lint,rint;//int h;
    int data[64];
    lint=0,rint=0;
    for(i=0;i<4;i++){
    j=0;
    while(str[i]!=0){
    temp[j]=str[i]%2;
    str[i]=str[i]/2;
    j++;
    }
    while(j<8)temp[j++]=0;
    for(j=0;j<8;j++)
    lData[lint++]=temp[7-j];
    j=0;
    while(str[i+4]!=0){
    temp[j]=str[i+4]%2;
    str[i+4]=str[i+4]/2;
    j++;
    }
    while(j<8)temp[j++]=0;
    for(j=0;j<8;j++)rData[rint++]=temp[7-j];
    }
    for(i=0;i<32;i++){
    data[i]=lData[i];
    data[i+32]=rData[i];
    } for(i=0;i<32;i++){
    lData[i]=data[IP1[i]-1];//printf("P1:%5d:%5d,%5d\n",IP1[i],lData[i],data[IP1[i]-1]);
    rData[i]=data[IP1[i+32]-1];
    }
    }
    void F(int *rData,int *key){                   //F function
    int i,rDataP[48];
    Expand(rData,rDataP);
    for(i=0;i<48;i++){
    rDataP[i]=rDataP[i]^key[i];// printf("%10d",rDataP[i]);if((i+1)%6==0)printf("\n");
    } ExchangeS(rDataP,rData); ExchangeP(rData);
    }
    void Expand(int *rData,int *rDataP){          //Expand function
    int i;
    for(i=0;i<48;i++)
    rDataP[i]=rData[Ex[i]-1];
    }
    void ExchangeS(int *rDataP,int *rData){          //S-diagram change
    int i,n,linex,liney;
    linex=liney=0;
    for(i=0;i<48;i+=6){
    n=i/6; //printf("%10d\n",(rDataP[i]<<1));
    linex=(rDataP[i]<<1)+rDataP[i+5];
    liney=(rDataP[i+1]<<3)+(rDataP[i+2]<<2)+(rDataP[i+3]<<1)+rDataP[i+4]; FillBin(rData,n,s[n][linex][liney]);
    }
    }
    void ExchangeP(int *rData){                     //P change
    int i,temp[32];
    for(i=0;i<32;i++)
    temp[i]=rData[i]; for(i=0;i<32;i++)
    rData[i]=temp[P[i]-1];
    }
    void FillBin(int *rData,int n,int s){         // data to binary;call by S-Diagram change function
    int temp[4],i;
    for(i=0;i<4;i++){
    temp[i]=s%2;
    s=s/2;
    }
    for(i=0;i<4;i++)
    rData[n*4+i]=temp[3-i];
    }
    void DecodeData(int *str,int *lData,int *rData){    //DecodeData from binary
    int i;int a,b;int data[64];
    a=0,b=0;
    for(i=0;i<32;i++){
    data[i]=lData[i];
    data[i+32]=rData[i];
    }
    for(i=0;i<32;i++){
    lData[i]=data[IP2[i]-1];
    rData[i]=data[IP2[i+32]-1];
    }
    for(i=0;i<32;i++){
    a=(lData[i]&0x1)+(a<<1);
    b=(rData[i]&0x1)+(b<<1);
    if((i+1)%8==0){
    str[i/8]=a;a=0;//printf("%d",i/8);
    str[i/8+4]=b;b=0;//printf("%d",i/8+4);
    }
    }}void Encode(int *str,int *keychar){           //encode: input 8 chars,8 keychars
    int lData[32],rData[32],temp[32],rDataP[48];
    int i,j;
    keyBuild(keychar); EncodeData(lData,rData,str);
    for(i=0;i<16;i++){
    for(j=0;j<32;j++)
    temp[j]=rData[j];
    F(rData,key[i]);
    for(j=0;j<32;j++){
    rData[j]=rData[j]^lData[j];
    } for(j=0;j<32;j++)
    lData[j]=temp[j];
    } DecodeData(str,rData,lData);}
    void Decode(int *str,int *keychar){           //decode :input 8 chars,8 keychars
    int lData[32],rData[32],temp[32],rDataP[48];
    int i,j;
    keyBuild(keychar);
    EncodeData(lData,rData,str); //这个位置
    for(i=0;i<16;i++){
    for(j=0;j<32;j++)
    temp[j]=rData[j];
    F(rData,key[15-i]);
    for(j=0;j<32;j++){
    rData[j]=rData[j]^lData[j];
    } for(j=0;j<32;j++){
    lData[j]=temp[j];
    }
    }
    DecodeData(str,rData,lData);
    }
      

  5.   

    void Encode(int *str,int *keychar) 
    两个参数里面应该有一个是保存加密后的字符串的吧
    它的函数的参数没说明吗?
      

  6.   


    Format函数没有返回值,直接调用就能格式化
      

  7.   

    去学习一下CString的用法吧
    CString 转成 LPTSTR,再转成其他类型的指针CString miyue; 
    CString miwen; 
    CString miwen1; 
    CString miyue1; 
    CString mingwen1; void Encode(int *str,int *keychar);
    没仔细看,一般str是入口出口参数,keychar是入参数如Encode((int *)mingwen1.GetBuffer(0), (int *)(LPTSTR)miyue);
    mingwen1.ReleaseBuffer();
      

  8.   

    还有就是注意 工程是否使用Unicode编码
    CString的Unicode编码
      

  9.   

    我改成了:
    miwen.Format("%d",Encode(strkey,key2));
    结果又出来错误提示
    CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)”: 不能将参数 1 从“const char [3]”转换为“const wchar_t *”
      

  10.   

    如使用Unicode方式
    一样可以DES加解密
    只不过ACSII和Unicode两种方式的同一明文 加密后的密文不同而已或者可以先将CString转成ASCII,
    也即宽字符转多字节字符
      

  11.   

    9楼不是说了么Encode((int *)mingwen1.GetBuffer(0), (int *)(LPTSTR)miyue); 
    mingwen1.ReleaseBuffer(); 
      

  12.   

    这个代码只能加密8个字符的明文....
    而且代码很乱还是找别的代码吧网上有很多优秀的DES库
      

  13.   

    miwen.Format("%d",Encode(strkey,key2)); 
    肯定有问题,因为Encode的返回值类型为void即无返回值,你是获不到东西的错误提示 :
    CStringT <BaseType,StringTraits>::Format(const wchar_t *,...)”: 不能将参数 1 从“const char [3]”转换为“const wchar_t *” 
    是由于Unicode引起的,可以改为:
    miwen.Format(_T("%d"),Encode(strkey,key2)); //但获得值还是不对
    你可以这样:
    Encode(strkey,key2)
    miwen.Format(_T("%s"),(TCHAR *)strkey);
    或者:
    for(int i=0;i<8;i++)//8为你strkey的长度

         miwen.Format(miwen+_T(" %d"),strkey[i]);
      

  14.   

    这个确实不报错,但是调试的时候输入明文和密钥点击加密的时候会报错
    Expression:(ichar>=0)&&(ichar<=GetLength())For information on how your program can cause an assertion failure,see the visual C++documentation on asserts.