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!
InformationsquelleAutor Simon Lee | 2010-02-17