Gere a mesma string criptografada AES / CBC / PKCS7Padding em Objective C, .net e Android

Aug 28 2020

Desejo gerar a mesma string criptografada em iOS, android em .net. Posso gerar a mesma string android e em .net, mas diferente para Objective C.

Código Android:

public static String encrypt(String key, String value) {
    try {
        SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES");
        AlgorithmParameterSpec iv = new IvParameterSpec(key.getBytes());
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        return new String(Base64.encode(cipher.doFinal(value.getBytes("UTF-8")), Base64.NO_WRAP));

    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

código de backend

public Encryption(input: string): any {

return CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(input), this.Cryptokey,

{

    keySize: 128 / 8,

    iv: this.iv,

    mode: CryptoJS.mode.CBC,

    padding: CryptoJS.pad.Pkcs7

});

} e no código Objective C

- (NSData *)AES256EncryptWithKey:(NSString *)key

{

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

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

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'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, kCCOptionPKCS7Padding,
                                      keyPtr, kCCKeySizeAES256,
                                      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;

}

e eu segui esses URLs Criptografar AES / CBC / PKCS7Padding

Como criptografar com AES 256 CBC em Objective C

A criptografia AES CBC com PKCS7Padding tem resultados diferentes em Java e Objective-C

De acordo com meu entendimento do Objective C, primeiro preciso converter a senha em NSData e depois passá-la para o método de criptografia AES. Este método retornará para mim dados criptografados agora eu preciso converter isso em codificação de string de base 64. Alguém pode me sugerir o que devo fazer para gerar o mesmo resultado para iOS, Android e .net?

Por exemplo, se eu quiser criptografar a string "xceedancce" em todas as 3 plataformas e minha chave é 7061737323313233

então, no Android e .net, o resultado é "uXDlYA4e8Z8HWd9rvNdXaw ==" mesmo, mas no iOS

é "l4zDDnwOVJ0dz2fl7HdKIA ==" Alguém pode sugerir o que devo fazer em Objective C?

Obrigado.

Respostas

2 Chandni Sep 02 2020 at 11:20

Obrigado, Rob. Usei a biblioteca RNCryptor para ambos (Objective C e C #) e resolveu meu problema.

Aqui está meu código para Objective C:

-(NSString *)encryptUsingRNCryptor:(NSString *)strPassword{

NSData *data = [strPassword dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSData *encryptedData = [RNEncryptor encryptData:data
                                    withSettings:kRNCryptorAES256Settings
                                          password:kKeyForEncryption
                                             error:&error];
NSString *encryptString = [encryptedData base64EncodedStringWithOptions:0];

NSLog(@"enccrypted data ----->>>## %@ ## %@", encryptedData, encryptString);

// Decryption

NSData *decryptedData = [RNDecryptor decryptData:encryptedData
                                    withPassword:kKeyForEncryption
                                           error:&error];
NSString *decodedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];

NSLog(@" Decryted data ----%@ --------and string %@", decryptedData, decodedString);

return [encryptedData base64EncodedStringWithOptions:0];

}

e para a descriptografia C # usamos a biblioteca RNCryptor-cs.

Mais uma vez, obrigado Rob :)