platform.win32.Win32Exception:数据无效|爪哇

时间:2020-10-05 18:51:00

标签: java winapi encryption

我正在编写此代码来恢复用户保存的Chrome密码并将其显示在控制台上。 我能够解码Base64编码。但是我无法从此 Crypt32Util.cryptUnprotectData 获得任何帮助... 我是初学者。 :) Main.java

import java.io.FileReader;
import java.util.Base64;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import com.sun.jna.platform.win32.Crypt32Util;

public class Main {

    public static void main(String[] args) {
        String name = System.getProperty("user.home");
        name += "\\AppData\\Local\\Google\\Chrome\\User Data\\";
        String masterKey = "";
        String localState = name + "Local State";
        try {
            Object object = new JSONParser().parse(new FileReader(localState));
            System.out.println("Success");
            JSONObject jsonObject = (JSONObject) object;
            JSONObject tempJsonObject = (JSONObject) jsonObject.get("os_crypt");
            Base64.Decoder decoder = Base64.getDecoder();
            String encryptedKey = (String) tempJsonObject.get("encrypted_key");
            String decryptedKey = new String(decoder.decode(encryptedKey));
            String encryptedMasterKey = decryptedKey.substring(5);
            System.out.println(encryptedMasterKey);
            masterKey = new String(Crypt32Util.cryptUnprotectData(encryptedMasterKey.getBytes()));
            System.out.println(masterKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出

Success
[value of **encryptedMasterKey**]
com.sun.jna.platform.win32.Win32Exception: The data is invalid.
    at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:144)
    at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:117)
    at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:104)
    at com.main.Main.main(Main.java:26)

2 个答案:

答案 0 :(得分:0)

decoder.decode()返回二进制数据。您无法根据二进制数据创建String

如果您要使用byte[]返回的byte[]的前5个字节的decoder.decode(),请使用Arrays.copyOfRange()

String encryptedKey = (String) tempJsonObject.get("encrypted_key");

Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedKey = decoder.decode(encryptedKey);
byte[] encryptedMasterKey = Arrays.copyOfRange(decodedKey, 0, 5);
byte[] masterKey = Crypt32Util.cryptUnprotectData(encryptedMasterKey);

但是,我怀疑那是正确的。为什么您认为主密码只能被加密为5个字节,剩下的全部呢?

很有可能所有字节都是主密钥的加密版本:

String encryptedKey = (String) tempJsonObject.get("encrypted_key");

byte[] masterKey = Crypt32Util.cryptUnprotectData(Base64.getDecoder().decode(encryptedKey));

答案 1 :(得分:0)

@Andreas的答案几乎是正确的 我用这段代码给了我一个例外

String encryptedKey = (String) tempJsonObject.get("encrypted_key");

Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedKey = decoder.decode(encryptedKey);
byte[] encryptedMasterKey = Arrays.copyOfRange(decodedKey, 0, 5);
byte[] masterKey = Crypt32Util.cryptUnprotectData(encryptedMasterKey);

所以它只是更改了其中的一些值

String encryptedKey = (String) tempJsonObject.get("encrypted_key");

Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedKey = decoder.decode(encryptedKey);
byte[] encryptedMasterKey = Arrays.copyOfRange(decodedKey, 5, decodedKey.length);
byte[] masterKey = Crypt32Util.cryptUnprotectData(encryptedMasterKey);

它有效,但是现在我必须了解其密钥格式:) 谢谢,安德里亚斯