0

system("openssl enc -aes-128-cbc -k secret -P -md sha1 > FILENAME")の出力をファイルに保存するにはどうすればよいですか。

私は次のことを試しました:

NSArray *paths = NSSearchPathForDirectoriesInDomains

(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *fileName = [NSString stringWithFormat:@"%@/textfile.txt",

                      documentsDirectory];

NSString *str=[NSString stringWithFormat:@"openssl enc -aes-128-cbc -k secret -P -md sha1 > %s",[fileName UTF8String]];
NSLog(@"AES Key is %@",str);
system([str UTF8String]);

NSString *strAES = [NSString stringWithContentsOfFile:fileName encoding:nil error:nil];
NSLog(@"strAES Key is %@",strAES);

NSString *strAESKey=[[[[strAES componentsSeparatedByString:@"\n"] objectAtIndex:1] componentsSeparatedByString:@"="] objectAtIndex:1];
NSLog(@"strAESKey Key is %@",strAESKey);

// NSString *content = @"One\nTwo\nThree\nFour\nFive";
  [str writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil];`

どこが間違っていますか?

関数はsystem()出力をコンソールに送信しますが、iPhone にはコンソールがないため、出力をテキスト ファイルにリダイレクトし、ファイルからキーを取得して暗号化/復号化に使用する必要があります。

4

1 に答える 1

0

まず第一に、system(3)ジェイルが壊れていないiOSでは使用できないことに注意してください。しかし、よくわからないので、その方法を説明します。

これは少しトリッキーです。

これを実現するには、各プロセスが 3 つのファイル記述子で開かれることを知っておく必要があります。1 つは読み取りstdin用 (標準入力用) で、2 つは書き込みstdout用 (標準出力およびstderr標準エラー出力用) です。fd 番号は 0 ( stdin)、1 ( stdout)、2 ( stderr) です。

標準出力または標準エラーをプログラムからファイルにリダイレクトするには、次の手順を実行する必要があります。

  • まず、fork(2)プロセス。waitpid(2)子 prozessの親プロセス。
  • 子プロセスで:
    • 再オープン ( freopen(3))stdoutstderr、出力をリダイレクトするファイルに移動します。
    • execve(2)呼び出したいプログラムを実行するために使用します
    • コマンドが終了すると、親は SIGCHLD を取得し、waitpid(2)戻る必要があります

括弧内の番号は、関数のマニュアルページ (man 2 waitpidなど) の章を示しています。

これがお役に立てば幸いです。さらに質問がある場合は、質問してください:-)

更新: OPは出力を取得したいだけで、特にファイルに入れたいのではないので、次を使用できますpopen(3)

int status;
char value[1024];
FILE *fp = popen("openssl enc -aes-128-cbc -k secret -P -md sha1", "r");

if (fp == NULL) exit(1); // handle error

while (fgets(value, 1024, fp) != NULL) {
  printf("Value: %s", value);
}

status = pclose(fp);
if (status == -1) {
  /* Error reported by pclose() */
}
else {
  /* Use macros described under wait() to inspect `status' in order
   to determine success/failure of command executed by popen() */
}
于 2013-02-07T14:07:22.873 に答える