2016-07-31 9 views
-1

文字列を 'AES-128 CBC with IV'で暗号化しようとしています。ここで入力パラメータと予想される出力は次のようになります。

IVでAES-128 CBC暗号化はどのように目的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

は私のObjective 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の値は、私が別のライブラリ試してみましたB773C36749E87D3F8FED98FE52026A15

の六角がある< 42373733 43333637 34394538 37443346 38464544 39384645 35323032 36413135>、あるべき期待します

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μ[ü#Õ-ÅÄ 、ÃÆ'ââ、¬Â/¬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] '?NSString * encryptedString = [sbuf copy]'? – Larme

答えて

2

共通暗号は、iOSとOSXの暗号化に使用する正しいものです。正しい入力を提供する問題。

入力キー、ivおよびデータは16進数で表示されます。 Cryptomathicは入力が16進数であることを期待しており、出力は16進数であるため正常に動作します。

しかしにObjCコードは使用しています:文字列として進数を使用しています

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

関連する問題