我想学习 AES 加密的基础知识,所以我开始制作一个非常简单的 Java 程序。该程序将一个文本文件加载到 a 中String并要求用户提供密钥。然后程序使用 AES 加密文本,用加密的文本创建一个新的文本文件。该程序将初始化向量 (IV) 打印给用户。
该程序还具有解密功能。用户指定加密文本文件以及初始化向量和密钥,以将其解密回新文本文件中的原始文本。
但是,我认为我做错了什么。用户需要同时拥有密钥和 IV 来解密文件是 AES 加密中的正常程序吗?我浏览过互联网,几乎在每个示例中,加密数据都可以由用户仅指定密钥来解密,但在我的情况下,用户需要同时拥有密钥和 IV。该程序运行良好,但我认为它效率不高。
那么我应该使用一个常数,已知的 IV 用于所有加密和解密还是什么?还有一些教程使用“盐”,它是什么,我应该使用它吗?
这是我的加密和解密方法:
public String encrypt(String stringToEncrypt, String userKey)
throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
// User gives string key which is formatted to 16 byte and to a secret
// key
byte[] key = userKey.getBytes();
MessageDigest sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16);
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
// Cipher initialization
Cipher cipher …Run Code Online (Sandbox Code Playgroud)