iOS加密/解密需要指导

时间:2014-05-12 13:29:01

标签: ios objective-c encryption cryptography

我需要在我的项目中使用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 == kCCsuccessinputDatabuffer的大小为6&amp; numBytesEncrypted为0.为什么我没有收到适当的加密值?我哪里错了?

1 个答案:

答案 0 :(得分:0)

按照说明操作,包括您选择使用的代码的注释。该实现在NSData上创建了一个类别,对Objective-C类别进行了读取,您将使用它们。您可以考虑使用非类别但独立类的代码。

[self length][self bytes]引用数据,因为您选择的代码将加密/解密作为NSData上的类别实现。

无需将密码转换为十六进制,然后转换为数据,只需使用

即可
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

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

不调用加密方法。
你从未调用过AES128Encrypt方法。