1

サーバー側の php でデータを暗号化し、iOS で復号化すると失敗します。

PHPのサーバーでは、次のようになります(テスト用のみ):

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, "a16byteslongkey!a16byteslongkey!", "iphone", MCRYPT_MODE_CBC, $iv);
$base64encoded_ciphertext = base64_encode($ciphertext);
return $base64encoded_ciphertext;

iOS の場合:

 NSData *decrypted = [[RNCryptor AES256Cryptor] decryptData:[QSStrings decodeBase64WithString: text] password:@"a16byteslongkey!a16byteslongkey!" error:&error];

NSLog(@"errro - %@", [error description]);

NSString *decryptedString = [[[NSString alloc] initWithData: decrypted encoding: NSUTF8StringEncoding] autorelease];

エラーの説明は次のとおりです。

Error Domain=net.robnapier.RNCryptManager Code=2 "Unknown header" UserInfo=0x8582e10 {NSLocalizedDescription=Unknown header}

RNCryptor の使用: https://github.com/rnapier/RNCryptor

エラーがスローされる場所である暗号化器で:

  if (![header isEqualToData:[NSData dataWithBytes:AES128CryptorHeader length:sizeof(AES128CryptorHeader)]]) {
*error = [NSError errorWithDomain:kRNCryptorErrorDomain code:kRNCryptorUnknownHeader
                         userInfo:[NSDictionary dictionaryWithObject:NSLocalizedString(@"Unknown header", @"Unknown header") forKey:NSLocalizedDescriptionKey]];
return NO;

}

これは何が問題なのですか?

4

3 に答える 3

2

RNCryptor のサイトを読んだだけで、完全なメッセージ入出力暗号化プログラムだと思います。彼らのウィキでデータ形式を見ると

https://github.com/rnapier/RNCryptor/wiki/Data-Format

ENCRYPT へのデータにはヘッダーがないことを期待していると思いますが、解読している場合は、ヘッダーと hmac を追加する暗号化機能を使用してデータが暗号化されていることが期待されます。

私が正しければ、サーバー側がまとめたデータは、RNCryptor が期待するメッセージ全体の暗号テキスト部分にすぎません!!!

于 2012-06-29T13:33:35.923 に答える
2
//After getting data from server 
-(Void)getDataFromServer:(NSData*)responseData
{
 NSString *base64String = [responseData base64EncodedStringWithOptions:0];

//Decode base64 data
    NSData *decodedData = [DatabaseHandler base64DataFromString:newStr];

    NSData *decryptedData = [RNDecryptor decryptData:decodedData withSettings:kRNCryptorAES256Settings password:@"YourKey" error:&error];

        NSLog(@"%@",[error userInfo]);
         NSString *dataToDecrypt=  [decryptedData base64EncodedStringWithOptions:0];

    NSString* newStr = [[NSString alloc] initWithData:decryptedData
                                             encoding:NSUTF8StringEncoding]; 
}

- (NSString *) base64StringFromData: (NSData *)data length: (int)length {
  unsigned long ixtext, lentext;
  long ctremaining;
  unsigned char input[3], output[4];
  short i, charsonline = 0, ctcopy;
  const unsigned char *raw;
  NSMutableString *result;

  lentext = [data length]; 
  if (lentext < 1)
    return @"";
  result = [NSMutableString stringWithCapacity: lentext];
  raw = [data bytes];
  ixtext = 0; 

  while (true) {
    ctremaining = lentext - ixtext;
    if (ctremaining <= 0) 
       break;        
    for (i = 0; i < 3; i++) { 
       unsigned long ix = ixtext + i;
       if (ix < lentext)
          input[i] = raw[ix];
       else
  input[i] = 0;
  }
  output[0] = (input[0] & 0xFC) >> 2;
  output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4);
  output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6);
  output[3] = input[2] & 0x3F;
  ctcopy = 4;
  switch (ctremaining) {
    case 1: 
      ctcopy = 2; 
      break;
    case 2: 
      ctcopy = 3; 
      break;
  }

  for (i = 0; i < ctcopy; i++)
     [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]];

  for (i = ctcopy; i < 4; i++)
     [result appendString: @"="];

  ixtext += 3;
  charsonline += 4;

  if ((length > 0) && (charsonline >= length))
    charsonline = 0;
  }     
  return result;
}
于 2013-12-11T10:07:31.180 に答える
0

ここからライブラリをフォローphpしましたか:iOS

https://github.com/RNCryptor

私の要件は同じでした。暗号化されたデータが iOS デバイスに届き、目的 c はそれを復号化する必要があります。

今日、ほぼすべての髪を抜いた後、私は今それを作ることができます. 以下にコードのスニペットを示します。

NSString *message = @"AwF+ttZCyQ7eurRU2zo4KGqQTLBXRRdmBiYe65uv/3AENxUKf6wo3Cpsh8Yk7/OsOwXRDDR3lO5OKNwhJCSxxUNYbpBwWb2KDSxiRbG+11Vrfbk35VRvelAo2Ai8PAz4FJ9z9u7NdBvyVQYF8v1Pd7/rB4TMXaWd98AM4KO3EYmLhTxMpbqDu1LJXDT4TDgXsjv7/ISnISQK3oTmG1vYlO7N";
NSString *password = @"myPassword";

NSData *data = [[NSData alloc] initWithBase64EncodedString:message options:0];
NSError *error;
NSData *decryptedData = [RNDecryptor decryptData:data
                                    withPassword:password
                                           error:&error];

NSString* newStr = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
NSLog(@"\n\nerror: %@\n\nString:%@", error, newStr);

サンプル ( 内)encrypt.phpからダウンロードして実行すると、上記の文字列 ( ) が表示されます。そのパスワードはそこにあります。このコードを実行すると、これが返されますphpRNCryptor-php-master > examples > encrypt.phpbase64NSString *messagemyPasswordobj c

「これが私のテスト ベクトルです。長すぎませんが、ブロック以上で、パディングが必要です。」

この行は のソース コードですencrypt.php。私がやっていた間違いは、以下のように直接変換NSStringしていたことですNSData

NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];

base64以下のようにその文字列をデコードした後、復号化は機能しました

NSData *data = [[NSData alloc] initWithBase64EncodedString:message options:0];

それでおしまい。それが役に立てば幸い。

于 2015-09-10T12:56:59.217 に答える