AES différence entre l'iPhone (Objective-c) et Java
J'ai déchiré mes cheveux toute la journée à essayer de résoudre ce...
J'ai un objectif-c client en cours d'exécution sur l'iPhone, de la connexion à un serveur Java. L'iPhone est le chiffrement des données à l'aide d'AES mais je ne peut pas le déchiffrer sur le serveur. Je suis en utilisant une phrase de passe et le message (une seule chaîne) et je suis de la génération du tableau d'octets sur l'iPhone, générant une comparaison tableau d'octets sur le serveur Java à l'aide de la même clé et le message, mais les tableaux d'octets sont complètement différents (et donc ne peut pas être décodé sur le Java côté).
Le client est à l'aide de la CommonCrypto de la bibliothèque avec les paramètres suivants...
De données est un NSData
qui ont le mot "message" à l'aide de dataUsingEncoding:NSASCIIStringEncoding
La clé est un NSData
la tenue de la phrase "1234567891123456" de nouveau à l'aide du codage comme ci-dessus.
L'algorithme est kCCAlgorithmAES128
Options est kCCOptionsPKCS7Padding
(qui je pense correspond à la BCE sur le serveur?!)
Le serveur utilise le code suivant...
byte[] key = "1234567891123456".getBytes();
Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec k = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal("message".getBytes());
MAIS les données en encryptedData ne correspond pas à ce qui est généré dans le code objective-c, les tableaux d'octets sont complètement différents.
Peut-on voir rien d'évident, je fais de mal? Je pense les paramètres sont tous les mêmes... 🙁
- Mise à JOUR, Comme l'a demandé....
Ok, donc voilà....
client iPhone est le chiffrement de la chaîne suivante "message"
Il utilise la clé "1234567891123456"
Il utilise un vecteur d'initialisation de "1010101010101010"
C'est à l'aide de AES128, avec le mode CBC (autant que je puisse dire) et les options de kCCOptionsPKCS7Padding.
Le résultat du chiffrement (avec le codage base64) est UHIYllDFAXl81ZM7OZPAuA==
Le serveur est chiffrée la même chaîne, avec la même clé et le vecteur d'initialisation.
C'est à l'aide de la suite de Chiffrement.getInstance("AES/SRC/PKCS5Padding");
Le résultat du chiffrement (avec le codage base64) est ALBnFIHysLbvAxjvtNo9vQ==
Grâce.
- Mise à JOUR 2 - Comme l'a demandé...
Voici l'iPhone le code....
NSData *toencrypt = [@"message" dataUsingEncoding:NSASCIIStringEncoding];
NSData *pass = [@"1234567891123456" dataUsingEncoding:NSASCIIStringEncoding];
NSData *iv = [@"1010101010101010" dataUsingEncoding:NSASCIIStringEncoding];
CCCryptorStatus status = kCCSuccess;
NSData *encrypted = [toencrypt dataEncryptedUsingAlgorithm:kCCAlgorithmAES128 key:pass initializationVector:iv options:kCCOptionPKCS7Padding error:&status];
NSString *text = [NSString base64StringFromData:encrypted length:[encrypted length]];
La NSData catégorie pour le cryptage vient d'ici...
http://github.com/AlanQuatermain/aqtoolkit/tree/master/CommonCrypto/
D'ailleurs, j'ai vérifié les tableaux d'octets qui sont dans toencrypt, passer et iv et qu'ils correspondent à ceux qui sont sur le serveur.
Oui, PKCS7 rembourrage est le même que PKCS5Padding. Si la modification de la BCE n'a pas de travail, il est probable que l'iPhone est en utilisant le mode CBC. Vous devez déterminer le vecteur d'initialisation et assurez-vous que le serveur est à l'aide de la même.
Merci pour les réponses. J'ai créé un IV même sur le client et sur le serveur mais toujours pas de travail. C'est là un travail décent et fiable AES de la bibliothèque de l'iPhone est gravement défaut! 🙁
Pourriez-vous poster un extrait d'un texte clair et le texte chiffré à partir de chaque environnement?
Avez-vous essayé d'utiliser les autres variantes de l'algorithme AES sur le client? (ie. AES192, AES256)
OriginalL'auteur Simon Lee | 2009-10-28
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas mon domaine, mais cela ressemble à de la client que vous avez
PKCS7
mais sur le serveur que vous avezPKCS5
.OriginalL'auteur GameFreak
Je viens de tombé sur exactement le même problème. Je suis à l'aide de CommonCrypto sur l'iOS client, à l'aide de paramètres:
Le serveur utilise
Cipher.getInstance("AES/CBC/PKCS5Padding");
avec la même clé et le vecteur d'initialisation du client.Après cogner ma tête contre le mur pour la dernière quelques heures, j'ai finalement suivi de Jason conseils et vérifié les
dataEncryptedUsingAlgorithm
routine et imprimékeyData
juste aprèsFixKeyLengths
. Il s'avère que ma clé de 128 bits a été étendu à 192bit avec des 0 ajouté à la fin. Après la fixation de ce, tout fonctionne correctement. 🙂Mise à jour: Ma réponse a été posté presque 2 ans, et ce problème semble être résolu dans le dernier NSData+CommonCrypto code. Plus précisément, c'est la partie qui a causé le problème:
La première case
keyLength <= 16
n'était pas là avant.Si vous rencontrez toujours des problèmes maintenant, il est probablement quelque chose d'autre.
Je suis confronté à la même question. Merci de partager votre code.
OriginalL'auteur ylian
Ce mode est l'iPhone à l'aide d'AES? Vous n'avez pas de liste quoi que ce soit, alors peut-être que cela signifie qu'il n'utilisant pas de chaînage (BCE).
Cependant, sur le Java côté, vous êtes à l'aide de la SRC, mais pas la spécification d'un vecteur d'initialisation. C'est absolument faux. Si vous êtes vraiment à l'aide de la SRC, vous ont à l'IV qui a été utilisé lors du chiffrement. Le IV n'est pas un secret, il peut être envoyé avec le texte chiffré.
Si vous êtes vraiment à l'aide de la BCE, il n'y a pas de IV, mais votre Java spécifie le mode incorrect.
OriginalL'auteur erickson
Basé sur vos échantillons, le serveur est en train de faire, et le client ne l'est pas.
En regardant les données, je suppose que la clé est le problème. Merci de nous montrer l'iPhone code, en particulier le code pour passer de la "1234567891123456" de votre clé.
OriginalL'auteur Rasmus Faber
Récemment, j'ai couru à travers ce dans un autre projet. Le problème est que la clé a été un octet trop long pour tenir dans la
char
tampon à l'intérieur de ladataEncryptedUsingAlgorithm
méthode.Le problème était que la
getBytes
méthode sur laNSString
était douce,-à défaut. Il serait de copier la plupart de la chaîne de caractères dans la mémoire tampon, mais alors, étant donné que la clé a été un octet trop longtemps, il "marque" l'opération a échoué en définissant le premier char àNUL
(char 0).Pas de plus dans cette méthode dans Xcode et voir ce que votre clé char[16] tampon ressemble. Il peut avoir ce même problème, et avoir le contenu
{ 0, '2', '3', '4', ... }
.OriginalL'auteur Jason