Objective-c AES encryption is not like Java AES encryption

Well, I'm trying to encrypt a string in an object c, extending NSData with this method:  


 @implementation NSData (AES128)

(NSData *)AES128Encrypt { char keyPtr[kCCKeySizeAES128] = {'\xe1','\xaa','\x9c','\x61','\x46','\x74','\x44','\x56','\xf0','\xe5','\x47','\x46','\x86','\xdc','\x95','\x77'};

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,keyPtr,kCCKeySizeAES128,NULL /* initialization vector (optional) /,[self 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; }

(NSData *)AES128Decrypt { char keyPtr[kCCKeySizeAES128] = {'\xe1','\xaa','\x9c','\x61','\x46','\x74','\x44','\x56','\xf0','\xe5','\x47','\x46','\x86','\xdc','\x95','\x77'};

NSUInteger dataLength = [self 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 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,kCCOptionPKCS7Padding,keyPtr, kCCKeySizeAES128,NULL /* initialization vector (optional) /,[self bytes], dataLength, / input /buffer, bufferSize, / output */&numBytesDecrypted);

if (cryptStatus == kCCSuccess) { //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; }

@end

then I call it here:  


NSString *strData = @"My string";

NSData *objNSData = [NSData dataWithData:[strData dataUsingEncoding: NSUTF8StringEncoding]];

NSLog(@"encrypted: %@",[objNSData description]);

If I just use it in the c lens, it works fine. But when I try to send it to the java server, it does not work.

My encryption data looks like this:

86fcf0fa9e3dff93dc8918ffd02ee203 12de0bf8c8ba300456293c4240296c0d

and if I try to encrypt it in java using also AES with the same key, I get the following:

86fcf0fa9e3dff93dc8918ffd02ee203 8388f173da143c6aeeb90e554259c83c

its strange because the first half of it is the same.

Does anyone know why this might happen? thank.

+3
1

Objective-C, , AES modes . , . , , Cipher Block Chaining (CBC). , Java-.

, CBC (IV), NULL (, , ). .

, , , SSL/TLS , - Keyczar . , (, ) .

+9

Source: https://habr.com/ru/post/1766938/


All Articles