2016-09-04 9 views
1

パスワードハッシュシステム(チャプントークンでパスワードハッシング)を使用して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アプリケーションではない)が必要です。

+0

あなたがセキュリティについては本当に心配している場合は、あなたがあなた自身のハッシュを行い、またしてもMD5を使うべきではありませんまたはSHAであるが、PBKDF2に由来するものである。あなたは本当にあなたの現在のアルゴリズムを維持する必要がありますか? – Andrew

+0

.NET文字列はバイト配列ではありません。それらは、UTF-16コードユニットのカウントされたシーケンスです。おそらく、あなたはバイト配列を使うことに固執します。 –

+0

javascriptに2つの 'for'ループがあり、それぞれ1つのコマンドを実行します。 C#には 'for'ループが1つあり、2つのコマンドを実行します。 – GSerg

答えて

1

forループ内に2つの行を配置するのは1つではなく、問題があるようです。これは機能しますか?とにかく

public static int[] Str2Binl(string str) 
{ 
    var nblk = ((str.Length + 8) >> 6) + 1; // number of 16-word blocks 
    var blks = new int[nblk*16]; 

    int i; 
    for (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; 
} 

、私はすでにコメントとしては、セキュリティについては本当に心配している場合は、あなたがあなた自身のハッシュを行い、またしてもMD5やSHAを使用していますが、PBKDF2由来のものではないはずです。何らかの理由で現在のアルゴリズムを維持する必要がある場合を除きます。

一方、AsciiOctalToStringは私に別の文字列:¼♂¢£??i?8‼£?ª1♫¬を返します。

ところで、あなたは(あなたはあまりそれを好むかもしれないが)これでそのwhereの使用を避けることができます。

var list = ascii.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); 
+0

分割についての情報をありがとう、それはより良い解決策です:) あなたはループについて正しいです。しかし、最後の行にあるイテレータは何ですか: 'blks [i >> 2] | = 0x80 <<(i%4 * 8);' 宣言が必要なので、ループの一部でなければなりません。 – Kisiel665

+0

'$ chapchallenge'だけを置くので、 'AsciiOctalToString'からの出力が異なります。私は '$' {AsciiOctalToString(chapid)} {パス} {AsciiOctalToString(chapchallenge)} "を持っています。 – Kisiel665

+0

おっと、そうです、私は 'i'変数を修正しました。 JavaScriptでは、変数は 'for'の後には生きていますが、Cではそうではありませんので、ループの外側に宣言する必要があります。 – Andrew

関連する問題