0

ArduinoをWiFiネットワークに接続しようとしています。

const char* ssid = "ssid";
char* password = "some_hex_chars";
.
.
.
void setup(void){
  WiFi.begin(ssid, password);
.
.
.

問題は、パスフレーズのどこかにコード 0x00 があることです。begin() メソッドは null で終わる文字列である char を引数に取るため、パスワードは切り捨てられます。これを回避する方法はありますか? それを変更する begin() メソッドのソースはどこにありますか?

編集:間違っています。パスフレーズではなく、16 進数 64 文字の PSK であり、接続したくありません。

更新: 問題を解決しました。私は PSK の問題ではなく、WiFi ルーターの詳細設定に問題がありました。いつ

54g™ Modeが54g Performanceに設定されているため、接続したくありません。54g Autoに変更した後、正常に動作します。

4

1 に答える 1

4

私は Arduino については何も知りませんが、802.11 別名 Wi-Fi については詳しく知っています。そう:

そうしないでください。パスフレーズの途中に 0x00 がある場合、IEEE 802.11 標準に従って技術的に無効です。

そして、正しく実装されている場合、802.11スタックによってパスフレーズの最後から2番目の文字(=パスフレーズはこの0x00より前のすべて)として解釈され、未定義の動作を探していると思います-せいぜい、相互運用性の問題、最悪の場合、あなたは賭けをしています。

それはどうですか?

(警告: これは退屈なものになるでしょう。多くの「ネットワーク弁護士」の話です)

これに関連する IEEE 802.11 標準は、IEEE Std 802.11i-2004 "Amendment 6: Medium Access Control (MAC) Security Enhancements"[0]、別名 "WPA2" です。

(明らかに非推奨で役に立たない WEP や、この WPA2 標準が完成するのを待って移行した「基本的な」WPA については、深く掘り下げません)。

関連する部分は、802.11i の ASN MIB[1] (附属書 D、規範) の 136 ページにあり、「 」を「dot11RSNAConfigPSKPassPhrase」として定義していますDisplayString。では、" " とは正確にはどのような種類のデータなのDisplayStringでしょうか?

RFC 1213、「TCP/IP ベースのインターネットのネットワーク管理のための管理情報ベース: MIB-II」、1991 年から、3 ページで次のように述べています。

「[6] の 10 ~ 11 ページで定義されているように、DisplayString は NVT ASCII 文字セットに制限されています。」

わかった...

この "[6]" は 1983 年からの RFC 854 です (うわー! これらの IETF と IEEE は、真剣に、そして本当に、実際に構築された標準を設計しています)。あなたはまだ私をフォローしていますか?:-) よく見ると、NVT は「Network Virtual Terminal」の略であることがわかり、10 ページと 11 ページを参照すると、次のことがわかりました。

NVT プリンター [sic! それは 1983 年であることを思い出してください] [...] 95 個すべての USASCII グラフィックス (コード 32 から 126) の表現を生成できます。

OK、ASCII コードは 32 から 126 です。では、 IEEE 802.11i に戻りましょう。

附属書 H (参考情報)、「RSNA 参照実装とテスト ベクトル」、セクション「H.4 提案されたパスフレーズから PSK へのマッピング」(SSID で数学的に処理されたパスフレーズの目的は、 PSK (Pre-Shared Key)、802.11 操作には便利ですが、「いまいましいキーボードで入力できるいまいましい単純なパスフレーズ」よりもはるかにユーザーフレンドリーではありません)。これは、IEEE の言い回しで、次のようになります (165 ページ)。

RSNA PSK は 256 ビット、または 16 進数で表すと 64 オクテットで構成されます。ユーザーが 64 個の 16 進文字を正しく入力するのは困難です。ただし、ほとんどのユーザーはパスワードとパスフレーズに慣れており、キーを入力するよりも入力する方が快適です。ユーザーが ASCII パスワードまたはパスフレーズを入力できる可能性は高くなりますが、そうすると可能なキーのセットが制限されます。これは、できる最善の方法は、パスフレーズを PSK マッピングに導入することであることを示唆しています。

この節は、RSNA での使用が推奨されるパスフレーズから PSK へのマッピングを定義します。

このパスフレーズ マッピングは、暗号化の概念に慣れていないユーザーが WLAN のセキュリティ機能を有効にできるようにするために導入されました。

...パスフレーズの目的は何ですか。そして、次の 166 ページで:

ここでは、次の仮定が適用されます。

  • パスフレーズは、8 ~ 63 個の ASCII エンコード文字のシーケンスです。
    63 という制限は、64 の 16 進
    文字として表示されるパスフレーズと PSKを区別したいという要望から来ています。
  • パスフレーズの各文字には、32 から 126 (10 進数) の範囲のエンコーディングが必要です。[鉱山を強調]

そして出来上がり!まさに、「32 から 126 (10 進数) まで」。

したがって、ここでもパスフレーズが「32 から 126 (10 進数) の範囲内」の ASCII としてあり、IEEE から IETF に戻って IEEE に確認されます。また、長さが 8 ~ 63 バイトであることが想定されていることもわかりました。これは、63 バイトよりも長い場合は切り捨てられ (NULL で終了しないので問題ありません)、それより短い場合は、 32-126 ASCII コードの外側の最初の文字でカットされます。もちろん、C 文字列の NULL ターミネータ 0x00 は、より実用的で、このところで使用するのが賢明です。

つまり、パスフレーズは 32 ~ 126 (10 進数) の ASCII コードのみで構成される文字列です。

ASCII テーブルを見ると、これがスペースで始まり、チルダ '~' で終わることがわかります。

そして、その中に0x00は絶対にありません。

したがって、簡単に言えば、パスフレーズは標準的に技術的に無効であり、未定義の動作を探しています。

ここまでお読みいただきありがとうございます。

補遺:

ネットワーク プロトコルに関して言えば、「文字列」のように見えるものは、何を前提としても単なる「文字列」であると決して想定しないでください。正確なエンコーディング/制限を常に確認してください。

Wi-Fi に関するその他の例:

もう 1 つの「文字列」は SSID です。これは本当に文字列ですか?いいえ。それは 32 バイトの raw 配列であり、ASCII も、UTF-8 も、Unicode も、何でも、終端もありません。32 バイトだけです。スタックによって使用され、放送されます (wireshark トレースを見て、分析の SSID フィールドをダブルクリックします: 32 バイト長)。したがって、SSID は、ASCII スペース、タブ、CR、LF、およびあちこちのいくつかの 0x00、または 0x00 のみで構成される可能性があります。いずれにせよ、完全に有効であり、完全な 32 バイト シーケンスとして管理されます。

編集:

そのようなパスフレーズを設定する動機について疑問に思いました.私が思いついた唯一のアイデアは-間違っていたら訂正してください.あなたの目的は、通常のユーザーが通常のキーボードを使用して、パスフレーズを入力できませんでした。悲しいことに、または実際にうまくいけば、私が説明したように、IEEE はパスフレーズのデータ​​型を正確に設計して、最も基本的なキーボードを使用して誰でも常に入力できるようにするため、これは機能しません。それが彼らの動機でした。

それで、あなたは何ができますか?

別の方法として、PSK を直接使用することもできます。これはプレーンな生の 32 バイト (表現は 64 の 16 進数の ASCII) であり、入力可能/印刷可能の考慮事項はありません。たとえば、hostapd.conf ファイルから (もちろん、PSK の例はここでは「テキスト」として表されていますが、実際には生のバイトです):

# WPA pre-shared keys for WPA-PSK. This can be either entered as a 256-bit
# secret in hex format (64 hex digits), wpa_psk, or as an ASCII passphrase
# (8..63 characters) that will be converted to PSK. This conversion uses SSID
# so the PSK changes when ASCII passphrase is used and the SSID is changed.
# wpa_psk (dot11RSNAConfigPSKValue)
# wpa_passphrase (dot11RSNAConfigPSKPassPhrase)
#wpa_psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
#wpa_passphrase=secret passphrase

しかしもちろん、1/ これは (展開に関して) ユースケースに合わない可能性があり、2/ Arduino Wi-Fi API にはそのような機能がない可能性があります。

この助けを願っています。

[0]: ここから無料でダウンロードできます: http://standards.ieee.org/getieee802/download/802.11i-2004.pdf

[1]: これは、「抽象構文記法」の「管理情報ベース」を表す IEEE 用語であり、特定の標準の名前と型を含むすべてのデータの正式な階層表記です。これは「XML」と考えることができますが、XML ではなく、IETFと IEEE (RFC 2578、RFC 1213) で使用されています。

于 2016-05-08T11:24:33.967 に答える