2016-07-31 144 views
-1

我正在嘗試使用'AES-128 CBC with IV'加密字符串。下面是輸入參數和預期的輸出:

在IV中,AES-128 CBC加密如何在Objective-C中工作?

鍵: 000102030405060708090A0B0C0D0E0F

IV: 00102030405060708090A0B0C0D0E0F0

輸入數據: EA010B23CDA9B16F0001020304050607

輸出: B773C36749E87D3F8FED98FE52026A15

我已經驗證了這個網站上的輸出: http://extranet.cryptomathic.com/aescalc/index?key=000102030405060708090A0B0C0D0E0F&iv=00102030405060708090A0B0C0D0E0F0&input=EA010B23CDA9B16F0001020304050607&mode=cbc&action=Encrypt&output=B773C36749E87D3F8FED98FE52026A15

如何在目標C IV採用AES-128 CBC字符串加密? (與http://extranet.cryptomathic.com/aescalc的結果相同)我試圖獲取加密的字符串 - B773C36749E87D3F8FED98FE52026A15,但沒有運氣。



我曾嘗試使用這個庫的加密:https://github.com/Pakhee/Cross-platform-AES-encryption/tree/master/iOS

這是我的目標C代碼:

NSString* data = @"EA010B23CDA9B16F0001020304050607"; 
NSString* key = @"000102030405060708090A0B0C0D0E0F"; 
NSString* iv = @"00102030405060708090A0B0C0D0E0F0"; 


NSData *encryptedData = [[StringEncryption alloc] encrypt:[@"EA010B23CDA9B16F0001020304050607" dataUsingEncoding:NSUTF8StringEncoding] key:key iv:iv]; 
NSLog(@"encryptedData %@", encryptedData); 

的EncryptedData的輸出是: < 68f8ed75 e79f2ba2 c80e67a2 f0c84b7a c4b07fd1 59e937e5 14644cba c0ddb60c 40502375 7798e7a1 58bd05a5 b3d9e7bd>



我期待*的EncryptedData的值應該是< 42373733 43333637 34394538 37443346 38464544 39384645 35323032 36413135>,這是B773C36749E87D3F8FED98FE52026A15

我曾嘗試另一個庫六角 - https://github.com/dev5tec/FBEncryptor

NSData* _data = [data dataUsingEncoding:NSUTF8StringEncoding]; 
NSData* _key = [key dataUsingEncoding:NSUTF8StringEncoding]; 
NSData* _iv = [iv dataUsingEncoding:NSUTF8StringEncoding]; 


NSData *encryptedData2 = [FBEncryptorAES encryptData:_data key:_key iv:_iv]; 
NSLog(@"encryptedData2 = %@", encryptedData2); 

輸出爲< 2beea977 aef69eb1 ed9f6dd0 7bf5f1ce d1e5df46 2cbf8465 773f122d 03267abb 2e113d9b 07189268 4fd6babe 7b1c0056>

看來我使用了錯誤的庫或者我輸入了錯誤的加密函數。針對客觀c的AES庫的任何建議?

+1

你的意思是:http://stackoverflow.com/questions/7520615/how-to-convert-an-nsdata-into-an-nsstring-hex-string? – Larme

+0

感謝Larme,我試過將NSData轉換爲NSString的例子。但它會返回怪獸角色,例如>èaμ[ü#Õ-ÅÄ ,o v®ÊØqÈÈËl〜〜。我不確定我的問題是NSData轉換還是我以錯誤的方式使用了庫 –

+0

你是怎麼做到的?你有沒有試過:'NSUInteger容量= encryptedData.length * 2; NSMutableString * sbuf = [NSMutableString stringWithCapacity:capacity]; const unsigned char * buf = encryptedData.bytes; NSInteger i; for(i = 0; i Larme

回答

2

Common Crypto是用於iOS和OSX加密的正確的東西。它提供正確的輸入問題。

輸入密鑰iv和數據顯示爲十六進制。 Cryptomathic期望它的輸入是十六進制的,它的輸出是十六進制的,所以它能正常工作。

但ObjC代碼使用:

NSString* data = @"EA010B23CDA9B16F0001020304050607"; 
NSData* _data = [data dataUsingEncoding:NSUTF8StringEncoding]; 

其採用十六進制的字符串。
而是使用十六進制來進行數據轉換,如@Larme鏈接到,請參閱第一條評論。

根據輸入和輸出的大小,看起來您使用的是PKCS#7填充,如果輸入是塊大小的精確倍數,則填充填充整塊,Cryptomathic不會添加PKCS#7填充。

更新

@interface Crypt : NSObject 
+ (NSData *)aes128Data:(NSData *)dataIn; 
+ (NSData *)dataFromHexString:(NSString *)hexString; 
@end 

@implementation Crypt 

+ (NSData *)aes128Data:(NSData *)dataIn 
      operation:(CCOperation)operation // kCC Encrypt, Decrypt 
        key:(NSData *)key 
       options:(CCOptions)options  // kCCOption PKCS7Padding, ECBMode, 
        iv:(NSData *)iv 
       error:(NSError **)error 
{ 
    CCCryptorStatus ccStatus = kCCSuccess; 
    size_t   cryptBytes = 0; 
    NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128]; 

    ccStatus = CCCrypt(operation, 
         kCCAlgorithmAES, 
         options, 
         key.bytes, key.length, 
         iv.bytes, 
         dataIn.bytes, dataIn.length, 
         dataOut.mutableBytes, dataOut.length, 
         &cryptBytes); 

    if (ccStatus == kCCSuccess) { 
     dataOut.length = cryptBytes; 
    } 
    else { 
     if (error) { 
      *error = [NSError errorWithDomain:@"kEncryptionError" 
             code:ccStatus 
            userInfo:nil]; 
     } 
     dataOut = nil; 
    } 

    return dataOut; 
} 

+ (NSData *)dataFromHexString:(NSString *)hexString { 
    char buf[3]; 
    buf[2] = '\0'; 
    unsigned char *bytes = malloc([hexString length]/2); 
    unsigned char *bp = bytes; 
    for (CFIndex i = 0; i < [hexString length]; i += 2) { 
     buf[0] = [hexString characterAtIndex:i]; 
     buf[1] = [hexString characterAtIndex:i+1]; 
     char *b2 = NULL; 
     *bp++ = strtol(buf, &b2, 16); 
    } 

    return [NSData dataWithBytesNoCopy:bytes length:[hexString length]/2 freeWhenDone:YES]; 
} 

@end 

NSString *dataHexString = @"EA010B23CDA9B16F0001020304050607"; 
NSString *keyHexString = @"000102030405060708090A0B0C0D0E0F"; 
NSString *ivHexString = @"00102030405060708090A0B0C0D0E0F0"; 

NSLog(@"dataHexString: %@", dataHexString); 
NSLog(@"keyHexString: %@", keyHexString); 
NSLog(@"ivHexString: %@", ivHexString); 

NSData *data = [Crypt dataFromHexString:dataHexString]; 
NSData *key = [Crypt dataFromHexString:keyHexString]; 
NSData *iv = [Crypt dataFromHexString:ivHexString]; 

NSLog(@"data: %@", data); 
NSLog(@"key: %@", key); 
NSLog(@"iv: %@", iv); 

NSError *error; 
NSData *encryptedData = [Crypt 
         aes128Data:data 
         operation:kCCEncrypt 
         key:key 
         options:0 
         iv:iv 
         error:&error]; 

NSLog(@"encryptedData %@", encryptedData); 

輸出:

dataHexString: EA010B23CDA9B16F0001020304050607 
keyHexString: 000102030405060708090A0B0C0D0E0F 
ivHexString: 00102030405060708090A0B0C0D0E0F0 

data: <ea010b23 cda9b16f 00010203 04050607> 
key: <00010203 04050607 08090a0b 0c0d0e0f> 
iv: <00102030 40506070 8090a0b0 c0d0e0f0> 

encryptedData: <b773c367 49e87d3f 8fed98fe 52026a15> 

encryptedData比賽的Cryptomathic結果。

+0

謝謝zaph,似乎這個鏈接 - http://stackoverflow.com/questions/7520615/how-to-convert-an-nsdata-into-an-nsstring-hex-string是關於將NSData轉換爲NSSting。但對於我的情況,我需要將NSString(十六進制)轉換爲NSData。有沒有圖書館可以做轉換? –

+0

我試圖將NSString轉換爲NSData像這樣 - http://stackoverflow.com/questions/2338975/convert-hex-data-string-to-nsdata-in-objective-c-cocoa。但仍然無法獲得正確的加密結果。 –

+0

由於某種原因,蘋果公司並未提供這樣的庫,只有蘋果知道。查看我的更新代碼,瞭解這種方法。 – zaph