我需要在我的项目中使用AES-128-CBC加密/解密数据。我从我在项目中实现的here中得到了参考。但是从可用的代码中,我无法通过[self length]
和[self bytes]
行,因此我在函数中添加了一个参数并实现了相同的功能。这些行使用NSData值,但我得到'No visible ...'。我陷入了第3步,即在类中添加我想调用Encrypt方法的代码。我的代码:
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{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;
}
我要调用加密方法的类中的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方法的签名以及调用它的方式来确认。我无法理解如何处理它并使其正常工作。
如果你可以帮助通过[自我长度]和[自己字节]行,那么我也很好。我只想让它发挥作用。您可以参考链接以获取更多代码。另外我相信这段代码适用于实现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&amp; numBytesEncrypted
为0.为什么我没有收到适当的加密值?我哪里错了?
答案 0 :(得分:0)
按照说明操作,包括您选择使用的代码的注释。该实现在NSData
上创建了一个类别,对Objective-C类别进行了读取,您将使用它们。您可以考虑使用非类别但独立类的代码。
[self length]
和[self bytes]
引用数据,因为您选择的代码将加密/解密作为NSData
上的类别实现。
无需将密码转换为十六进制,然后转换为数据,只需使用
即可- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding
NSData *encryptedData = [NSData dataWithBytes:[data bytes] length:[data length]];
不调用加密方法。
你从未调用过AES128Encrypt
方法。