首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Win32.Win32Exception:数据无效

Win32.Win32Exception:数据无效
EN

Stack Overflow用户
提问于 2020-10-05 18:51:00
回答 2查看 159关注 0票数 1

我编写这段代码是为了恢复用户保存的铬密码并将它们显示在控制台上。我能够解码Base64编码。但我没能从这个Crypt32Util.cryptUnprotectData那里得到任何帮助.我是个初学者。::Main.java

代码语言:javascript
复制
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();
        }
    }
}

输出

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-05 19:30:59

decoder.decode()返回二进制数据。不能从二进制数据创建String

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

代码语言:javascript
复制
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个字节,其余的是什么呢?

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

代码语言:javascript
复制
String encryptedKey = (String) tempJsonObject.get("encrypted_key");

byte[] masterKey = Crypt32Util.cryptUnprotectData(Base64.getDecoder().decode(encryptedKey));
票数 1
EN

Stack Overflow用户

发布于 2020-10-06 05:56:16

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

代码语言:javascript
复制
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);

所以它只是改变了一些值

代码语言:javascript
复制
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);

它成功了,但现在我必须理解它的关键格式:)谢谢,Andreas

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

https://stackoverflow.com/questions/64214514

复制
相关文章

相似问题

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