Comment puis-je faire mon chiffrement AES identiques entre Java et Objective-C (iPhone)?
Je suis crypter une chaîne de caractères en objective-c et aussi cryptage de la même chaîne de caractères en Java en utilisant AES et je vois de drôles de questions. La première partie du résultat des matchs jusqu'à un certain point, mais il est différent, donc quand je vais à décoder le résultat de Java sur l'iPhone il ne peut pas le déchiffrer.
Je suis l'aide d'une source de la chaîne de "Maintenant et puis qu'est-ce que ce non-sens tout au sujet. Le savez-vous?"
À l'aide d'une clé de "1234567890123456"
Le code objective-c pour chiffrer est le suivant: REMARQUE: il est NSData catégorie donc supposer que la méthode est appelée sur une NSData objet "self" contient l'octet de données à chiffrer.
- (NSData *)AESEncryptWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES128+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, kCCKeySizeAES128,
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;
}
Et la java code de cryptage est...
public byte[] encryptData(byte[] data, String key) {
byte[] encrypted = null;
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
byte[] keyBytes = key.getBytes();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
encrypted = new byte[cipher.getOutputSize(data.length)];
int ctLength = cipher.update(data, 0, data.length, encrypted, 0);
ctLength += cipher.doFinal(encrypted, ctLength);
} catch (Exception e) {
logger.log(Level.SEVERE, e.getMessage());
} finally {
return encrypted;
}
}
L'hex de sortie du code objective-c est -
7a68ea36 8288c73d f7c45d8d 22432577 9693920a 4fae38b2 2e4bdcef 9aeb8afe 69394f3e 1eb62fa7 74da2b5c 8d7b3c89 a295d306 f1f90349 6899ac34 63a6efa0
et la java de sortie est -
7a68ea36 8288c73d f7c45d8d 22432577 e66b32f9 772b6679 d7c0cb69 037b8740 883f8211 748229f4 723984beb 50b5aea1 f17594c9 fad2d05e e0926805 572156d
Comme vous pouvez le voir, tout est parfait jusqu'à -
7a68ea36 8288c73d f7c45d8d 22432577
Je devine que j'ai certains des paramètres différents, mais ne peut pas travailler sur ce, j'ai tenté de changer entre la BCE et de la CBC sur le java côté et il n'a eu aucun effet.
Peut aider quelqu'un!? s'il vous plaît....
- Les gars, vous m'a sauvé d'un auto-maintien de cauchemar... Merci!
Vous devez vous connecter pour publier un commentaire.
Depuis le CCCrypt prend un IV, n'est-il pas utiliser un chaînage de méthode de chiffrement par bloc (CBC)? Ce serait cohérent avec ce que vous voyez: le premier bloc est identique, mais dans le deuxième bloc de la version de Java s'applique la clé d'origine pour chiffrer, mais le OSX version semble utiliser quelque chose d'autre.
EDIT:
De ici j'ai vu un exemple. Semble que vous avez besoin pour passer le kCCOptionECBMode à CCCrypt:
EDIT 2:
J'ai joué un peu avec une certaine ligne de commande pour voir laquelle était la bonne. Je pensais que je pouvais y contribuer:
J'ai passé quelques semaines à déchiffrer une base64, AES256 chaîne cryptée. Le chiffrement a été fait par CCCrypt (Objective-C)sur un iPad. Le déchiffrement a été réalisé en Java (à l'aide de Château Gonflable).
J'ai enfin réussi, et il a appris beaucoup de choses dans le processus. Le code de cryptage est exactement le même que ci-dessus (je suppose que c'est pris à partir de l'Objective-C de l'échantillon dans l'iPhone developer documentation).
Ce CCCrypt() documentation ne mentionne PAS, c'est qu'il utilise le mode CBC par défaut (si vous ne spécifiez pas une option comme kCCOptionECBMode). Il est mentionné que le IV, si non spécifié, par défaut à tous les zéros (donc, IV sera un tableau d'octets de 0x00, 16 membres de la longueur).
À l'aide de ces deux éléments d'information, vous pouvez créer une fonctionnellement identique au module de chiffrement à l'aide de la SRC (et d'éviter l'utilisation de la BCE, ce qui est moins sûr) sur Java et OSx/iphone/ipad(CCCrypt).
Le Chiffrement de la fonction init va prendre le IV tableau d'octets en tant que troisième argument:
Cipher.init()
. Ce que vous avez à faire est de (1) obtenir uneAlgorithmParameters
objet (à l'aide de lagetInstance()
fabrique de classe de la méthode, (2) magasin de la le IV de l'objet parameter :params.init(new IvParameterSpec(iv));
et (3) passer leparams
objet comme troisième argument decipher.init()
.Pour quelqu'un d'autre qui en a besoin, désavouer était absolument parfait... la version révisée de la demande afin de créer de la crypte en objective-c est comme suit (notez que vous devez la BCE mode ET le rembourrage)...
Juste à ajouter au premier post: dans votre objective-C/cocoa code que vous avez utilisé le mode CBC et dans votre code java que vous avez utilisé EBC et un vecteur d'initialisation IV n'a pas été utilisé dans les deux.
EBC niveau de chiffrement est bloc par bloc et de la CBC chaînes sur le bloc précédent, donc si votre texte est plus petit que 1 bloc (=16 octets dans votre exemple), l'algorithme de chiffrement texte produit par les deux sont decryptable par l'autre (le même).
Si vous êtes à la recherche d'un moyen de normaliser l'utilisation des algorithmes de chiffrement, NIST Special Publication 800-38A, Édition 2001 a de vecteurs de test. Je peux poster le code de l'AES-CBC et EBC vecteurs si c'est utile à tout le monde.