2016-07-31 6 views
-1

'AES-128 CBC with IV'로 문자열을 암호화하려고합니다.

IV가있는 AES-128 CBC 암호화는 어떻게 목표 -C에서 작동합니까?

키 : 000102030405060708090A0B0C0D0E0F

IV : 00102030405060708090A0B0C0D0E0F0

입력 데이터 : EA010B23CDA9B16F0001020304050607

출력 : B773C36749E87D3F8FED98FE52026A15,369 여기서 입력 파라미터 예상 출력 http://extranet.cryptomathic.com/aescalc/index?key=000102030405060708090A0B0C0D0E0F&iv=00102030405060708090A0B0C0D0E0F0&input=EA010B23CDA9B16F0001020304050607&mode=cbc&action=Encrypt&output=B773C36749E87D3F8FED98FE52026A15

어떻게 목표 C에서 IV로 AES-128 CBC 문자열을 암호화 : 1,363,210

내가 본 웹 사이트에 출력을 확인한? (http://extranet.cryptomathic.com/aescalc과 동일한 결과) 암호화 된 문자열 (B773C36749E87D3F8FED98FE52026A15)을 얻으려고하지만 행운이 없습니다.

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 https://github.com/Pakhee/Cross-platform-AES-encryption/tree/master/iOS 여기

내 목표 C 코드 :



나는 암호화이 라이브러리를 사용하는 것을 시도했다 f0c84b7a c4b07fd1 59e937e5 14644cba c0ddb60c 40502375 7798e7a1 58bd05a5 b3d9e7bd>

https://github.com/dev5tec/FBEncryptor

- 617,451,515,



나는 *의 EncryptedData의 값이 내가 다른 라이브러리 시도 B773C36749E87D3F8FED98FE52026A15

의 진수는 < 42,373,733 43,333,637 34,394,538 37,443,346 38,464,544 39,384,645 35,323,032 36,413,135>이어야한다 기대

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, NSString을 NSString으로 변환하는 예제를 시도했습니다. 하지만 몬스터 캐릭터는> èaμ [ü # Õ-ÅÄ , ÃÆ'à ¢ â, ¬ Â/¬FØ qÈ5Ëlg ~]와 같이 반환됩니다. 내 문제가 NSData 변환인지 확실하지 않거나 잘못된 방식으로 라이브러리를 사용합니다. –

+0

정확히 무엇을 했습니까? 그것을 시도 했습니까 : NSUInteger capacity = encryptedData.length * 2; NSMutableString * sbuf = [NSMutableString stringWithCapacity : capacity]; const unsigned char * buf = encryptedData.bytes; NSInteger i; (NSUInteger) buf [i]];} NSString * encryptedString = [sbuf copy]'? ("0"; – Larme

답변

2

일반적인 암호화는 iOS 및 OSX의 암호화에 사용하는 올바른 것입니다. 올바른 입력을 제공하는 문제입니다.

입력 키, iv 및 데이터는 16 진수로 표시됩니다. Cryptomathic은 입력을 16 진수로 예상하고 출력이 16 진수이므로 제대로 작동합니다.

는 그러나 ObjC 코드를 사용하여 문자열로 16 진수 사용

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

합니다.
대신 @Larme와 같은 데이터 변환에 16 진수를 사용하여 첫 번째 주석을 확인하십시오.

입/출력 크기에 따라 입력이 블록 크기의 정확한 배수이면 전체 채우기 블록을 추가하는 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 NSSting NSData로 변환하는 것 같습니다. 하지만 제 경우에는 NSString (16 진수)을 NSData로 변환해야합니다. 변환을 수행 할 수있는 라이브러리가 있습니까? –

+0

NSString을 NSData로 변환하려고했는데 - http://stackoverflow.com/questions/2338975/convert-hex-data-string-to-nsdata-in-objective-c-cocoa. 그러나 여전히 올바른 암호화 결과를 얻을 수 없습니다. –

+0

Apple은 Apple이 알고있는 어떤 이유로 이러한 라이브러리를 제공하지 않았습니다. 이러한 방법에 대한 내 업데이트 코드를 참조하십시오. – zaph