2011-01-04 22 views
0

に翻訳していますhttps://www.interactivebrokers.com/sso/LoginにC#クライアントを使用してログインしようとしています。この呼び出しSHA1:JavaScriptの実装をC#

innerHash = CalcSHA1(username + ":" + password); 

https://www.interactivebrokers.com/sso/Templates/javascript/sha1.js、ライン113)

calcSHA1Blks(str2blks_SHA1(str); 

とstr2blks_SHA1()が定義されている(:ユーザー名&パスワードからsha1ハッシュを作成する必要がステップ(https://www.interactivebrokers.com/sso/Templates/javascript/myxyz.js、ライン203)がありますhttps://www.interactivebrokers.com/sso/Templates/javascript/sha1.js、ライン28)

/* 
* Convert a string to a sequence of 16-word blocks, stored as an array. 
* Append padding bits and the length, as described in the SHA1 standard. 
*/ 
function str2blks_SHA1(str) 
{ 
    var nblk = ((str.length + 8) >> 6) + 1; 
    var blks = new Array(nblk * 16); 
    for(var i = 0; i < nblk * 16; i++) blks[i] = 0; 
    for(i = 0; i < str.length; i++) 
    blks[i >> 2] |= str.charCodeAt(i) << (24 - (i % 4) * 8); 
    blks[i >> 2] |= 0x80 << (24 - (i % 4) * 8); 
    blks[nblk * 16 - 1] = str.length * 8; 
    return blks; 
} 

ように私は、SHA1のものとすべてのこと慣れていないので、私が言うことができませんstr2blks_SHA1()内のものが.netのSHA1CryptoServiceProvider.ComputeHash()内で自動的に行われる標準のものである場合、または明示的に行う必要がある場合は、 JavaScriptでと.NETで同じユーザー名&パスワードを使用して

SHA1CryptoServiceProvider.ComputeHash(Encoding.UTF8.GetBytes(userName + ":" + password)) 

を、そして、異なる結果を生成するようだ:私が試してみました。

次に、str2blks_SHA1()関数をC#に移植しようとしましたが、各配列アイテムのように見えるバイト配列(blks)(SHA1CryptoServiceProvider.ComputeHash()が必要です)を作成する方法を理解できません。 blksは1バイトより大きくなる可能性があります(ちょうどstr.length * 8を見ています)...

したがって、このJavaScript実装と同じことをするSHA1実装は既に存在しますか?または、私が実際にこれを実装する必要がある場合、str2blks_SHA1()を移植するにはどうすればよいですか?

おかげ

+4

可能であれば、独自の暗号化ルーチンを実装しないでください。暗号化セキュリティを失う可能性が非常に高いサイドチャネル攻撃がたくさんあります。 – templatetypedef

答えて

1

このJavaScriptの実装は、RFC 3174の標準SHA-1パディングアルゴリズムのようです。私がそうであるように

// JavaScript 
calcSHA1("[email protected]:p4ssw0rd"); 

:あなたはどのようなデータを供給していて、(別の)結果をどのように取得している

// C# 
using (SHA1 hash = SHA1.Create()) 
    Console.WriteLine(BitConverter.ToString(
     hash.ComputeHash(Encoding.ASCII.GetBytes("[email protected]:p4ssw0rd")))); 

私が実行しているから、同じ結果を(マイナーフォーマットの違いを無視して)もらいますか?

(あなたのユーザー名またはパスワードにASCII以外の文字が含まれている場合、適切なUTF-8変換を行っていないため、JavaScriptがC#とは異なる結果を生成することに驚くことはありません具体的には、各文字が1バイトであると思われます。

+0

あなたはそうです、それは動作します。結果をBigIntegerと比較しようとしていました。 ComputeHash()のバイト配列の結果は、BigIntegerのコンストラクタに渡す前に逆にしなければならず、次に2つの結果が一致します。 えええええええええ、私はそれが反転されなければならないバイト配列であり、JavaScriptのバージョンからの文字列ではないのですか? (つまり、BigInteger.ModPow()とそのすべてのものについて、すべてが動作することを確認する) – Jimmy

+0

SHA-1出力を160ビットの数値として扱う場合は、通常はビッグエンディアンの順番で解釈します。構築されたBigIntegerは、リトルエンディアンの順序でバイト配列をとると文書化されているので、BigIntegerが必要な値を持つようにする必要があるのはC#バイト配列です。 –

0

あなたはSHA1のInputBlockSizeやOutputBlockSizeを設定しようとしたことがありますか?