Java 使此算法适用于文件而不是字符串

Java 使此算法适用于文件而不是字符串,java,algorithm,encryption,Java,Algorithm,Encryption,你好,我需要AES算法的数据文件,而不是字符串 不知道如何修改这个代码。。。。。 我想要公共静态字符串加密获取通行证和文件路由,并用原始文件替换加密的文件 public class AES { private static SecretKeySpec secretKey; private static byte[] key; public static void setKey(String myKey) { MessageDigest sha =

你好,我需要AES算法的数据文件,而不是字符串 不知道如何修改这个代码。。。。。 我想要
公共静态字符串加密
获取通行证和文件路由,并用原始文件替换加密的文件

public class AES {
    private static SecretKeySpec secretKey;
    private static byte[] key;

    public static void setKey(String myKey)
    {
        MessageDigest sha = null;
        try {
            key = myKey.getBytes("UTF-8");
            sha = MessageDigest.getInstance("SHA-1");
            key = sha.digest(key);
            key = Arrays.copyOf(key, 16);
            secretKey = new SecretKeySpec(key, "AES");
        }
        catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    public static String encrypt(String strToEncrypt, String secret)
    {
        try
        {
            setKey(secret);
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
        }
        catch (Exception e)
        {
            System.out.println("Error while encrypting: " + e.toString());
        }
        return null;
    }

    public static String decrypt(String strToDecrypt, String secret)
    {
        try
        {
            setKey(secret);
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
        }
        catch (Exception e)
        {
            System.out.println("Error while decrypting: " + e.toString());
        }
        return null;
    }
}
一些意见:

  • setKey
    public
    ,但您可以将其用作
    private
    。不要将它们的密钥设置为
    加密
    ,将其留给调用者(我的首选选项),或将其设置为
    私有
    ,将其重新定义为某种帮助函数
  • encrypt
    获取一个
    字符串
    ,然后将其转换为
    字节[]
    (使用
    getBytes()
    ),并且您希望加密文件,这些文件通常称为字节,而不是字符串(并非所有文件都是文本文件)。它应该获取并返回
    字节[]
    ,IMO。如果您想将文件视为文本文件,请忽略此文件
  • 您希望
    加密
    做一些它不应该做的事情。正如所命名的,它应该只加密。不要让它使用文件等
  • 因此,我的建议是,创建一个新方法
    encryptFile

    使用
    文件。readAllBytes
    (或阅读有关阅读文本文件的内容)。
    使用
    encrypt
    加密数据。

    使用
    Files.write
    写回文件。

    您应该先看一看非常感谢您的帮助您的意思是“公共静态字节[]加密(字节[]strotencrypt.getBytes(),字符串机密)”?那么这一行呢:“return Base64.getEncoder().encodeToString(cipher.doFinal(strotencrypt.getBytes(“UTF-8”));”?No.
    公共静态字节[]加密(byte[]toEncrypt,String secret)
    。至于return语句,您应该只使用
    .encode
    (而不是
    encodeToString
    ),不应该使用
    getBytes
    ,因为您已经有了它们。