【问题标题】:iOS Encrypt/Decrypt Need GuidanceiOS 加密/解密需要指导
【发布时间】: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 == kCCsuccessinputDatabuffer 的大小为 6,numBytesEncrypted 为 0。为什么我没有收到正确的加密值?我哪里错了?

【问题讨论】:

  • 我想关闭/删除这个问题,因为我已经问了另一个更清楚、更中肯的问题。所以,请尝试在这里回答 - stackoverflow.com/questions/23637597/…。我不确定如何关闭/删除我自己的问题 - 没有看到任何合适的选项来关闭这个问题。

标签: ios objective-c encryption cryptography


【解决方案1】:

按照说明进行操作,包括您选择使用的代码中的 cmets。该实现在NSData 上创建了一个类别,阅读Objective-C 类别是您将要使用它们。您可以考虑使用不是类别而是独立类的代码。

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

密码不用转成十六进制再转成数据,直接用

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

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

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

【讨论】:

  • 在 AES128Encrypt 方法中,为什么我无法访问 [self length] & bytes 方法。这两行给出了错误 - “'MC_AES' 没有可见界面声明选择器'长度”。如何摆脱这种情况以使用没有任何参数的方法?
  • 按照说明,包括您选择使用的代码中的 cmets,或选择您更了解的其他实现。
  • 是的,我更喜欢使用独立类。下一行即 NSData *decryptedData = [encryptedData AES128Decrypt];调用 AES128Encrypt 方法。我无法弄清楚如何称呼它并且被他们困住了。谢谢。
  • @Zapah,请您检查问题中的更新 1。我尝试调用该方法并返回 0。你能帮我解决这个问题吗?请。我需要帮助。谢谢。
  • 现在您的问题是了解如何使用类别,而不是密码问题。您要么需要学习/学习/理解如何使用它们,要么需要找到另一种方法。我个人尽可能避免使用类别。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 2017-11-03
  • 2017-08-12
  • 2014-12-16
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多