1

この関数を 3des 暗号化に使用しました。

 ccStatus = CCCrypt(kCCEncrypt,              // CCoperation op
                       kCCAlgorithm3DES,        // CCAlgorithm alg
                       kCCOptionPKCS7Padding,  // kCCOptionPKCS7Padding,                    //kCCModeECB,              // CCOptions
                       [_keyData bytes],        // const void *key
                       kCCKeySize3DES,          // 3DES key size length 24 bit
                       vinitVec,              //iv,                      // const void *iv,
                       [dTextIn bytes],         // const void *dataIn 
                       [dTextIn length],        // size_t dataInLength
                       bufferPtr,               // void *dataOut
                       bufferPtrSize,           // size_t dataOutAvailable
                       &movedBytes);            // size_t *dataOutMoved
       NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];'

それは働いていますが。しかし、この NSData を NSString に変換すると、 NSString には多くの null 終端が含まれているため、 NSString は最初の null 終端で終了するため、変数にデータ全体を含めることができません。しかし、サーバーで暗号化された文字列を送信する必要があります。NSData を NSString に変換するにはどうすればよいですか。すべてのデータを含む文字列は意味しますか (データに null 終端が含まれている場合。その場合、文字列は終了しません)?

事前に感謝します。


返信ありがとうございます。暗号化されたバイトに含まれているかどうかを確認してください

 char bytes[] = { 'H', 'e', 'l', 'l', 'o', \0, 'W', 'o', 'r', 'l', 'd', \0 };
   NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
   NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
   NSLog(@"%@", str);

   NSString *sendtoserver=[NSString stringwithformat:@"<request>%@</request>",str];

これらの NSData を NSString に変換するとき。暗号化された NSString を送信する必要があるため、最初の \0 ( null 終了) で終了します。そのため、問題が発生しています。サーバー側がそれを望んでいないため、base64stringを送信できません。彼らは文字列の暗号化を求めていました。

だから私が今何をしているのか、助けてください、そして返信してくれてありがとう。

4

1 に答える 1

0

への変換はnullバイトで停止しNSDataませNSStringANSStringには、埋め込まれた「NULL」文字を含む任意のUnicode文字を含めることができます。

例:

char bytes[] = { 'H', 'e', 'l', 'l', 'o', 0, 'W', 'o', 'r', 'l', 'd', 0 };
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@", str);

出力:

Hello

したがって、文字列には5文字しか含まれておらず、変換は最初のnullバイトで停止したように見えます。しかし、それはNSLog出力にすぎず、実際には何も失われません。

for (int i = 0; i < [str length]; i++) {
    unichar c = [str characterAtIndex:i];
    NSLog(@"%2d, %3d, %c", i, c, c);
}

出力:

  0,  72, H
  1, 101, e
  2, 108, l
  3, 108, l
  4, 111, o
  5,   0, 
  6,  87, W
  7, 111, o
  8, 114, r
  9, 108, l
 10, 100, d
 11,   0, 

したがって、文字列にはすべてのデータが含まれ、何も失われません。おそらく、文字列は後でサーバーに送信するときに切り捨てられます。


備考:暗号化されたデータを文字列に変換することは、データが何らかの文字エンコードで解釈されるため、私には問題があるように思われます。この例で選択NSASCIIStringEncodingしましたが、ドキュメントによると、このエンコーディングはASCII値0〜127に対してのみ有効です。

暗号化されたデータがサーバーに送信される方法と形式に関する情報をさらに追加すると、これをより適切に解決する方法を提案できる可能性があります。

于 2012-12-05T20:54:09.487 に答える