使用AES和散列密码作为密钥

时间:2017-04-02 17:16:10

标签: java security encryption cryptography aes

我已经查看了有关此主题的几篇帖子,例如this帖子以实际加密/解密,以及this发布关于使用字符串作为种子生成密钥以生成随机密钥。加密将我的文件大小从3mb减少到16字节,解密将其进一步减少到0字节。我还看了this YouTube video这个话题,我的代码也有同样的问题,在解密过程中文件大小减少到零,而他的工作正常。

这是我的函数,它根据传递为k的SHA256哈希生成密钥:

 public static Key keyGen(String k) throws Exception {
     SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
     KeySpec spec = new PBEKeySpec(k.toCharArray(), k.getBytes(), 12, 128);
     SecretKey tmp = factory.generateSecret(spec);
     return new SecretKeySpec(tmp.getEncoded(), "AES");
 }

这些是我用来加密和解密的功能:

public static void encrypt(Key key, byte[] content) throws Exception {
        Cipher cipher;
        byte[] encrypted = null;
        try {
            cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE,  key);
            encrypted = cipher.doFinal(content);
        } catch (Exception e) {
            e.printStackTrace();
        }
        saveFile(encrypted);
        JOptionPane.showMessageDialog(null, "Encryption complete");
    }


 public static void decrypt(Key key, byte[] textCryp) throws Exception {
        Cipher cipher;
        byte[] decrypted = null;
        try {
            cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key);
            decrypted = cipher.doFinal(textCryp);
        } catch (Exception e) {
            e.printStackTrace();
        }
        saveFile(decrypted);
        JOptionPane.showMessageDialog(null, "Decryption complete");
    }

我用来将内容写回文件的功能:

   public static void saveFile(byte[] bytes) throws IOException {
        FileOutputStream fos = new FileOutputStream("filepath/test.jpg");
        fos.write(bytes);
        fos.close();
    }

最后,获取图像文件的字节表示的函数,传递到加密/解密函数作为"内容":

public static byte[] getFile() {

    File f = new File("filepath/test.jpg");
    InputStream is = null;
    try {
        is = new FileInputStream(f);
    } catch (FileNotFoundException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }
    byte[] content = null;
    try {
        content = new byte[is.available()];
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        is.read(content);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return content;
}

调用这些函数的主函数:

public static void main(String[] args) throws Exception {
    Key key = keyGen("1234567812345678");
    byte[] fileContents = getFile();
    //I change to decrypt after I call encrypt
    encrypt(key,fileContents);

 }

没有抛出任何错误或异常,我在编写此代码时引用的帖子和视频似乎工作正常。

我真的很感激这方面的建议,因为这是我长期以来一直在努力的项目的最后一部分。

1 个答案:

答案 0 :(得分:0)

经过多次试验,我意识到我试图运行代码的测试文件是在云端驱动器中。我将文件复制到本地目录,重新编写代码并完美运行。