最近我们用到的ecb模式(明文、密文、密匙都为64bit,都为八个字符)的DES加密解密,加密是用网上找的一篇c语言学的。
链接:http://hi.baidu.com/camel520duck/blog/item/1e20ad11a88c8073cb80c41b.html 
该程序用VS2010上的win32上运行,没有任何问题,并且感觉很不错。
  为了在objective-c中嵌套,只改了最后main() 函数,其他的函数没有任何改变,直接按照调用的:
  -(NSData *) encryptAboutPlainText:(unsigned char *)cPlainText key:(unsigned char *)key{
        NSMutableData *totalData=[[NSMutableData alloc] initWithBytes:NULL length:0];
        bool pSubKey[16][48];
        unsigned char cCipherText[8];
        bool bCipherText[64];        SetSubKey(pSubKey, key);
        EncryptOfDES(cCipherText,cPlainText,pSubKey);
        ByteToBit(bCipherText,cCipherText,64);       for(int i=0;i<64;i++){
          if(bCipherText[i]){
            NSLog(@"1");
        }else{
            NSLog(@"0");
        } }
   
       for (int i=0; i<8; i++) {
           NSLog(@"%d",cCipherText);
       }
       [totalData appendBytes:cCipherText length:8];
      return totalData;
}

      
  
  

解决方案 »

  1.   

    上面的只是测试的加密功能,
    下面是链接中main()函数,我也写出来让大家对比一下:
        int main()
    {
    uchar cPlainText[8];
    bool bPlainText[64];
    uchar cCipherText[8];
    uchar ccCipherText[64];
    bool bCipherText[64];
    uchar cKeys[8];
    bool pSubKey[16][48];
    char flag='a';
    cout<<"请选择:"<<endl
       <<"a)加密"<<endl
       <<"b)解密"<<endl
       <<"q)退出"<<endl;
    cin>>flag;
    while(flag!='q')
    {
       if(flag=='a')
       {
        cout<<"请输入8字节明文:";
        cin>>cPlainText;
        cout<<"请输入8字节密钥:";
        cin>>cKeys;
        //cout<<"明文:"<<cPlainText<<endl;
        //cout<<"密钥:"<<cKeys<<endl;
        SetSubKey(pSubKey,cKeys);
        EncryptOfDES(cCipherText,cPlainText,pSubKey);
        ByteToBit(bCipherText,cCipherText,64);
        cout<<"密文(Bit) :";
        for(int i=0;i<64;i++)
        {
         if(bCipherText[i])
          cout<<'1';
         else
          cout<<'0';
        }
        cout<<endl;
        /*
        cout<<"密文(Byte):";
        for(int i=0;i<8;i++)
        {
         cout<<cCipherText[i];
        }
        cout<<endl;
        */
       }
       else if(flag=='b')
       {
        cout<<"请输入64Bit密文:"<<endl;
        cin>>ccCipherText;
        for(int i=0;i<64;i++)
        {
         if(ccCipherText[i]=='0')
          bCipherText[i]=0;
         else if(ccCipherText[i]=='1')
          bCipherText[i]=1;
         else
         {
          cout<<"输入错误"<<endl;
          break;
         }
        }
        BitToByte(cCipherText,bCipherText,64);
        cout<<"请输入8字节密钥:";
        cin>>cKeys;
        SetSubKey(pSubKey,cKeys);
        JiemiOfDES(cPlainText,cCipherText,pSubKey);
        ByteToBit(bPlainText,cPlainText,64);
        cout<<"明文:";
        for(int i=0;i<8;i++)
        {
         char a=(char)cPlainText[i];
         cout<<a;
        }
        cout<<endl;
       }
       else
        cout<<"输入错误,请重新输入!"<<endl;
       cout<<"请选择:"<<endl
          <<"a)加密"<<endl
          <<"b)解密"<<endl
          <<"q)退出"<<endl;
       cin>>flag;};
    return 0;
    }

    现在非常郁闷,每次运行,解压的密文都不一样(其中明文和密匙一样),都在变!请各位大侠帮我看看,这是为什么?
    哦,对了,偶在VS2010中运行链接程序时,我也发现,建立多个win32项目,相同的代码,相同的明文和密匙,加密后的明文不一样,但是解密后没问题!疑问中....
      

  2.   

    应该不会的,逻辑是确定的,应该是相同的;
    如下几个地方最好修改:
    cPlainText保存8个字节,大小就应该设置为9;
    重新输入,最好清零再输入。