Java CryptUnprotectData Windows WiFi Passwords

Java CryptUnprotectData Windows WiFi Passwords

本文关键字:Passwords WiFi Windows CryptUnprotectData Java      更新时间:2023-10-16

我正在尝试使用应该与cryptUnprotectData()一起使用的Java在同一台计算机上解密Windows WiFi密码,但是我收到以下错误:

Exception in thread "main" com.sun.jna.platform.win32.Win32Exception: The data is invalid.
    at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:128)
    at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:103)
    at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:90)

我正在使用这个Java代码:

String encryptedWirelessKey = "01000000D08C9DDF0115D1118C7A00C0***TRUNCATED***";
byte[] bytes = Crypt32Util.cryptUnprotectData(encryptedWirelessKey.getBytes(Charset.defaultCharset()));
System.out.println(new String(bytes));

在这里,您可以阅读有关Windows存储WiFi密码的位置的更多信息。为什么当我直接从XML keyMaterial标签复制数据时数据无效?我是计算机上的管理员,密码由我的用户帐户提供。

更新

import com.sun.jna.platform.win32.Crypt32Util;
public class Testing
{
    public static void main(String[] arguments) throws Exception
    {
        String encryptedWirelessKey = "01000000D08C9DDF0115D1118C7A00C0***TRUNCATED***";
        byte[] bytes = Crypt32Util.cryptUnprotectData(hexStringToByteArray(encryptedWirelessKey));
        System.out.println(new String(bytes));
    }
    private static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                    + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }
}

这将引发以下异常:

Exception in thread "main" com.sun.jna.platform.win32.Win32Exception: Key not valid for use in specified state.
    at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:128)
    at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:103)
    at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:90)

这到底是什么意思?缺少权限?

当您应该将十六进制字符串解析为字节时,您正在对十六进制字符串使用getBytes()

从以下链接中选择您喜欢的方式。

在 Java 中,如何将十六进制字符串转换为字节[]?

使用 Java 将十六进制转储的字符串表示形式转换为字节数组?