我正在尝试将SSID和密码转换为加密的WPA密钥,我找到了一个实现,但没有在.NET中找到,而且相当复杂。通过一些研究,我发现了类Rfc2898DeriveBytes,它几乎肯定用于创建WPA密钥。问题是这里使用的salt是一个字节数组,而SSID (我认为这是WPA中专门使用的salt )是一个字符串。
如果SSID的长度等于或大于8个字符,则可以使用UTF8.GetBytes方法将其转换为byte[]并用作salt OK。测试表明,它产生的加密密钥与我找到的其他实现完全一样。
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的页面源代码
发布于 2015-08-09 10:32:02
您所指向的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上)。这样就能解决这些问题应该解决的地点。
https://stackoverflow.com/questions/31901720
复制相似问题