【发布时间】:2014-05-12 13:29:00
【问题描述】:
我需要在我的项目中使用 AES-128-CBC 加密/解密数据。我从here 获得了参考,我已经在我的项目中实现了它。但是从可用的代码中,我无法通过[self length] 和[self bytes] 行,因此我在函数中添加了一个参数并实现了相同的。这些行正在使用 NSData 值,但我得到“不可见 ...”。我被困在第 3 步,即在我想调用 Encrypt 方法的类中添加代码。我的代码:
标题
@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{Kd@5q4+";
@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;
}
我想调用加密方法的类中的代码
// 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。为什么我没有收到正确的加密值?我哪里错了?
【问题讨论】:
-
我想关闭/删除这个问题,因为我已经问了另一个更清楚、更中肯的问题。所以,请尝试在这里回答 - stackoverflow.com/questions/23637597/…。我不确定如何关闭/删除我自己的问题 - 没有看到任何合适的选项来关闭这个问题。
标签: ios objective-c encryption cryptography