2

CommonCrypto 機能に重大な問題があります。BlackBerry と Windows Mobile 用の 2 つの既存のアプリケーションがあり、どちらもデータ交換に ECB モードで Triple-DES 暗号化を使用します。どちらでも、暗号化された結果は同じです。

ここで、iPhone アプリケーションに 3DES 暗号化を実装したいので、CommonCrypto に直行しました。 http://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-32207/CommonCrypto/CommonCryptor.h

CBC モードを使用するといくつかの結果が得られますが、Java または C# の結果とは一致しません。とにかく、ECB モードを使用したいのですが、これがまったく機能しません。パラメーター エラーが表示されます...

これは ECB モードの私の呼び出しです...私はそれを少し取り除きました:

const void *vplainText;

plainTextBufferSize = [@"Hello World!" length];
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);

plainText = (const void *) [@"Hello World!" UTF8String];
NSString *key = @"abcdeabcdeabcdeabcdeabcd";

ccStatus = CCCrypt(kCCEncrypt,
     kCCAlgorithm3DES,
     kCCOptionECBMode,
     key,
     kCCKeySize3DES,
     nil, // iv, not used with ECB
     plainText,
     plainTextBufferSize,
     (void *)bufferPtr, // output
     bufferPtrSize,
     &movedBytes);

t は多かれ少なかれここからのコードです:http://discussions.apple.com/thread.jspa?messageID=9017515 しかし、すでに述べたように、毎回パラメーターエラーが発生します...

kCCOptionECBMode の代わりに kCCOptionPKCS7Padding を使用し、C# と iPhone コードで同じ初期化ベクトルを設定すると、iPhone で異なる結果が得られます。私の出力を bufferPtr から取得することで間違いはありますか? 現在、暗号化されたものを次のように取得しています。

NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [[NSString alloc] initWithData:myData encoding:NSISOLatin1StringEncoding];

すべての設定を2回、異なるエンコーディングなどを試したようです...私のエラーはどこにありますか?

4

3 に答える 3

1

エラーメッセージを投稿できますか?

この問題をトラブルシューティングするための最良の方法の1つは、既知の入力、既知のキー、および既知の出力(「テストベクトル」)を取得し、期待される出力のバイトを観測された出力と比較することです。

ここで行っていることは、出力をテストするための良い方法ではない可能性があります。

NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [[NSString alloc] initWithData:myData encoding:NSISOLatin1StringEncoding];

NSISOLatin1StringEncoding暗号化されたバイナリデータがエンコーディングで解釈できることをどのように知っていますか?

代わりに、バイトを直接(などを介して)比較する[myData description]か、出力を16進数またはbase64エンコーディングで変換します。

于 2009-09-07T20:04:54.550 に答える
1

問題は、kCCOptionECBMode だけでは十分ではないことだと思います。パディングも必要です (ブロック暗号であるため)。両方を渡すと (つまり、 kCCOptionPKCS7Padding | kCCOptionECBMode )、機能します。

于 2010-03-14T10:49:25.333 に答える
0

これは古い質問だと思いますが、参考までに、キーを NSString として渡すべきではないと思います。代わりに、キーを 16 進数からバイト配列に変換する必要があります。このhexToBytes NSString 拡張機能は、次のようにして必要なものを提供する必要があります。

[[key hexToBytes] bytes]

また、キーの長さは指定された長さの 2 倍にする必要があります (16 進数で 48 文字、つまり 24 バイト)。

于 2012-05-28T13:43:19.040 に答える