2015-01-12 65 views
0

我使用AES对文本“a”进行加密128Object-C AES 128未加密

我发现源代码在下面引发了互联网。

我试图改变密钥,但始终reuslt是一样的。

始终结果是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]; 
} 

回答

0

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); 
.... 
+0

谢谢你这么多 – HeyYo

0

你总是有一个空字符串加密。

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

的的sizeof(keyPtr)始终是4 ... 使用

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

而且getCString:返回一个布尔结果。在你的情况下,它始终是假的,但发布的代码呢不检查它。

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

+1

AES-128是相当安全的,因为好。通常,提供更高安全性的最佳方法是确保通过添加身份验证标记(例如,通过在IV和密文中使用HMAC)来验证完整性和真实性。 –

+0

谢谢你这么多,你是天才 – HeyYo

+0

没有,'的sizeof(keyPtr)'是_not_总是4!请尝试。该类型是一个char数组,不是指针。因此'sizeof(keyPtr)'实际上是'keySize + 1'。但是应该检查返回值,你是对的。 – DarkDust