我一直在用这一个撞墙在我的头上。我需要编写我的iPhone应用程序来使用ECES模式下的3DES加密一个4位数的“引脚”,以便传输到我认为是用.NET编写的web服务。iPhone 3DES加密密钥长度问题
+ (NSData *)TripleDESEncryptWithKey:(NSString *)key dataToEncrypt:(NSData*)encryptData {
NSLog(@"kCCKeySize3DES=%d", kCCKeySize3DES);
char keyBuffer[kCCKeySize3DES+1]; // room for terminator (unused)
bzero(keyBuffer, sizeof(keyBuffer)); // fill with zeroes (for padding)
[key getCString: keyBuffer maxLength: sizeof(keyBuffer) encoding: NSUTF8StringEncoding];
// encrypts in-place, since this is a mutable data object
size_t numBytesEncrypted = 0;
size_t returnLength = ([encryptData length] + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
// NSMutableData* returnBuffer = [NSMutableData dataWithLength:returnLength];
char* returnBuffer = malloc(returnLength * sizeof(uint8_t));
CCCryptorStatus ccStatus = CCCrypt(kCCEncrypt, kCCAlgorithm3DES , kCCOptionECBMode,
keyBuffer, kCCKeySize3DES, nil,
[encryptData bytes], [encryptData length],
returnBuffer, returnLength,
&numBytesEncrypted);
if (ccStatus == kCCParamError) NSLog(@"PARAM ERROR");
else if (ccStatus == kCCBufferTooSmall) NSLog(@"BUFFER TOO SMALL");
else if (ccStatus == kCCMemoryFailure) NSLog(@"MEMORY FAILURE");
else if (ccStatus == kCCAlignmentError) NSLog(@"ALIGNMENT");
else if (ccStatus == kCCDecodeError) NSLog(@"DECODE ERROR");
else if (ccStatus == kCCUnimplemented) NSLog(@"UNIMPLEMENTED");
if(ccStatus == kCCSuccess) {
NSLog(@"TripleDESEncryptWithKey encrypted: %@", [NSData dataWithBytes:returnBuffer length:numBytesEncrypted]);
return [NSData dataWithBytes:returnBuffer length:numBytesEncrypted];
}
else
return nil;
} }
我确实使用上面的代码获得了一个加密的值,但它与.NET web服务的值不匹配。
我认为问题在于Web服务开发人员提供的加密密钥长度为48个字符。
我看到iPhone SDK常量“kCCKeySize3DES”是24.所以我怀疑,但不知道,commoncrypto API调用只使用提供的键的前24个字符。
这是正确的吗?
有没有办法我可以得到这个来产生正确的加密引脚?我已经将加密PRIOR中的数据字节输出到base64编码,并试图将这些数据字节与.NET代码生成的数据进行匹配(借助向.NET发送字节数组输出的.NET开发人员的帮助)。非base64编码的字节数组和最终的base64编码字符串都不匹配。
谢谢托马斯您在这里的详细答案。你提到的概念正是我最终看到的更多细节。我很幸运,因为我可以访问.NET版本的加密代码,这给我提供了宝贵的指导。 将4位数的PIN码变成8位数值,并通过追加4个0来输入3DES算法。 我将此代码添加到此答案中,但标记为解决方案,因为您的知识完全正确。 – 2010-03-16 17:14:08