2
我想在iphone上使用3des加密一些东西,它必须匹配java和.NET的结果。iPhone 3Des加密匹配Java和.NET密钥问题,SecretKeySpec?
的代码,我是:
+ (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;
}
此代码成功地加密和解密的字符串。正如你所看到的,它在密钥上使用了md5。但是,它不符合.NET和java的结果。
从Java开发人员的Java代码看起来像:
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"));
}
可惜我不是太熟悉Java加密。我注意到,在KEY上使用md5后,它使用SecretKeySpec方法创建一个SecretKey。我的Java开发人员告诉我他需要使用密钥的字节数组创建一个secretkey,以便它可以匹配.NET密钥。
任何人都可以解释这对我更好,并帮助我一个解决方案,以匹配的.NET和Java的同行结果?
你能帮我在这里吗? http://stackoverflow.com/questions/12607937/3des-result-in-java-produces-different-result-from-3des-ios-version – kinghomer 2012-09-29 15:42:54
@ tony.tc.leung,你在java端改变了什么和IOS方,请将代码清楚,这将是很大的帮助。谢谢 – 2013-06-26 12:01:11