gpt4 book ai didi

java - 如何用文件源替换 SecretKeyFactory.getInstance ("Some String")

转载 作者:行者123 更新时间:2023-12-02 12:44:01 29 4
gpt4 key购买 nike

我正在使用 SecretKeyFactory.getInstance("some String") 来加密/解密字符串。但是我使用 SecretKeyFactory.getInstance("some String") 作为 key ,但我需要使用文件中的 String key 我需要在 SecretKeyFactory.getInstance() 方法中传递名称和文件实例,但我无法做到这一点。

  SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");// here i need to replace
SecretKeyFactory factory = SecretKeyFactory.getInstance(keyFis.toString());
char[] password = "Pass@word1".toCharArray();
byte[] salt = "S@1tS@1t".getBytes("UTF-8");

KeySpec spec = new PBEKeySpec(password, salt, 65536, 128);
SecretKey tmp = factory.generateSecret(spec);
byte[] encoded = tmp.getEncoded();
return new SecretKeySpec(encoded, "AES");

我在做

  // reading the key 
String fileName = "C://somewhere//aesKey.dat";
FileInputStream keyFis = new FileInputStream(fileName);
byte[] encKey = new byte[keyFis.available()];
keyFis.read(encKey);
keyFis.close();

SecretKeyFactory factory = SecretKeyFactory.getInstance(keyFis.toString());
char[] password = "Pass@word1".toCharArray();
byte[] salt = "S@1tS@1t".getBytes("UTF-8");

KeySpec spec = new PBEKeySpec(password, salt, 65536, 128);
SecretKey tmp = factory.generateSecret(spec);
byte[] encoded = tmp.getEncoded();
return new SecretKeySpec(encoded, "AES");

但是我遇到了异常

Exception in thread "main" java.security.NoSuchAlgorithmException: java.io.FileInputStream@5ea75ea7 SecretKeyFactory not available
at javax.crypto.SecretKeyFactory.<init>(Unknown Source)
at javax.crypto.SecretKeyFactory.getInstance(Unknown Source)
at test.Main.generateKey(Main.java:66)
at test.Main.getCipher(Main.java:42)
at test.Main.Encrypt(Main.java:30)
at test.Main.main(Main.java:21)

如何解决这个问题

最佳答案

如果C:\\somewhere\\aesKey.dat包含AES key ,那么您可以将该文件读入byte[]并直接创建一个关键,因为 SecretKeySpec实现Key接口(interface)。

String fileName = "C:\\somewhere\\aesKey.dat";
byte[] encoded = Files.readAllBytes(Paths.get(fileName));
return new SecretKeySpec(encoded, "AES");

确保导入 java.nio.file.* .

<小时/>

切勿使用FileInputStream#available来确定文件的大小。返回的大小可能小于实际文件,因为读取器被缓冲。

关于java - 如何用文件源替换 SecretKeyFactory.getInstance ("Some String"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44847863/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com