私はこれで頭を壁にぶつけています。.NET で記述されていると思われる Web サービスに送信するために、ECB モードで 3DES を使用して 4 桁の「ピン」を暗号化するように iPhone アプリケーションをコーディングする必要があります。
+ (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 でエンコードされた最終的な文字列も一致しません。