2016-07-31 147 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