2014-05-12 65 views
0

我需要在我的項目中使用AES-128-CBC加密/解密數據。我從我的項目中實施的here中獲得了參考。但從可用的代碼,我無法通過[self length][self bytes]行,因此我添加了一個參數給函數並實現相同。這些行正在使用NSData值,但是我得到'不可見...'。我被困在步驟3中,即在我想調用加密方法的類中添加代碼。我的代碼:iOS加密/解密需要指導

HEADER

@interface MC_AES : NSObject 

- (NSData*)AES128Decrypt : (NSData*) inputData; 
- (NSData*)AES128Encrypt : (NSData*) inputData; 

@end 

實現

#include <CommonCrypto/CommonCryptor.h> 
#import "MC_AES.h" 


NSString *iv = @"DFR55d+.njT]W-WW"; 
NSString *key = @"HGYJ4RXc{[email protected]+"; 

@implementation MC_AES 

-(NSData*)AES128Encrypt : (NSData*) inputData 
{ 
    char ivPtr[kCCKeySizeAES128 + 1]; 
    bzero(ivPtr, sizeof(ivPtr)); 

    // fetch iv data 
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; 


    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
    char keyPtr[kCCKeySizeAES128 + 1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [inputData length]; 

    //See the doc: For block ciphers, the output size will always be less than or 
    //equal to the input size plus the size of one block. 
    //That's why we need to add the size of one block here 
    size_t bufferSize   = dataLength + kCCBlockSizeAES128; 
    void* buffer    = malloc(bufferSize); 

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 0, 
              keyPtr, kCCKeySizeAES128, 
              ivPtr/* initialization vector (optional) */, 
              [inputData bytes], dataLength, /* input */ 
              buffer, bufferSize, /* output */ 
              &numBytesEncrypted); 


    if (cryptStatus == kCCSuccess) 
    { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

CODE類,我想打電話給加密方法

// I need to encrypt password, so will have to convert password to hex value and pass here to Encrypt 
- (void) testActuallyEncrypting :(NSString*) hexString { 
    NSLog(@"Encrypted HexString : %@", hexString); // password in hex value 

    // Convert hex to NSData object 
    NSData *data = [self dataFromHexString:hexString]; 

    // Prepare the NSDAta obj to store the encrypted pswd 
    NSData *encryptedData = [NSData dataWithBytes:[data bytes] length:[data length]]; 

    // ***** How can I access this here ?? 
    //NSData *decryptedData = [encryptedData AES128Decrypt]; 
    //NSString *decryptedString = [NSString stringWithUTF8String:[decryptedData bytes]]; 
    //NSLog(@"Decrypted String : %@", decryptedString); 
    ....... 
    ........ 
} 

我查詢 - 如何訪問AES128Decrypt方法 - (1)我必須通過它(數據)的一個參數,我相信,即我需要加密的數據。 (2)如果不創建該類的對象或其不是靜態的,我怎樣才能調用這個方法?

重要的是,我需要清楚地確認AES128Encrypt/AES128Decrypt方法的簽名以及調用它的方式。我無法理解如何處理這個問題並使其工作。

如果你可以幫助獲取通過[self length]和[self bytes]行,那麼我也很好。我只是想讓它工作。您可以參考以下鏈接瞭解更多代碼。另外我相信這個代碼適用於實現AES-128-CBC加密。 任何幫助是高度讚賞。謝謝。

更新1:

,就像我跟使用獨立的類MC_AES,席力圖召AES128Encrypt如下:

- (void) testActuallyEncrypting :(NSString*) str { 
    NSLog(@"String to Encrypt : %@", str); 

    //Convert NSString to NSData 
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; //[self dataFromHexString:hexString]; 
    NSData *encryptedData = [NSData dataWithBytes:[data bytes] length:[data length]]; 
    MC_AES *aes = [[MC_AES alloc]init]; 

    encryptedData = [aes AES128Encrypt:data]; 

    NSString * encryptedStr = [NSString stringWithUTF8String:[encryptedData bytes]]; 
    NSLog(@"Encrypted data - %@", encryptedStr); 

即獲得的的EncryptedData爲0。AES128Encrypt方法中, cryptStatus == kCCsuccessinputDatabuffer的大小爲6 & numBytesEncrypted爲0.爲什麼我沒有收到正確的加密值?我哪裏錯了?

+0

我想關閉/刪除這個問題,因爲我已經提出了另一個更清楚並且重要的問題。所以,請嘗試在這裏回答 - http://stackoverflow.com/questions/23637597/ios-aes-encryption-fail-to-encrypt。我不知道如何關閉/刪除我自己的問題 - 沒有看到任何適當的選項t選擇關閉此問題。 – Tvd

回答

0

按照說明,包括您選擇使用的代碼的評論。該實現在NSData上創建一個類別,您將使用Objective-C類別中的讀取。你可能會考慮使用不是一個類別的代碼,而是一個獨立的類。

[self length][self bytes]指的是數據,因爲您選擇的代碼實現了加密/解密作爲NSData上的類別。

沒有必要轉換爲十六進制的密碼,然後將數據,只需使用

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding 

NSData *encryptedData = [NSData dataWithBytes:[data bytes] length:[data length]]; 

不調用加密方法。
您從未調用AES128Encrypt方法。

+0

在AES128Encrypt方法中,爲什麼我無法訪問[self length]&bytes方法。這2行給出了錯誤 - 「MC_AES沒有可見的接口聲明選擇器的長度」。如何擺脫這個使用這些方法沒有任何參數? – Tvd

+0

按照包含您選擇使用的代碼的註釋的說明進行操作,或者選擇您更好理解的其他實施。 – zaph

+0

是的,我更喜歡使用獨立的課程。下一行即NSData * decryptedData = [encryptedData AES128Decrypt];調用AES128Encrypt方法。我無法知道如何打電話給他們,並且被他們困住了。謝謝。 – Tvd