2010-08-09 28 views
2

J'essaie de crypter quelque chose en utilisant 3des sur l'iphone qui doit correspondre aux résultats de Java et .NET.iPhone 3Des Cryptage des problèmes de clé Java et .NET correspondants, SecretKeySpec?

le code que j'ai est:

+ (NSString*) doCipher:(NSString*)plainText:(CCOperation)encryptOrDecrypt { 

const void *vplainText; 
size_t plainTextBufferSize; 

if (encryptOrDecrypt == kCCDecrypt) 
{ 
    NSData *EncryptData = [NSData dataWithBase64EncodedString:plainText]; 
    plainTextBufferSize = [EncryptData length]; 
    vplainText = [EncryptData bytes]; 
} 
else 
{ 
    NSData *tempData = [plainText dataUsingEncoding:NSASCIIStringEncoding]; 
    plainTextBufferSize = [tempData length]; 
    vplainText = [tempData bytes]; 
} 

CCCryptorStatus ccStatus; 
uint8_t *bufferPtr = NULL; 
size_t bufferPtrSize = 0; 
size_t movedBytes = 0; 
// uint8_t ivkCCBlockSize3DES; 

bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); 
bufferPtr = malloc(bufferPtrSize * sizeof(uint8_t)); 
memset((void *)bufferPtr, 0x0, bufferPtrSize); 

NSString *key = [NSString MD5:@"HSDNIFFU"]; 

NSData *_keyData = [key dataUsingEncoding:NSASCIIStringEncoding]; 

NSLog(@"key byte is %s", [_keyData bytes]); 

// Initialization vector; dummy in this case 0's. 
uint8_t iv[kCCBlockSize3DES]; 
memset((void *) iv, 0x0, (size_t) sizeof(iv)); 

ccStatus = CCCrypt(encryptOrDecrypt, 
        kCCAlgorithm3DES, 
        kCCOptionPKCS7Padding, 
        (const void *)[_keyData bytes], //"123456789", //key 
        kCCKeySize3DES, 
        iv, //iv, 
        vplainText, //plainText, 
        plainTextBufferSize, 
        (void *)bufferPtr, 
        bufferPtrSize, 
        &movedBytes); 

//if (ccStatus == kCCSuccess) NSLog(@"SUCCESS"); 
/*else*/ if (ccStatus == kCCParamError) return @"PARAM ERROR"; 
else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL"; 
else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE"; 
else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT"; 
else if (ccStatus == kCCDecodeError) return @"DECODE ERROR"; 
else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED"; 

NSString *result; 

if (encryptOrDecrypt == kCCDecrypt) 
{ 

// result = [[NSString alloc] initWithData: [NSData dataWithBytes:(const void *)bufferPtr length:[(NSUInteger)movedBytes] encoding:NSASCIIStringEncoding]]; 
    result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSASCIIStringEncoding] autorelease]; 
} 
else 
{ 
    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes]; 
    NSLog(@"data is: %@", myData); 
    result = [myData base64Encoding]; 
} 
return result; 

}

Ce code avec succès et déchiffre encrypte une chaîne. Comme vous pouvez le voir, il utilise md5 sur la clé. Cependant, il ne correspond pas aux résultats de .NET et java.

Le code java du développeur java ressemble:

public static byte[] encryptTripleDES(String message) throws Exception { 
    final MessageDigest md = MessageDigest.getInstance("md5"); 
    final byte[] digestOfPassword = md.digest("--KEY--".getBytes("utf-8")); 
    final SecretKey key = new SecretKeySpec(digestOfPassword, "DESede"); 
    final IvParameterSpec iv = new IvParameterSpec(new byte[8]); 
    final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); 
    cipher.init(Cipher.ENCRYPT_MODE, key, iv); 
    return cipher.doFinal(message.getBytes("utf-8")); 
} 

Malheureusement, je ne suis pas trop familier avec le cryptage java. J'ai remarqué qu'après avoir utilisé md5 sur la clé, il crée une clé secrète avec la méthode SecretKeySpec. Mon développeur Java m'a dit qu'il avait besoin de créer une clé secrète en utilisant le tableau d'octets de la clé afin qu'il puisse correspondre à la clé .NET.

Quelqu'un peut-il m'expliquer cela mieux et m'aider avec une solution pour faire correspondre les résultats des homologues .NET et Java?

Répondre

1

Je l'ai compris. La clé générée après i md5 est de 32 octets. De la lecture d'autres messages, il semble que kCCKeySize3DES est seulement de 24 octets. Si je mets une clé de 24 octets ou moins (pas md5) cela semble fonctionner parfaitement.

+0

pouvez-vous m'aider ici pls? http://stackoverflow.com/questions/12607937/3des-result-in-java-produces-different-result-from-3des-ios-version – kinghomer

+0

@ tony.tc.leung, qu'avez-vous changé dans java side et ios côté, s'il vous plaît poster le code clairement, ce serait une aide précieuse. Merci –