I need to encrypt a string on an iPhone and send it to .Net for decryption using Triple DES. I can encrypt / decrypt on iPhone and with .Net, but I get different results on both platforms.
I use the same code as AES encryption / decryption between .Net and iPhone in here
The only thing I changed .net is the encryption algorithm, so when it says AesCryptoServiceProvider, I set TripleDesServiceProvider
Like in .net, the only thing I changed is the encryption algorithm, so when it says kCCAlgorithmAES128, I add kCCAlgorithm3DES
What am I missing?
[UPDATE]
Thank you for your responses.
If I stay on the same platform, I can encrypt / decrypt without problems, but if I encrypt on iPhone and decrypt on .net, there will be a problem, because on each platform there are different results with the same inputs.
As Overslacked said, I think the problem is with the salt, but I could not find any sha or md5 documentation that the algorithm uses on each platform, or any parameter to configure it.
Here is the code that I actually use on the iPhone:
int main(int argc, char *argv[]){ NSString * _secret = @"hello"; NSString * _key = @"1234567890"; _out = [self doCipher:_secret key:_key context:kCCEncrypt]; NSLog(@"encrypted data in str: %@", _out); _outDecrypted = [StringEncryption doCipher:_out key:_key context:kCCDecrypt]; NSLog(@"decrypted data in str: %@", _outDecrypted); } + (NSString *)doCipher:(NSString *)sTextIn key:(NSString *)sKey context:(CCOperation)encryptOrDecrypt { NSMutableData * dTextIn; if (encryptOrDecrypt == kCCDecrypt) { dTextIn = [[[NSData alloc] base64DecodeString:sTextIn ]mutableCopy]; } else{ dTextIn = [[sTextIn dataUsingEncoding: NSASCIIStringEncoding]mutableCopy]; } NSMutableData * dKey = [[sKey dataUsingEncoding:NSASCIIStringEncoding]mutableCopy]; [dKey setLength:24]; uint8_t *bufferPtr1 = NULL; size_t bufferPtrSize1 = 0; size_t movedBytes1 = 0; uint8_t iv[kCCBlockSize3DES]; memset((void *) iv, 0x0, (size_t) sizeof(iv)); bufferPtrSize1 = ([sTextIn length] + kCCBlockSize3DES) & ~(kCCBlockSize3DES -1); bufferPtr1 = malloc(bufferPtrSize1 * sizeof(uint8_t)); memset((void *)bufferPtr1, 0x00, bufferPtrSize1); ccStatus = CCCrypt(encryptOrDecrypt,
Here is the code I use for .net
class Program { static void Main(string[] args) { string key = "1234567890"; string secret = "hello"; string crypto = EncryptedString.EncryptString(secret, key); Console.WriteLine(crypto); secret = EncryptedString.DecryptString(crypto, key); Console.WriteLine(secret); Main(null); } } public class EncryptedString { public static string EncryptString(string plainSourceStringToEncrypt, string passPhrase) {