我需要在我的項目中使用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 == kCCsuccess
,inputData
和buffer
的大小爲6 & numBytesEncrypted
爲0.爲什麼我沒有收到正確的加密值?我哪裏錯了?
我想關閉/刪除這個問題,因爲我已經提出了另一個更清楚並且重要的問題。所以,請嘗試在這裏回答 - http://stackoverflow.com/questions/23637597/ios-aes-encryption-fail-to-encrypt。我不知道如何關閉/刪除我自己的問題 - 沒有看到任何適當的選項t選擇關閉此問題。 – Tvd