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;
}
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
Vous devez vous connecter pour publier un commentaire.
Utilisé pour la mise en forme des commentaires.
Avec iv:
Avec iv de 0:
Il est clair que le iv n'est pas utilisé dans l'OP code.
Code ci-dessus:
dataForHex:
. Mon CCCrypt code semble fondamentalement juste comme le vôtre et quand j'imprime le IV NSData générés par cette méthode d'assistance, il ne s'impriment exactement la sortie je m'attends. Non-zéro les valeurs hexadécimales exactement la façon dont ils ont été mis en.Gosh... Compris grâce à votre exemple correcte des données. J'étais de passage dans
kCCModeCBC
. Je comprends que la SRC par défaut, mais je voulais être explicite pour le but de la documentation. CependantkCCModeCBC
(avec la valeur 2) n'est pas d'uneCCOptions
mais unCCMode
. EtCCMode
de valeur 2 arrive à l'égalité deskCCOptionECBMode
dansCCOptions
... j'ai Donc été le démarrage accidentel de la BCE mode lorsque je voulais juste être explicite. Merci!Wow, pourquoi sont-ils du même type?
il est clair qu'ils sont en effet différents types. Ils sont de différents types:
CCCrypt
aCCOptions options
qui n'a pas de mode CBC option est la valeur par défaut.CCCryptorCreateWithMode
aCCMode
qui comprendkCCModeCBC
. La lecture de la documentation, Apple Pages de Man est toujours une option, comme c'est l'échec.OriginalL'auteur zaph
Il est également intéressant de souligner que l'on ne doit jamais contenir de la mode avec le rembourrage options. Je l'ai vu autour de un peu, et je l'ai fait tombé dans le même piège en essayant d'être un "explicite que possible".
Devrait être:
Fait amusant 1: les Deux
kCCModeEBC
etkCCOptionPKCS7Padding
partagent la même valeur: 1, et serait en fait évaluer à l'aide dekCCOptionPKCS7Padding
, qui serait alors à défaut dekCCModeCBC
.Fait amusant 2: à l'Aide de
kCCOptionPKCS7Padding | kCCModeCBC
évalue à la foiskCCOptionPKCS7Padding
drapeau etkCCOptionECBMode
définies, qui se traduit parkCCModeEBC
utilisé.Au moins je ne suis pas le seul à tomber dans ce piège 😉 bon résumé.
à l'aide de
kCCOptionPKCS7Padding
me donne des caractères supplémentaires sur PHP. Je l'ai déjà ajoutépkcs7_unpad
. (décryptage), mais encore des caractères supplémentaires dans le début.OriginalL'auteur ocgully
Le iv est utilisé uniquement pour le premier bloc de déchiffrement, d'autres blocs d'utiliser le texte de chiffrement du bloc précédent, donc c'est un peu auto-synchronisation.
Wikipédia image:
De Wikipedia Algorithme de chiffrement par bloc en mode de fonctionnement.
Donc, ramasser de déchiffrement dans le milieu de la SRC flux crypté sur une limite de bloc fonctionne sauf pour le premier bloc.
Le iv doit être correct pour le premier bloc à déchiffrer correctement. Faire un peu de débogage comme
NSLog(@"iv: %@", iv);
, je soupçonne:Cryptor dataForHex:
. Ajouter à la question d'un exemple qui présente ce y compris: encryptedData (deux premiers blocs est très bien), à la clé, iv et decryptedData (deux premiers blocs est très bien) dans l'hex dump format.OriginalL'auteur zaph
Vous pouvez lire la réponse correcte ici:
http://www.remote-exploit.org/archives/2012/01/09/the_apple_idioten_vektor_iv/
Apple a fait une erreur dans leur Bibliothèque Crypto qui suppose que si le IV vecteur n'est pas à condition de régler automatiquement la IV à une vecteur nul au lieu de retourner une erreur. IV doivent toujours être fournis pour assurer au mieux la sécurité et Apple ne devrait pas faire aucune supposition, comme il a grandement affaiblit la sécurité et la rend vulnérable aux attaques.
Généralement, c'est seulement une erreur de sécurité si la même clé est utilisée pour plus d'un message sans modifier le IV entre les messages. Si votre application dispose d'une clé différente pour chaque message, que d'avoir un fixe IV, de même que tous les zéros, est acceptable. Toutefois, cela met le fardeau de la preuve sur veillant à ce qu'il y a des clés différentes, et d'assurer la totalité de l'espace clé est utilisé. (par exemple: généré de manière aléatoire plutôt que la plaine de chaînes de texte)
OriginalL'auteur USTD