【问题标题】:Object-C AES 128 is not encryptedObject-C AES 128 未加密
【发布时间】:2015-03-10 09:23:38
【问题描述】:

我使用 AES 128 加密文本“a”

我在下面找到了来源。

我尝试更改密钥,但结果总是相同。

结果总是 8e4a3d4beb92d54c7e95f67d41daed59

NSString *key = @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
//  NSString *key = @"00000000000000000000000000000000";
plainText = @"a";

cipherData = [ [ plainText dataUsingEncoding:NSASCIIStringEncoding] AES128EncryptWithKey:key];

NSString * str = [self hexEncode : cipherData ];
NSLog( @"str = %@", str );

- (NSData*) iAESEncrypt:(NSString *)key keySize:(int)keySize {
    if(key == nil)
        return nil;

    char keyPtr[keySize+1];
    bzero( keyPtr, sizeof(keyPtr) );

    [key getCString: keyPtr maxLength: sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    size_t numBytesEncrypted = 0x00;

    NSUInteger dataLength = [self length];
    size_t     bufferSize = dataLength + kCCBlockSizeAES128;
    void      *buffer     = malloc(bufferSize);

    CCCryptorStatus result = CCCrypt( kCCEncrypt,
                                     kCCAlgorithmAES128,
                                     kCCOptionECBMode | kCCOptionPKCS7Padding,
                                     keyPtr,
                                     keySize,
                                     NULL /*iv*/,
                                     [self bytes], [self length],
                                     buffer, bufferSize,
                                     &numBytesEncrypted );

    if( result == kCCSuccess )
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    else
        NSLog(@"iAESEncrypt FAIL!");

    free(buffer);
    return nil;
}

-(NSString *) hexEncode:(NSData*)data
    {
        NSMutableString *hex = [NSMutableString string];
        unsigned char *bytes = (unsigned char *)[data bytes];
        char temp[3];
        NSUInteger i = 0;

        for (i = 0; i < [data length]; i++)
        {
            temp[0] = temp[1] = temp[2] = 0;
            (void)sprintf(temp, "%02x", bytes[i]);
            [hex appendString:[NSString stringWithUTF8String:temp]];
        }
        return hex; 
    }



- (NSData*)AES128EncryptWithKey:(NSString*)key 
{

    return [self iAESEncrypt:key keySize:kCCKeySizeAES128];
}

【问题讨论】:

    标签: ios objective-c encryption


    【解决方案1】:

    您的 key 变量的长度为 32,这可能是十六进制数据。所以首先,您必须将其转换为长度为kCCKeySizeAES128(16 字节)的NSData

    您可以使用您的hex decoder 代码或感谢此处的十六进制转换代码https://stackoverflow.com/a/7318062/296651

    ....
    key = [key stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSMutableData *commandToSend= [[NSMutableData alloc] init];
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    int i;
    for (i=0; i < [key length]/2; i++) {
        byte_chars[0] = [key characterAtIndex:i*2];
        byte_chars[1] = [key characterAtIndex:i*2+1];
        whole_byte = strtol(byte_chars, NULL, 16);
        [commandToSend appendBytes:&whole_byte length:1];
    }
    
    
    size_t numBytesEncrypted = 0x00;
    
    NSUInteger dataLength = [self length];
    size_t     bufferSize = dataLength + kCCBlockSizeAES128;
    void      *buffer     = malloc(bufferSize);
    memset(buffer, 0, bufferSize);
    
    CCCryptorStatus result = CCCrypt( kCCEncrypt,
                                     kCCAlgorithmAES128,
                                     kCCOptionECBMode | kCCOptionPKCS7Padding,
                                     [commandToSend bytes],
                                     keySize,
                                     NULL /*iv*/,
                                     [self bytes], [self length],
                                     buffer, bufferSize,
                                     &numBytesEncrypted );
    ....
    

    【讨论】:

      【解决方案2】:

      你总是用空字符串加密。

      [key getCString: keyPtr maxLength: sizeof(keyPtr) encoding:NSUTF8StringEncoding];
      

      sizeof(keyPtr) 总是 4... 使用

      [key getCString: keyPtr maxLength: keySize encoding:NSUTF8StringEncoding];
      

      而 getCString: 正在返回一个 BOOL 结果。在您的情况下,它始终为 false,但发布的代码并未对其进行检查。

      several AES 实现,这是正确的。我可以推荐使用 AES256 而不是 128。它更安全。

      【讨论】:

      • AES-128 也非常安全。通常,提供更多安全性的最佳方法是确保通过添加身份验证标签来验证完整性和真实性(例如,通过使用基于 IV 和密文的 HMAC)。
      • 非常感谢你是天才
      • 不,sizeof(keyPtr)不是总是 4!请尝试一下。类型是 char 数组,而不是指针。因此sizeof(keyPtr) 真的是keySize+1。但是应该检查返回值,你是对的。
      • 另外,kCCAlgorithmAES128 大约是 block 大小,而不是 key 大小。恕我直言,常量的名称具有误导性。这是因为 Rijndael 算法能够使用不同的块长度,但对于 AES,只有 16 字节块被标准化。因此,要获得通常所说的“AES256”,您只需提供适当大小的密钥 (kCCKeySizeAES256)。
      猜你喜欢
      • 2018-01-08
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 2013-08-11
      • 2019-04-18
      • 2013-02-23
      相关资源
      最近更新 更多