最近我们用到的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;
}
链接: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;
}
下面是链接中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项目,相同的代码,相同的明文和密匙,加密后的明文不一样,但是解密后没问题!疑问中....
如下几个地方最好修改:
cPlainText保存8个字节,大小就应该设置为9;
重新输入,最好清零再输入。