iPhone 3DES暗号化マッチングJavaと.NETの重要な問題、SecretKeySpec?
-
27-09-2019 - |
質問
私は、Javaと.NETからの結果と一致する必要がありますiphoneに3DESを使用して、いくつかの暗号化何かをしようとしています。
私が持っているコードは、次のとおりです。
+ (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], //"123456789012345678901234", //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開発者は、彼はそれが.NETキーと一致することができるように、キーのバイト配列を使用して秘密鍵を作成するために必要なことを教えてくれました。
缶誰?私と.NETとJava対応の結果と一致するように、溶液で助けを私にこの優れた説明
解決
私はそれを考え出しました。私はそれをMD5後に生成されたキーは、32バイトです。他の記事を読んでから、kCCKeySize3DESはわずか24バイトであると思われます。私は24バイト以下(なしMD5)でキーを入れた場合、これは完璧に動作しているようです。
所属していません StackOverflow