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

标签 java encryption aes secret-key

我正在使用 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/

相关文章:

cryptography - future 初始化向量的大小会增加吗?

C# AES : Encrypt a file causes "Length of the data to encrypt is invalid." error

java - chalice 。将文件上传到临时文件夹并在 gsp 中显示它们

java - 如何设置我的应用程序?

node.js - 使用 stdin 和 stdout 解密 NodeJS 中的文件

java - 使用 KeyCzar 对 Android 进行非对称加密

java - 使用 JBoss 和 Spring 在 Java Web 应用程序之间共享业务对象实例的最佳方式是什么?

java - 具有类键的弱 HashMap

c - 嵌入式系统的对称加密算法

encryption - 密码学:混合 CBC 和 CTR?