質問

次のキーを使用して、正しい握手応答文字列を計算します。
key1:18x 6] 8vm; 54 *(5:{u1] 8 z [8
key2:1_ tx7x d <nw 334j702)7] o} `0
Key3:54:6d:5b:4b:20:54:32:75

key1とkey2の値を計算しました。
key1:0947fa63(六角)
Key2:0A5510D3

しかし、私が次に何をすべきか、私が集めることができるものから、あなたはそれらを連結してMD5それをそれにしていないようですが、それはMD5ハッシュをうまくいきません:0947FA630A5510D3546D5B4B20543275

ヘルプ!

役に立ちましたか?

解決

これは、応答ハッシュを作成するためのPythonコードです。

from hashlib import md5
import struct
....
hashed = md5(struct.pack('>II8s', num1, num2, key3)).digest()

例では、num1とnum2はkey1とkey2の数値です。 key3は、実際のテキスト文字列(生のバイト)です。

struct.pack()呼び出しは、ビッグエンディアンモード(数値の値に対して)を使用しており、各数値に対して4バイトを梱包し、その後8 byte key3文字列(バイト)が続きます。

を参照してください ドキュメンテーション Python structモジュール用。

Cバージョンは次のようになります:

/* Pack it big-endian */
buf[0] = (num1 & 0xff000000) >> 24;
buf[1] = (num1 & 0xff0000) >> 16;
buf[2] = (num1 & 0xff00) >> 8;
buf[3] =  num1 & 0xff;

buf[4] = (num2 & 0xff000000) >> 24;
buf[5] = (num2 & 0xff0000) >> 16;
buf[6] = (num2 & 0xff00) >> 8;
buf[7] =  num2 & 0xff;

strncpy(buf+8, headers->key3, 8);
buf[16] = '\0';

md5_buffer(buf, 16, target);
target[16] = '\0';

MD5_Bufferが入っています glibc.

詳細については、作業用実装(上記のコードが来た場所)を見ることができます。 websockify (免責事項:websockifyを書きました)。

他のヒント

これが私のバージョンです:

https://github.com/boothead/stargate/blob/master/stargate/handshake.py#l104

Stargateを使用する場合、その厄介なものはすべてあなたのために行われます:-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top