首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将小于8个字符的SSID转换为byte[]作为Rfc2898 (WPA)的salt?

如何将小于8个字符的SSID转换为byte[]作为Rfc2898 (WPA)的salt?
EN

Stack Overflow用户
提问于 2015-08-09 06:57:01
回答 1查看 478关注 0票数 1

我正在尝试将SSID和密码转换为加密的WPA密钥,我找到了一个实现,但没有在.NET中找到,而且相当复杂。通过一些研究,我发现了类Rfc2898DeriveBytes,它几乎肯定用于创建WPA密钥。问题是这里使用的salt是一个字节数组,而SSID (我认为这是WPA中专门使用的salt )是一个字符串。

如果SSID的长度等于或大于8个字符,则可以使用UTF8.GetBytes方法将其转换为byte[]并用作salt OK。测试表明,它产生的加密密钥与我找到的其他实现完全一样。

代码语言:javascript
复制
var ssid = "mySSID";//this is less than 8 and can cause exception 
                    //later on
var salt = Encoding.UTF8.GetBytes(ssid);
var wpaEncryptor = new Rfc2898DeriveBytes("myPassword", salt, 4096);
var bytes = wpaEncryptor.GetBytes(32);

但是现在如果SSID的长度小于8个字符,我不知道如何将其转换为字节_the salt requires the minimum length of 8_。我认为我们必须在这里执行一些填充算法,但不确定如何做到这一点。

我发现的是用JavaScript编写的,我当然可以不用修改就把它转换成C#,但是我真的很想使用Rfc2898DeriveBytes类。如果您对JavaScript实现感兴趣,可以查看这个http://jorisvr.nl/wpapsk.html的页面源代码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-09 10:32:02

您所指向的JavaScript代码包含以下代码片段:

代码语言:javascript
复制
while (hash.length < 64) {
    /* prepare 20-byte (5-word) output vector */
    var u = [ 0, 0, 0, 0, 0 ];
    /* prepare input vector for the first SHA1 update (salt + block number) */
    i++;
    var w = stringtowords(salt, i);

现在您可以看到,这意味着salt直接用作PBKDF2的输入(是的,我从SSID输入变量跟踪它)。不幸的是,这意味着您不能对低于8个字节的盐类直接使用PBKDF2;salt直接混合到PBKDF2中的多个迭代中。

不幸的是,Rfc2898DeriveBytes的设计者-- .NET中的PBKDF2 API --认为将安全约束构建到API中是他任务的一部分。在他们的PBKDF1实现发生了什么之后,这并不奇怪,但这可能有点过于狂热了。

作为另一种选择,您可以使用Rfc2898DeriveBytes并删除对salt大小的约束(尽管,如果我没有弄错,该约束只存在于setter上)。这样就能解决这些问题应该解决的地点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31901720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档