如何将 SecretKeyFactory.getInstance( "Some String" ) 替换为文件源



我正在使用SecretKeyFactory.getInstance("some String"(来加密/dycrypt一个字符串。但是我正在使用SecretKeyFactory.getInstance("some String"(作为键,但我需要使用文件名中的字符串键,并且我需要在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 密钥,则可以将文件读入byte[]并直接从中创建Key,因为SecretKeySpec实现了Key接口。

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

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


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

最新更新