パスワードハッシュシステム(チャプントークンでパスワードハッシング)を使用してPHPとJavascriptのページをC#に変換しようとしています。8ビット文字列を16ワードブロックのシーケンスに変換する
<?php
$chapid='\115';
$chapchallenge= '\274\013\242\243\236\226\151\224\070\023\243\207\252\061\016\254';
$pass = '123456';
?>
<script type="text/javascript">
<!--
alert('<?php echo $chapid; ?>' + '<?php echo $pass; ?>' + '<?php echo $chapchallenge; ?>');
alert(((str2binl('<?php echo $chapid; ?>' + '<?php echo $pass; ?>' + '<?php echo $chapchallenge; ?>'))));
alert((coreMD5(str2binl('<?php echo $chapid; ?>' + '<?php echo $pass; ?>' + '<?php echo $chapchallenge; ?>'))));
alert(binl2hex(coreMD5(str2binl('<?php echo $chapid; ?>' + '<?php echo $pass; ?>' + '<?php echo $chapchallenge; ?>'))));
//-->
</script>
/*
* Convert an 8-bit character string to a sequence of 16-word blocks, stored
* as an array, and append appropriate padding for MD4/5 calculation.
* If any of the characters are >255, the high byte is silently ignored.
*/
function str2binl(str)
{
var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocks
var blks = new Array(nblk * 16)
for(var i = 0; i < nblk * 16; i++) blks[i] = 0
for(var i = 0; i < str.length; i++)
blks[i>>2] |= (str.charCodeAt(i) & 0xFF) << ((i%4) * 8)
blks[i>>2] |= 0x80 << ((i%4) * 8)
blks[nblk*16-2] = str.length * 8
return blks
}
最初の警告が表示され、文字列「M123456¼¢£2-18£のª1¬」、私のコードでは、私が使用して入力を変換して:だから私は、手順は結果を示すために例のページを持っている
public static string AsciiOctalToString(string ascii)
{
var list = ascii.Split('\\');
StringBuilder builder = new StringBuilder();
foreach (string octalPart in list.Where(x => x.Length > 0))
{
int i = Convert.ToInt32(octalPart, 8);
builder.Append(Convert.ToChar(i));
}
return builder.ToString();
}
次の私が持っていますこの文字列をバイトに変換するには(str2binl(str)
のように)、それは奇妙な形式です。私は8ビット文字列を16ワードブロックのシーケンスに変換する方法を理解していません。予想される結果(アラート2から)は{858927437, -1137298124, -1633443317, 949250454, -1433951469, -2136207823, 0, 0,0,0,0,0,0,0,184,0}
です。私はにstr2binl(str)
翻訳:
public static int[] Str2Binl(string str)
{
var nblk = ((str.Length + 8) >> 6) + 1; // number of 16-word blocks
var blks = new int[nblk*16];
for (var i = 0; i < str.Length; i++)
{
blks[i >> 2] |= (str[i] & 0xFF) << (i%4*8);
blks[i >> 2] |= 0x80 << (i%4*8);
}
blks[nblk*16 - 2] = str.Length*8;
return blks;
}
が、私の結果は予想以上に異なっています。
私はこれに間違っていることを知っていますか?
私は、JavaScriptコードのためのブラケットを追加しました:
function str2binl(str)
{
var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocks
var blks = new Array(nblk * 16)
for(var i = 0; i < nblk * 16; i++)
{
blks[i] = 0
}
for(var i = 0; i < str.length; i++)
{
blks[i>>2] |= (str.charCodeAt(i) & 0xFF) << ((i%4) * 8)
}
blks[i>>2] |= 0x80 << ((i%4) * 8)
blks[nblk*16-2] = str.length * 8
return blks
}
しかし、それはJSでの仕事だかもそうイテレータを必要blks[i>>2] |= 0x80 << ((i%4) * 8)
ライン?
P.S.私は自分のコードでこのJSライブラリを使用することはできません、私はハッシュされたパスワード(それはWebアプリケーションではない)が必要です。
あなたがセキュリティについては本当に心配している場合は、あなたがあなた自身のハッシュを行い、またしてもMD5を使うべきではありませんまたはSHAであるが、PBKDF2に由来するものである。あなたは本当にあなたの現在のアルゴリズムを維持する必要がありますか? – Andrew
.NET文字列はバイト配列ではありません。それらは、UTF-16コードユニットのカウントされたシーケンスです。おそらく、あなたはバイト配列を使うことに固執します。 –
javascriptに2つの 'for'ループがあり、それぞれ1つのコマンドを実行します。 C#には 'for'ループが1つあり、2つのコマンドを実行します。 – GSerg