我一直在用这个把头撞到墙上。我需要对我的 iPhone 应用程序进行编码,以在 ECB 模式下使用 3DES 加密一个 4 位“pin”,以便传输到我认为是用 .NET 编写的 web 服务。
+ (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 个字符。
它是否正确?
有什么方法可以让我生成正确的加密密码?我已将加密之前的数据字节输出到 base64 编码,并尝试将其与 .NET 代码生成的字节进行匹配(在将字节数组输出发送给我的 .NET 开发人员的帮助下)。非 base64 编码的字节数组和最终的 base64 编码字符串都不匹配。