首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java实现AES加密与解密

用Java实现AES加密与解密
EN

Stack Overflow用户
提问于 2019-12-16 17:19:35
回答 1查看 391关注 0票数 1

我对加密/解密相当陌生,必须对一些数据文件进行加密,但我并不完全确定我是否会以正确的方式进行加密。现在,我有一个脚本来加密所有文件,这并不包括在我的repo中,但是解密器包含在repo中,加密密钥作为环境变量读取。我认为,即使在回购中包含解密器也是错误的做法,因为算法/模式/填充在代码中是可见的,如下所示。

除此之外,经过一些研究之后,看起来如果攻击者知道初始化向量,他们将能够解密加密文件中的第一个块。我明白了吗?另外,我还读到,每次都应该随机生成向量,但我不明白如何做到这一点,因为除非我改变了加密文件的方式,否则加密器只能运行一次。

在最后一个question...would中,使用另一个环境变量来存储所使用的初始化向量是有意义的?我认为没有,因为向量的随机化是人们所追求的。

代码语言:javascript
复制
    private static byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    private static IvParameterSpec ivspec = new IvParameterSpec(iv);
    private static byte[] decodedKey = Base64.getDecoder().decode(System.getenv("SECRET_KEY"));
    private static SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");

    //any encrypted input file that is not a database will be read in as an input stream
    public static CipherInputStream decryptInputStream(InputStream inputStream) {
        try{
            // Initialize the cipher by specifying the algorithm/mode/padding
            Cipher aes2 = Cipher.getInstance("AES/CBC/PKCS5Padding");
            //
            aes2.init(Cipher.DECRYPT_MODE, originalKey, ivspec);

            CipherInputStream in = new CipherInputStream(inputStream, aes2);

            return in;
        } catch(NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException e){
            logger.info(e.getMessage());
            return null;
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-17 10:38:53

但我不能完全确定我是否会以正确的方式去做。

我有自己的几个使用密码的示例

除了静态IV (已经注释过了)之外,您还缺少了某种形式的完整性控制(用于“认证加密”的seach)。它可以使用完整的内置模式(如AES-CGM)或使用HMAC来实现.

我认为,即使在回购中包含解密器也是错误的做法,因为算法/模式/填充在代码中是可见的,如下所示。

算法/模式/填充是否可见对解决方案安全性没有影响。你唯一需要保护的就是钥匙。

除此之外,经过一些研究之后,看起来如果攻击者知道初始化向量,他们将能够解密加密文件中的第一个块。

那是胡说。对于使用相同密钥(thx Maarten)执行的每个加密操作,IV需要是唯一的(对于CBC来说,IV需要是不可预测的/随机的)。已知的IV无法帮助攻击者解密任何东西。

如前所述,- IV通常作为密文的一部分传递。通常,加密结果类似于IV || ciphertext || MAC,其中||表示级联。IV和MAC的大小是固定的,所以在解密时,参数的分割很简单。

我明白了吗?此外,我还读到,每次都要随机生成向量。

肯定

所以,静脉注射只应该在文件之间随机分配,而不是在运行之间随机分配?

使用IV的要点是,如果使用相同的密钥加密多个输入,则安全性存在一些缺陷。使用唯一的或随机的IV实际上可以防止这类弱点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59361444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档