Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有\0的arduino wifi密码短语_Arduino_Wifi_Passphrase - Fatal编程技术网

带有\0的arduino wifi密码短语

带有\0的arduino wifi密码短语,arduino,wifi,passphrase,Arduino,Wifi,Passphrase,我正在尝试将Arduino连接到WiFi网络 const char* ssid = "ssid"; char* password = "some_hex_chars"; . . . void setup(void){ WiFi.begin(ssid, password); . . . 问题是,密码短语中的某个地方有代码0x00。由于begin()方法接受参数char(以null结尾的字符串),所以密码被截断。 有办法解决这个问题吗?在哪里可以找到begin()方法的源代码来修改它 编辑:错

我正在尝试将Arduino连接到WiFi网络

const char* ssid = "ssid";
char* password = "some_hex_chars";
.
.
.
void setup(void){
  WiFi.begin(ssid, password);
.
.
.
问题是,密码短语中的某个地方有代码0x00。由于begin()方法接受参数char(以null结尾的字符串),所以密码被截断。 有办法解决这个问题吗?在哪里可以找到begin()方法的源代码来修改它

编辑:错了。 它不是密码,它是带有64个十六进制字符的PSK,它不想连接

更新: 我解决了这个问题。我不是PSK的问题,而是WiFi路由器的高级设置。什么时候


54g™ 模式设置为54g性能,它不想连接。在我将其更改为54g Auto后,它工作正常。

我对Arduino一无所知,但更了解802.11又称Wi-Fi。因此:

不要那样做。如果在你的密码短语中间有一个0x00,它在技术上是无效的,按照IEEE 802.11标准。< /强>

因此,我认为,如果正确实现,您的802.11堆栈会将其解释为您的密码短语的下一个最后一个字符(=密码短语是0x00之前的所有字符),并且您正在寻找未定义的行为-最好是互操作性问题,最坏的情况下,您是在打赌

怎么样?

(警告:这会很无聊,有很多“网络律师”的东西)

与此相关的IEEE 802.11标准是IEEE Std 802.11i-2004“修改件6:介质访问控制(MAC)安全增强”[0],也称为“WPA2”

(我不会深入挖掘WEP,它显然被弃用为无用,也不会深入挖掘“基本”WPA,它是等待WPA2标准完成的过渡)

相关部分见802.11i,ASN MIB[1](附录D,规范性),第136页,将“
dot11RSNAConfigPSKPassPhrase
”定义为“
DisplayString
”。那么“
DisplayString
”到底是什么类型的数据呢

RFC 1213,“基于TCP/IP的互联网网络管理的管理信息库:MIB-II”,1991年起,第3页,声明:

DisplayString仅限于NVT ASCII字符集,如下所示: 定义见[6]第10-11页。”

好的

这个“[6]”是1983年的RFC 854(哇!这些IETF和IEEE认真地、真的、真的建立在他们的标准之上)。你还在跟踪我吗?:-)因此,通过查看,我们了解到NVT代表“网络虚拟终端”,在第10页和第11页,我们发现:

NVT打印机[sic!记住那是1983年][…]可以生产 所有95个USASCII图形的表示(代码32到126)

好的,ASCII码32到126。现在让我们回到IEEE 802.11i:

在附录H(资料性)“RSNA参考实现和测试向量”中的“H.4建议的密码短语到PSK映射”一节中(请记住,使用SSID进行数学处理的密码短语的目的是导出PSK(预共享密钥),该密钥对802.11操作更有用,但用户友好性远低于“一个该死的简单密码短语,我可以用该死的键盘输入”)。按照IEEE的说法,它给出了以下内容(第165页):

RSNA PSK由256位或64个八位字节组成,表示为 十六进制。用户很难正确输入64个十六进制字符。 然而,大多数用户都熟悉密码并传递短语和密码 输入它们比输入键更舒服。用户更容易 可能能够输入ASCII密码或密码短语,甚至 尽管这样做限制了可能的键集 最好的办法是向PSK介绍一个通行短语 映射

本条款定义了一个pass短语–to–PSK映射,它是 与RSNAs一起使用的推荐做法

引入此通行短语映射是为了鼓励不熟悉的用户 使用加密概念来启用其 无线局域网

…那么,密码短语的用途是什么呢。然后在下一页166:

在此,以下假设适用:

  • 密码短语是由8到63个ASCII编码字符组成的序列。63个字符的限制来自于区分
    在密码短语和显示为64十六进制的PSK之间
    人物
  • 密码短语中的每个字符的编码范围必须在32到126(十进制)之间,包括32到126(十进制)。[我的重点]
瞧!事实上,“32到126(十进制),包括在内”

因此,这里我们再次将我们的密码短语作为ASCII“在32到126(十进制)的范围内”,从IEEE到IETF再到IEEE进行确认。我们还了解到,它的长度应该在8到63字节之间,我推断,这意味着如果长度超过63字节,它将被缩减(而不是以NULL结尾,这不是问题),如果更短,将在32-126 ASCII码之外的第一个字符处剪切。当然,C字符串空终止符0x00更实用、更合理

So,passphrase=仅由32到126(十进制)ASCII码组成的字符串。

查看一个ASCII表,您将看到它以空格开始,以波浪号“~”结束

其中肯定没有0x00。

因此,长话短说:您的密码短语在技术上是标准的无效的,并且您正在寻找未定义的行为

如果你读到我这一段话,恭喜你

附录:

当涉及到网络协议时,永远不要假设看起来像“字符串”的东西只是您可能预设的“字符串”,并且始终检查确切的编码/限制

关于Wi-Fi的其他示例:

另一个“字符串”是SSID。这真的是一个字符串吗?不。它是一个32字节的原始数组,没有ASCII,没有UTF-8,Unicode,不管什么,没有终止符,只有32个原始字节,即使你“将其设置”为“foobar+NULL terminator”一个whol
# 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