2016-10-24 1 views
0

J'essaye finalement de crypter un fichier avec OpenSSL et de le décrypter avec Objective-c CommonCrypto, mais avant cela, j'ai besoin des deux approches pour crypter de la même manière.Cryptage avec OpenSSL et CommonCrypto

C'est ce que j'ai:

chaîne à chiffrer: "Ceci est la chaîne"

clé: "thisisthekey"

OpenSSL:

openssl enc -aes256 -a -e -nosalt -in InputFileWithString.txt -out OutputFile.txt thisisthekey 

base résultant 64 encodée chaîne de openSSL: HncUM4ryxSR7Rdi7Z49HPl9veOPxkk3l8GYIgorBhbk=

Objectif -c CommonCrypto:

+(NSString *)encryptText:(NSString *)text withKey:(NSString *)key{ 
    NSData *plainData = [text dataUsingEncoding:NSUTF8StringEncoding]; 

    NSData *encryptedData = [plainData AES256EncryptWithKey:key]; 

    NSString *base64String = [encryptedData base64EncodedStringWithOptions:0]; 

    return base64String; 
} 

- (NSData*)AES256EncryptWithKey:(NSString*)key { 
    char keyPtr[kCCKeySizeAES256 + 1]; 
    bzero(keyPtr, sizeof(keyPtr)); 

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

    NSUInteger dataLength = [self length]; 

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

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES256, 
              NULL, 
              [self bytes], dataLength, 
              buffer, bufferSize, 
              &numBytesEncrypted); 

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

    free(buffer); 
    return nil; 
} 

La base résultante 64 chaîne codée: gNCs4d0GAxZHRcOtu8RVpLgN0ONKk1r5XkJ4GtL7W2I=

Comme vous pouvez le voir, chaque approche produit une autre chaîne cryptée. Des idées comment faire ces deux produisent la même chaîne?

+1

Jetez un oeil à https://github.com/rnapier/RNOpenSSLCryptor qui vous guide à travers cela et il se termine. "thisisthekey" n'est pas une clé correcte (voir la réponse de zaph ci-dessous). Il est probable que vous vouliez vraiment utiliser un mot de passe, que RNOpenSSLCryptor va gérer pour vous. –

+0

Essayez [OpenSSL EVP_BytesToKey CommonCrypto site: stackoverflow.com] (https://www.google.com/search?q=openssl+evp_bytestokey+commoncrypto+site%3Astackoverflow.com) – jww

+0

Celui-ci semble très pertinent: [Comment décrypter données avec l'outil Openssl crypté avec AES128 dans iOS] (http://stackoverflow.com/q/7535501), mais la réponse n'est pas très bonne car elle vous dit de visiter un blog. – jww

Répondre

0
+0

Notes sur le chiffrement lié: 1. tailles de clé valides pour AES sont 128 192 et 256 octets. 2. Un IV aléatoire doit être utilisé ou deux messages identiques seront identiques, même si seule la première partie est la même information peut être déterminée. Créez un IV aléatoire avec SecRandomCopyBytes(), utilisez-le et comme indiqué précédemment ajoutez-le aux données cryptées. 3. La clé hexagonale doit être validée en longueur, le simple remplissage peut présenter des problèmes d'interopérabilité. – zaph

1
  1. Utilisez une clé pleine longueur, 256 bits de 32 octets, ne comptez pas sur le remplissage. CCCrypt attend une clé de 32 octets due à kCCKeySizeAES256 mais vous fournissez 12 octets et aucun remplissage de l'espace clé restant.

  2. La valeur par défaut pour CCCrypt est le mode CBC mais vous fournissez une valeur NULL IV. Cela vous donnera essentiellement le mode ECB mais il est préférable de spécifier l'option: kCCOptionECBMode.