C# objective-c和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

我正在开发一个ios应用程序,在服务器端使用C#。我需要使用3DES加密来加密密码

在这两种代码中:

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;
}