C# objective-c和c的3DES加密结果不同#
我正在开发一个ios应用程序,在服务器端使用C#。我需要使用3DES加密来加密密码 在这两种代码中:C# objective-c和c的3DES加密结果不同#,c#,ios,objective-c,3des,C#,Ios,Objective C,3des,我正在开发一个ios应用程序,在服务器端使用C#。我需要使用3DES加密来加密密码 在这两种代码中: key = "FC13573F412EAA1BA8E34791C06504C1429C5BCEB94DB111"; plainText = "123456"; // (or CryptString = "123456") 现在C#结果是正确的,我在objective-C中从未得到相同的结果,请帮助我 以下是C#代码: public bool Crypt3DESToBase64(字符串Crypt
key = "FC13573F412EAA1BA8E34791C06504C1429C5BCEB94DB111";
plainText = "123456"; // (or CryptString = "123456")
现在C#结果是正确的,我在objective-C中从未得到相同的结果,请帮助我
以下是C#代码:
public bool Crypt3DESToBase64(字符串CryptString、字符串密钥、输出字符串解密字符串)
{
解密字符串=”;
尝试
{
//编码为字节
字节[]键=HexStringToByteArray(键);
byte[]CRYPTSTRING=System.Text.Encoding.UTF8.GetBytes(CRYPTSTRING);
//集合iv和键
字节[]tmpiv={1,2,3,4,5,6,7,8};
字节[]tmpkey={0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7};
对于(int ii=0;ii<24;ii++)
{
tmpkey[ii]=键[ii];
}
TripleDESCryptoServiceProvider dsp=新的TripleDESCryptoServiceProvider();
dsp.Mode=System.Security.Cryptography.CipherMode.CBC;
dsp.Padding=System.Security.Cryptography.PaddingMode.PKCS7;
ICryptoTransform tridesencrypt=dsp.CreateEncryptor(tmpkey,tmpiv);
DecryptString=Convert.ToBase64String(tridesencrypt.TransformFinalBlock(CRYPTSTRING,0,CRYPTSTRING.Length));
dsp.Clear();
返回true;
}
捕获(例外e)
{
返回false;
}
}
公共静态字节[]HexStringToByteArray(字符串s)
{
字节[]buf=新字节[s.Length/2];
对于(int i=0;i
以下是objective-c代码:
#define gIv @"12345678"
#define kSecrectKeyLength 24
+ (NSString*)encrypt:(NSString*)plainText withKey:(NSString*)key{
uint8_t keyByte[kSecrectKeyLength];
NSMutableData *keyData = [[NSMutableData alloc] init];
int i;
for (i=0; i < [key length] / 2; i++) {
NSString *tempNumber = [key substringWithRange: NSMakeRange(i * 2, 2)];
NSScanner *scanner=[NSScanner scannerWithString:tempNumber];
unsigned int temp;
[scanner scanHexInt:&temp];
Byte B = (Byte)(0xFF & temp);
keyByte[i] = B;
}
NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
size_t plainTextBufferSize = [data length];
const void *vplainText = (const void *)[data bytes];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
const void *vkey = (const void *) keyByte;
const void *vinitVec = (const void *) [gIv UTF8String];
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding,
vkey,
kCCKeySize3DES,
vinitVec,
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
NSString *result = [GTMBase64 stringByEncodingData:myData];
NSLog(@"result=%@",result);
return result;
}
定义gIv@“12345678”
#定义kSecrectKeyLength 24
+(NSString*)加密:(NSString*)带密钥的明文:(NSString*)密钥{
uint8_t keyByte[kSecrectKeyLength];
NSMutableData*keyData=[[NSMutableData alloc]init];
int i;
对于(i=0;i<[键长度]/2;i++){
NSString*tempNumber=[键substringWithRange:NSMakeRange(i*2,2)];
NSScanner*scanner=[NSScanner scannerWithString:tempNumber];
无符号整数温度;
[扫描仪扫描点:&temp];
字节B=(字节)(0xFF&temp);
keyByte[i]=B;
}
NSData*data=[明文数据使用编码:NSUTF8StringEncoding];
大小\u t明文缓冲大小=[数据长度];
常量void*vplainText=(常量void*)[数据字节];
CCCryptorStatus-ccStatus状态;
uint8_t*bufferPtr=NULL;
大小\u t bufferPtrSize=0;
大小\u t movedBytes=0;
bufferPtrSize=(plainTextBufferSize+kCCBlockSize3DES)&~(kCCBlockSize3DES-1);
bufferPtr=malloc(bufferPtrSize*sizeof(uint8_t));
memset((void*)bufferPtr,0x0,bufferPtrSize);
const void*vkey=(const void*)keyByte;
常量void*vinitVec=(常量void*)[gIv UTF8String];
ccStatus=CCCrypt(KCCENCCRYPT,
kCCAlgorithm3DES,
KCCOPIONPKCS7填充,
vkey,
kCCKeySize3DES,
维尼特维克,
vplainText,
明文缓冲区大小,
(void*)bufferPtr,
bufferPtrSize,
&移动字节);
NSData*myData=[NSData dataWithBytes:(const void*)bufferPtr length:(NSUInteger)movedBytes];
NSString*result=[GTMBase64 stringByEncodingData:myData];
NSLog(@“结果=%@”,结果);
返回结果;
}
请帮忙,非常感谢 你的静脉注射不同。在C#代码中,您使用的是字节1、2等。但在objective-C中,您使用的是字符“1”、“2”(即字节49、50等)的字节值
#define gIv @"12345678"
#define kSecrectKeyLength 24
+ (NSString*)encrypt:(NSString*)plainText withKey:(NSString*)key{
uint8_t keyByte[kSecrectKeyLength];
NSMutableData *keyData = [[NSMutableData alloc] init];
int i;
for (i=0; i < [key length] / 2; i++) {
NSString *tempNumber = [key substringWithRange: NSMakeRange(i * 2, 2)];
NSScanner *scanner=[NSScanner scannerWithString:tempNumber];
unsigned int temp;
[scanner scanHexInt:&temp];
Byte B = (Byte)(0xFF & temp);
keyByte[i] = B;
}
NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
size_t plainTextBufferSize = [data length];
const void *vplainText = (const void *)[data bytes];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
const void *vkey = (const void *) keyByte;
const void *vinitVec = (const void *) [gIv UTF8String];
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding,
vkey,
kCCKeySize3DES,
vinitVec,
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
NSString *result = [GTMBase64 stringByEncodingData:myData];
NSLog(@"result=%@",result);
return result;
}