4

PHPは、私が定期的に使用する言語の1つですが、通常、PHPを再び使用し始めると、クモの巣をほこりで払う必要があります。今週、CコードをPHPに移植するときにも同じことが言えます。これは多くのAES暗号化とSHA256ハッシュを使用します-これまでのところすべて正常に機能しています。ただし、復号化された文字列は「C」形式で出力されます。つまり、ゼロバイトの後に「ガベージ」パディングバイトが続きます。

私は現在、これらのCスタイルの文字列を次のようにPHP形式に「トリミング」しています。

$iv = strpos( $hashsalt8, "\0");
if ($iv)
   $hashsalt8 = substr( $hashsalt8, 0, $iv );

時間がかかり、代わりに1行の関数呼び出しがあるはずですが、見つかりませんか?

注:この場合、「ハッシュソルト」という名前は、元の文字列の長さを知っている可能性があることを意味しますが、一般的な場合は不明です。substr()明らかに、長さが事前にわかっている場合を使用して、1行のソリューションを利用できます。

4

3 に答える 3

9

使用strstr

$hashsalt8 = strstr($hashsalt8, "\0", TRUE);

5.3.0未満のバージョン(3番目のパラメーターが使用できない場合)の醜いソリューションは、代わりにstrrevsubstrおよびstrrchr関数を使用します。

$hashsalt8 = strrev(substr(strrchr(strrev($hashsalt8), "\0"), 1));
于 2010-10-27T17:50:23.070 に答える
2

32バイトを超えるパディングが必要になることはありませんか?(ここのあなたのコメントから)

あなたはこのようなことをすることができるかもしれません:

preg_replace('/\x00.{0,32}$/', "", $hashsalt8);

二重引用符の代わりに一重引用符に注意してください。二重引用符を使用すると、 \x00pregが壊れるように見えます:)

于 2010-10-27T18:11:43.177 に答える
2

strtok関数は、2つではなく1つのパスでそれを実行します。

$hashsalt8 = strtok($hashsalt8, "\0");

ただし、PHP 4.1.0以降、strtok入力文字列がゼロバイトで始まる場合、空の文字列は返されません。その場合を処理するには、次のようにすることができます。

if($ hashsalt8 [0] == "\ 0"){
  $ hashsalt8 ='';
}
そうしないと {
  $ hashsalt8 = strtok($ hashsalt8、 "\ 0");
}

ゼロバイトで始まる入力文字列も、現在のコードのバグを明らかにすることに注意してください。その場合、strposは戻り0if ($iv)失敗します。

!==とを区別するには、演算子を使用する必要が0ありfalseます。

$ iv = strpos($ hashsalt8、 "\ 0");
if($ iv!== false){
   $ hashsalt8 = substr($ hashsalt8、0、$ iv);
}
于 2010-10-28T08:05:04.157 に答える