0

PHPサーバーで暗号化されたキーを生成し、それをiPadアプリに送信して復号化する必要があります。

私がPHPサーバー側でやったこと:

    $iv = mcrypt_create_iv(32);
    $privatEencryptKey = "1111";
    $data = "2222";
    $encryptedData = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateEncryptKey, base64_encode($data), MCRYPT_MODE_CBC, $iv);
    $decryptedData = base64_decode(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateEncryptkey, $encryptedData, MCRYPT_MODE_CBC, $iv));

    echo base64_encode($encryptedData); //output = WT7LorzZ1EQo2BeWxawW3Q==
    echo $decryptedData; // output = 2222
    echo base64_encode($iv); // output = fZTj4BxWSdCYQW/scUHvx9QoiTNXmxNrGWb/n7eFkR4= 

xcodeでsercurity.framworkをインポートし、base64(エンコードとデコード)用のサードパーティを追加し、(CommonCryptor.h)も使用します。これが私のコードです:

+ (NSData *)doCipher:(NSData *)dataIn
              iv:(NSData *)iv
             key:(NSData *)symmetricKey
         context:(CCOperation)encryptOrDecrypt{
         CCCryptorStatus ccStatus   = kCCSuccess;
         size_t          cryptBytes = 0;    // Number of bytes moved to buffer.
         NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];

         ccStatus = CCCrypt( encryptOrDecrypt,
                   kCCAlgorithmAES128,
                   0,
                   symmetricKey.bytes,
                   kCCKeySizeAES128,
                   iv.bytes,
                   dataIn.bytes,
                   dataIn.length,
                   dataOut.mutableBytes,
                   dataOut.length,
                   &cryptBytes);

        if (ccStatus != kCCSuccess) {
              NSLog(@"CCCrypt status: %d", ccStatus);
        }

      dataOut.length = cryptBytes;
      return dataOut;
  }

  + (void) testCipher{
        NSData *dataIn = [[@"WT7LorzZ1EQo2BeWxawW3Q==" base64DecodedString] dataUsingEncoding:NSUTF8StringEncoding];
        NSData *key = [@"1111" dataUsingEncoding:NSUTF8StringEncoding];
        NSData *iv = [[@"fZTj4BxWSdCYQW/scUHvx9QoiTNXmxNrGWb/n7eFkR4=" base64DecodedString] dataUsingEncoding:NSUTF8StringEncoding];

        NSData *dataOut = [Utils doCipher:dataIn iv:iv key:key context:kCCDecrypt];
        NSString* strOut = [[[NSString alloc] initWithData:dataOut
                                          encoding:NSUTF8StringEncoding] base64DecodedString];
        NSLog(@"%@", strOut);
  }

strOut の nil を取得しました..... :(

助けてください......

4

1 に答える 1

1
  1. AES-128 には 16 バイトのキーと IV を使用する必要があります。それ以外の場合、Mcrypt_encrypt はこれをゼロで埋めます。
  2. mcrypt_encrypt はデータを 0 でパディングするため、入力に手動で PKCS#5 パディングを追加する必要がありますが、これは一般的な方法ではありません。
于 2013-01-16T08:47:58.550 に答える