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.

J'ai changé le serveur à utiliser la BCE comme l'a suggéré et ne fonctionne toujours pas. D'ailleurs, j'ai remarqué que le serveur à l'aide de PKCS5 et le client à l'aide de PKCS7 mais il n'y a pas de 5 availabile sur le client et n ° 7, disponible sur le serveur, et apparemment, ils sont compatibles, de toute façon.
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