java中的AES加密

java中的AES加密,java,aes,Java,Aes,我有一个使用AES算法进行加密和解密的程序,但我必须指定加密文件的名称,还必须指定原始文件的格式作为加密文件名称的一部分。我想知道如何在我的代码中实现以下功能: 我希望加密文件的名称是密文 我希望计算机能够决定文件类型(扩展名eg.txt),而无需我指定它,例如,在我的代码中,如果我加密.jpg文件,我必须将加密文件的名称指定为encrypt.jpg 以下是我尝试实现的代码: import java.io.File; import java.io.FileInputStream; import

我有一个使用AES算法进行加密和解密的程序,但我必须指定加密文件的名称,还必须指定原始文件的格式作为加密文件名称的一部分。我想知道如何在我的代码中实现以下功能:

  • 我希望加密文件的名称是密文
  • 我希望计算机能够决定文件类型(扩展名eg.txt),而无需我指定它,例如,在我的代码中,如果我加密.jpg文件,我必须将加密文件的名称指定为encrypt.jpg
  • 以下是我尝试实现的代码:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.CipherOutputStream;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.ShortBufferException;
    import javax.crypto.spec.SecretKeySpec;
    
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.util.Scanner;
    
    public class EncryptDecrypt {
        static Cipher cipher;
        static byte[] cipherText;
        static byte[] input;
        static byte k[]="2305ty6345663ty0".getBytes();
        static SecretKeySpec key = new SecretKeySpec(k, "AES");
        static int ctLength;
        static String filePath = "C:/inddexfolder/casie.jpg";
        static String encryptionPath = "C:/indexfolder1/encrypt.jpg";
    
            public static void main(String[] args) {
                EncryptDecrypt.encrypt();
                EncryptDecrypt.decrypt();
            }
    
            public static void encrypt() {
                try{
                    input = filePath.getBytes();
                    FileInputStream file = new FileInputStream(filePath);
                    FileOutputStream outStream = new FileOutputStream(encryptionPath);
    
                    cipher  = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
    
                    cipher.init(Cipher.ENCRYPT_MODE, key);
                    cipherText = new byte[cipher.getOutputSize(input.length)];
                    ctLength = cipher.update(input, 0, input.length, cipherText, 0);
                    ctLength+= cipher.doFinal(cipherText, ctLength);
                    String encrypted = new String (cipherText);
                    CipherOutputStream cos = new CipherOutputStream(outStream, cipher);
                    byte[] buf = new byte[1024];
                    int read;
                    while((read=file.read(buf))!=-1){
                        cos.write(buf,0,read);
                    }
                    file.close();
                    outStream.flush();
                    cos.close();
                }
                catch(IOException e) {  
                    e.printStackTrace();
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                } catch (NoSuchPaddingException e) {
                    e.printStackTrace();
                } catch (InvalidKeyException e) {
                    e.printStackTrace();
                } catch (NoSuchProviderException e) {
                    e.printStackTrace();
                } catch (IllegalBlockSizeException e) {
                    e.printStackTrace();
                } catch (ShortBufferException e) {
                    e.printStackTrace();
                } catch (BadPaddingException e) {
                    e.printStackTrace();
                }
            }
    
            public static void decrypt() {
            try {
                FileInputStream file = new FileInputStream(encryptionPath);
                FileOutputStream outStream = new FileOutputStream("casenc1.jpg");
                byte k[]="2305ty6345663ty0".getBytes();
                SecretKeySpec key = new SecretKeySpec(k, "AES");
                cipher  = Cipher.getInstance("AES");
                cipher.init(Cipher.DECRYPT_MODE, key);
                CipherOutputStream cos = new CipherOutputStream(outStream, cipher);
                byte[] buf = new byte[1024];
                int read;
                while((read=file.read(buf))!=-1) {
                    cos.write(buf,0,read);
                }
                file.close();
                outStream.flush();
                cos.close();
    
             Runtime.getRuntime().exec("rundll32 url.dll, FiProtocolHandler 
              "+"casenc1.jpg");
    
            } catch(IOException e) {
                System.out.println(" not decrypted Successfully");
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            }
        }
    }
    
    对于encrypt方法中的FileOutputStream,我尝试了:

    FileOutputStream outStream
        = new FileOutputStream(encryptionPath = new String(cipherText));      
    
    …以查看是否可以将文件名设置为密文,但出现以下错误:

    Exception in thread "main" java.lang.NullPointerException
    at java.lang.String.<init>(Unknown Source)
    at EncryptDecrypt.encrypt(EncryptDecrypt.java:48)
    at EncryptDecrypt.main(EncryptDecrypt.java:37)
    
    线程“main”java.lang.NullPointerException中的异常 位于java.lang.String。(未知源) 在EncryptDecrypt.encrypt(EncryptDecrypt.java:48) 位于EncryptDecrypt.main(EncryptDecrypt.java:37)
    谢谢

    您的
    密文
    为空。请检查在加密之前是否尝试分配它

    FileOutputStream outStream
        = new FileOutputStream(encryptionPath = new String(cipherText));   
    

    主要第37行是哪一行?因为你要问两个不相关的问题,所以你应该发布两个独立的问题。