2012-08-13 105 views
2

我對iOS開發和目標c相當陌生。 我正在開發一個將加密數據發送到服務器的應用程序。 服務器使用帶有cbc且沒有填充的3des。 我已經閱讀了大部分相關的問題在stackoverflow但仍然無法得到它的工作。 在這工作了幾天,但仍然無法使其與服務器加密相匹配。iphone中的3des加密

這裏是我有工作了:

NSString* plaintexthex = @"536176696E67204163636F756E747C313233343536000000"; 
NSData *dTextIn = [self dataFromHexString:plaintexthex]; //my own way of convert hex to data 

NSString* keyhex = @"6E7B336FD2051BA165A9362BD9735531"; 
NSData *_keyData = [self dataFromHexString:keyhex]; //my own way of convert hex to data 

CCCryptorStatus ccStatus; 
uint8_t *bufferPtr = NULL; 
size_t bufferPtrSize = 0; 
size_t movedBytes = 0; 

bufferPtrSize = ([dTextIn length] + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); 
bufferPtr = malloc(bufferPtrSize * sizeof(uint8_t)); 
memset((void *)bufferPtr, 0x00, bufferPtrSize); 

uint8_t iv[kCCBlockSize3DES]; 
memset((void *) iv, 0x00, (size_t) sizeof(iv)); 

unsigned char *bytePtr = (unsigned char *)[_keyData bytes]; 

ccStatus = CCCrypt(kCCEncrypt,    // CCoperation op 
        kCCAlgorithm3DES,  // CCAlgorithm alg 
        kCCModeCBC,    // CCOptions 
        [_keyData bytes],  // const void *key 
        kCCKeySize3DES,   // 3DES key size length 24 bit 
        iv,      // const void *iv, 
        [dTextIn bytes],   // const void *dataIn 
        [dTextIn length],  // size_t dataInLength 
        bufferPtr,    // void *dataOut 
        bufferPtrSize,   // size_t dataOutAvailable 
        &movedBytes);   // size_t *dataOutMoved 

NSString *result; 
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:   (NSUInteger)movedBytes]; 
result = [self hexStringFromData:myData]; 

NSLog(@"Data to encrypt %@",dTextIn); 
NSLog(@"Encryption key %@",_keyData); 
NSLog(@"Bytes of key are %s ", bytePtr); 
NSLog(@"Key length %d ",[_keyData length]); 
NSLog(@"Encrypted bytes %@", myData); 
NSLog(@"Encrypted string %@", result); 
NSLog(@"Encrypted string length %d", [result length]); 

- (NSData *)dataFromHexString:(NSString *)string 
{ 
    NSMutableData *stringData = [[[NSMutableData alloc] init] autorelease]; 
    unsigned char whole_byte; 
    char byte_chars[3] = {'\0','\0','\0'}; 
    int i; 
    for (i=0; i < [string length]/2; i++) { 
     byte_chars[0] = [string characterAtIndex:i*2]; 
     byte_chars[1] = [string characterAtIndex:i*2+1]; 
     whole_byte = strtol(byte_chars, NULL, 16); 
     [stringData appendBytes:&whole_byte length:1]; 
    } 
    return stringData; 
} 

我已經開發了Android平臺上的類似應用程序,並將它與服務器的效果很好。這裏是我在Android平臺上使用的函數的加密。

public byte[] encrypt(byte[] key, byte[] message) throws Exception { 

     byte [] plainTextBytes = message; 
     byte[] encryptKey = key; 

     SecretKey theKey = new SecretKeySpec(encryptKey, "DESede"); 
     Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding"); 
     IvParameterSpec IvParameters = new IvParameterSpec(new byte[] {(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00}); 
     cipher.init(Cipher.ENCRYPT_MODE, theKey, IvParameters); 
     byte[] encrypted = cipher.doFinal(plainTextBytes); 
     return encrypted; 
    } 

基本上我想複製這個類似的加密在iOS平臺上使用。 任何幫助將受到歡迎,並提前感謝您。

+0

@owlstead感謝您的回覆。緩衝區大小的計算應該是正確的。我已經搜遍了很多其他的帖子,他們都用相同的方式。至於十六進制轉換,我在日誌中顯示轉換的值,它似乎匹配原始的十六進制字符串。如果可能的話,你能指出我的錯誤嗎?謝謝。 – jaytsen 2012-08-13 06:52:52

+0

對不起,無法在Linux上編譯Common Crypto庫,所以我無法調試。 – 2012-08-13 17:05:02

+0

我正面臨類似的問題。你解決了嗎? – kinghomer 2012-09-27 10:04:01

回答

1

kCCModeCBC是一種模式,而不是一個選項。您需要的選項是0。 CBC是CCCrypt()的默認模式。默認也是沒有填充。

+0

感謝您的回覆。對我來說,kccModeCBC和0都給出了相同的結果。 – jaytsen 2012-08-23 01:01:31

0

我是iOS用戶,而不是開發人員,但據我所知,iOS不再支持3DES。我使用iPad作爲VPN,iOS 3在3DES加密方面運行良好,但從iOS 4起,所需的最低加密級別是AES128。

希望有所幫助。