CCCrypt décryptage AES CBC fonctionne même sans IV

J'ai un problème lié, où déchiffrement d'un fichier qui a été chiffré à l'aide de CCCrypt de l'AES en mode CBC avec une étude randomisée, en 16 bits IV produit exactement la même sortie que je passe dans le même correct IV utilisée pour le chiffrement ou pas du tout.

Ce que j'attends: à l'aide d'un NULL IV pour le déchiffrement ne devrait pas entraîner une correcte de déchiffrement.
Ce que j'observe: à l'aide d'un NULL IV résultats dans le même résultat qu'avec la IV utilisée pour le chiffrement.

Ci-dessous un souci d'exhaustivité, voici le code snippets, iv est transmis sous la forme de 16 octets en toute sécurité randomisés NSData.

Ce que je ne suis pas à comprendre ici? Est CCCrypt en quelque sorte de trouver la IV à partir de données chiffrées par lui-même? Je ne pouvais pas trouver quoi que ce soit autour que dans les docs.

- (NSData *)encryptedDataForData:(NSData *)rawData
withKey:(NSData *)key
iv:(NSData *)iv
error:(NSError __autoreleasing**)error
{
size_t outLength;
NSMutableData *cipherData = [NSMutableData dataWithLength:rawData.length + kAlgorithmBlockSize];
CCCryptorStatus result = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCModeCBC,
key.bytes,
key.length,
iv.bytes,
rawData.bytes,
rawData.length,
cipherData.mutableBytes,
cipherData.length,
&outLength);
if (result == kCCSuccess) {
cipherData.length = outLength;
return cipherData;
} else {
return nil;
}
}
- (NSData *)decryptedDataForData:(NSData *)encryptedData withKey:(NSData *)key error:(NSError __autoreleasing**)error
{
size_t outLength;
NSMutableData *decryptedData = [NSMutableData dataWithLength:encryptedData.length];
//this line is just to illustrate how setting the exact same iv here - if this one
//was used for encryption - results in same output as when passing iv = NULL
NSData *iv = [Cryptor dataForHex:@"724a7fc0 0d8ac9d5 f09ff4c1 64d2d1bb"];
CCCryptorStatus result = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCModeCBC,
key.bytes,
key.length,
iv.bytes, //iv OR NULL --> same result o_O
encryptedData.bytes,
encryptedData.length,
decryptedData.mutableBytes,
decryptedData.length,
&outLength);
if (result == kCCSuccess) {
decryptedData.length = outLength;
return decryptedData;
} else {
return nil;
}
}

EDIT:

Pour revenir sur ce, n'importe qui IV-je utiliser pour le décryptage (essayé un couple de différents randomisés IV) je fais toujours obtenir de l'octet les résultats identiques. Même quand j'décrypter certains seulement partielle morceau d'un fichier crypté à partir de quelque part au milieu d'un fichier crypté.

Est-ce peut-être liées à des données réelles, je suis fr/décryptage (fichiers mp3)?

Quand je viens de passer un certain arbitraire partie de l'effectif du fichier crypté pour le déchiffreur, il ne devrait pas exiger le bloc sur la droite avant que le bloc de données (que je n'ai pas de prévoir expressément que le IV) de faire le bon décryptage? La seule explication que j'ai pu penser ici personnellement, c'est que CCCrypt juste utilise toujours le premier de 16 octets que le IV et ne déchiffre pas les personnes mais les gouttes dans la sortie.

EDIT 2:

Sortie fr/déchiffrement, montrant les deux premiers blocs de dans et de sortie de données, la clé et le iv:

# encryption
data <4cd9b050 30c04bf9 2a0cb024 19010a31 400c2261 0069196a d77bcae6 9799ae26>
iv <724a7fc0 0d8ac9d5 f09ff4c1 64d2d1bb>
key <78656a1a 337fddd6 fa52e34d 9156d187>
encrypted <cf85cdbe 10a87309 a6fb4c4e ce640619 8f445b70 3738018a e78291a7 b4ea26ce>
# decryption with correct IV
data <cf85cdbe 10a87309 a6fb4c4e ce640619 8f445b70 3738018a e78291a7 b4ea26ce>
iv <724a7fc0 0d8ac9d5 f09ff4c1 64d2d1bb>
key <78656a1a 337fddd6 fa52e34d 9156d187>
decrypted <4cd9b050 30c04bf9 2a0cb024 19010a31 400c2261 0069196a d77bcae6 9799ae26>
# decryption with zero IV
data <cf85cdbe 10a87309 a6fb4c4e ce640619 8f445b70 3738018a e78291a7 b4ea26ce>
iv <00000000 00000000 00000000 00000000>
key <78656a1a 337fddd6 fa52e34d 9156d187>
decrypted <4cd9b050 30c04bf9 2a0cb024 19010a31 400c2261 0069196a d77bcae6 9799ae26>
# decryption with different IV
data <cf85cdbe 10a87309 a6fb4c4e ce640619 8f445b70 3738018a e78291a7 b4ea26ce>
iv <12345678 9abcdef1 23456789 abcdef12>
key <78656a1a 337fddd6 fa52e34d 9156d187>
decrypted <4cd9b050 30c04bf9 2a0cb024 19010a31 400c2261 0069196a d77bcae6 9799ae26>

EDIT 3:

Le code pour -dataForHex: est:

+ (NSData *)dataForHex:(NSString *)hex
{
NSString *hexNoSpaces = [[[hex stringByReplacingOccurrencesOfString:@" " withString:@""]
stringByReplacingOccurrencesOfString:@"<" withString:@""]
stringByReplacingOccurrencesOfString:@">" withString:@""];
NSMutableData *data = [[NSMutableData alloc] init];
unsigned char whole_byte = 0;
char byte_chars[3] = {'\0','\0','\0'};
for (NSUInteger i = 0; i < [hexNoSpaces length] / 2; i++) {
byte_chars[0] = (unsigned char) [hexNoSpaces characterAtIndex:(NSUInteger) (i * 2)];
byte_chars[1] = (unsigned char) [hexNoSpaces characterAtIndex:(NSUInteger) (i * 2 + 1)];
whole_byte = (unsigned char)strtol(byte_chars, NULL, 16);
[data appendBytes:&whole_byte length:1];
}
return data;
}
Notez que "Si le mode CBC est sélectionné et IV est fourni, une IV de tous les zéros seront utilisés." Donc, si vous comparez avec un IV de toutes à zéro avec la valeur NULL, alors vous attendez à ce que le même résultat. Si vous voulez des réponses de meilleure qualité, s'il vous plaît montrer échantillon IV et de décryptage des résultats en caractères hexadécimaux.
J'ai ajouté l'exemple des sorties (deux premiers blocs) de cryptage et le décryptage de mon fichier d'exemple. Il montre la clé, iv de données et les données qu'ils sont passés dans / hors de la CCCrypt à l'aide du code ci-dessus.
Il semble que le iv n'est pas utilisé. Avec le iv, les données chiffrées sont: d2c2efee 54e43781 549eec03 9db688e1 7c4248e7 e2ac1d80 7105ffae 4043ffb3. C'est à l'aide de mon code de test, de voir une nouvelle réponse.
Où est le code pour Cryptor dataForHex?
CCCrypt est une fonction simple avec seulement quelques paramètres d'entrée, il n'y a pas de magie, c'est savoir travailler. Si elle n'est pas de fournir des résultats corrects les paramètres d'entrée ne sont pas correctes.

OriginalL'auteur Dennis | 2014-11-19