如何使用AES加密十六进制十进制密钥?

时间:2012-07-07 11:27:42

标签: objective-c c aes

我的问题是我需要使用以下十六进制密钥进行加密,但它假定它是一个字符串?

key = 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11

我曾尝试在CCrypt函数中使用[key bytes]而不是keyptr,但它不起作用......

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

// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES128]={'1'};; // room for terminator (unused) // oorspronkelijk 256
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

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

NSLog(@"keyPtr %s",keyPtr);

NSUInteger dataLength = [Data 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, kCCOptionECBMode,
                                      keyPtr, 
                                      kCCKeySizeAES128, // oorspronkelijk 256
                                      nil, /* initialization vector (optional) */
                                      [Data bytes], 
                                      dataLength, /* input */
                                      buffer, 
                                      bufferSize, /* output */
                                      &numBytesEncrypted);


if (cryptStatus == kCCSuccess) {
    NSLog(@"Encrypt SUCCESS");
    //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;

}

- (NSData *)AES128DecryptWithKey:(NSString *)key theData:(NSData *)Data{

// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES128+1]; // room for terminator (unused) // oorspronkelijk 256
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSASCIIStringEncoding];

NSUInteger dataLength = [Data 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 numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionECBMode+kCCOptionPKCS7Padding,
                                      keyPtr, kCCKeySizeAES128, // oorspronkelijk 256
                                      NULL /* initialization vector (optional) */,
                                      [Data bytes], dataLength, /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesDecrypted);

if (cryptStatus == kCCSuccess) {
    NSLog(@"Decrypt SUCCESS");
    //the returned NSData takes ownership of the buffer and will free it on deallocation
    return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}

free(buffer); //free the buffer;
return nil;

}

1 个答案:

答案 0 :(得分:0)

您可以使用NSScanner,如下所示:

NSString *keyStr = @"0x11,0x12,0x13,0x14,0x13,0x1a,0x1b,0x1c,0x1f,0x11,0x11,0x11,0x11,0x11,0x11,0xfe";
NSScanner *scan = [NSScanner scannerWithString:keyStr];
[scan setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@","]];
unsigned int tmp;
char key[16];
for (int i = 0 ; i != 16 ; i++) {
    [scan scanHexInt:&tmp];
    key[i] = (char)tmp;
}

此时,数组key包含16个字节的密钥,从十六进制转换为字节。