RNCryptor AES256 corresponds to PHP MCRYPT_RIJNDAEL_256

The PHP API Im calling from my iOS application requires the payload to be encrypted in a certain way. Im having problems replicating this approach in Objective-C, with RNCryptor.

Here is the PHP code used to encrypt the string:

function encrypt($string) {
    $key = 'some-random-key';
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
}

And this is how I try to achieve the same encryption result in Objective-C:

+ (NSData*)encryptData:(NSData*)sourceData {

    NSString *keyString = @"some-random-key";
    NSData *key = [[keyString MD5String] dataUsingEncoding:NSUTF8StringEncoding];
    NSData *iv = [[[keyString MD5String] MD5String] dataUsingEncoding:NSUTF8StringEncoding];

    NSMutableData *encryptedData = [NSMutableData data];

    RNCryptorEngine *cryptor = [[RNCryptorEngine alloc] initWithOperation:kCCEncrypt settings:kRNCryptorAES256Settings key:key IV:iv error:nil];

    [encryptedData appendData:[cryptor addData:sourceData error:nil]];
    [encryptedData appendData:[cryptor finishWithError:nil]];

    return encryptedData;

}

But the results from the two functions never match. For example, for the same line of a single word, the PHP code returns J39gRcuBEaqMIPP1VlizdA8tRjmyAB6za4zG5wcOB/8=, and in Objective-C (after starting base64EncodedStringWithOptions:as a result of NSData), Im receives 1FGpZpVm2p4z3BBY6KW2fw==.

Is there anything I need for further configuration in RNCryptor settings to make it work?

UPDATE

Ive iOS CommonCrypto, RNCryptor lib. , RNCryptor. AES128 Objective-C, PHP , ...

2

MD5String, , NSString :

- (NSString *)MD5String {
    const char *cstr = [self UTF8String];
    unsigned char result[16];
    CC_MD5(cstr, strlen(cstr), result);

    return [[NSString stringWithFormat:
            @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ] lowercaseString];
}
+2
4

,

\0

.

, PHP mcrypt \0 , Apples CommonCryptor PKCS7 (kCCOptionPKCS7Padding) . , : -, .

, PHP PKCS7 mcrypt ( ) Objective-C \0 PHP kCCOptionPKCS7Padding ( NULL CCCrypt):

NSMutableData *dataToEncrypt = [sourceData mutableCopy];
NSUInteger dataLength = [dataToEncrypt length];

// See how much padding is required
NSUInteger padding = kCCBlockSizeAES128 - (dataLength % kCCBlockSizeAES128);

// Add that many \0’s (there could be a more efficient way to do this)
for (int i=0; i<padding; i++)
    [dataToEncrypt appendData:[@"\0" dataUsingEncoding:NSASCIIStringEncoding]];

// Recalculate the data length
dataLength = dataToEncrypt.length;

RNCryptor API CommonCryptor, ( encryptedBase64String - NSString , , kHSEncryptionKey, ):

- (NSString*)encryptedBase64String {

    // Prepare the data

    NSMutableData *sourceData = [[self dataUsingEncoding:NSUTF8StringEncoding] mutableCopy];

    // Process the key

    NSString *key = [[kHSEncryptionKey MD5String] substringWithRange:NSMakeRange(0, 16)];

    char keyPtr[kCCKeySizeAES128 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    // Process the iv

    NSString *iv = [[[kHSEncryptionKey MD5String] MD5String] substringWithRange:NSMakeRange(0, 16)];

    char ivPtr[kCCKeySizeAES128 + 1];
    bzero(ivPtr, sizeof(ivPtr));
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

    // Pad the data, PHP style

    NSUInteger dataLength = [sourceData length];
    NSUInteger padding = kCCBlockSizeAES128 - (dataLength % kCCBlockSizeAES128);

    for (int i=0; i<padding; i++)
        [sourceData appendData:[@"\0" dataUsingEncoding:NSASCIIStringEncoding]];

    dataLength = sourceData.length;

    // Buffer for the resulting data

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

    // Run the encryption

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, NULL,
                                          keyPtr, kCCKeySizeAES128,
                                          ivPtr,
                                          sourceData.bytes, dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess) {
        NSData *encyptedData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        return [encyptedData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    }

    free(buffer);
    return nil;
}
0

MD5, , MCRYPT_RIJNDAEL_256 AES. 256, - 256, AES 128 . , , .

+4

, , , , . , PHP- RNCryptor, Objective-C. , .: -)

RNCryptor PHP RNCryptor Objective-C . . RNCryptor .

+4

md5 hex-ascii , php .

n php mcrypt_encrypt:

  • \0, .
  • \0 , , pkcs7.
  • , iv, , , \0.

iv - hex-ascii md5. , .

32 , 32 0 php. AES256 128- .

CommonCrypto "CommonCryptor.h":

keyLength: . .

.

Things to do:
 1. Handle data length / addition 2. Process key length

For more information, please provide sample data that you use and hex-ascii out put mcrypt_encryptbefore base64 encoding.

For reference see:
mcrypt-encrypt.php and md5.php

+1
source

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


All Articles