栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

AES-Java中的简单加密,使用openssl解密

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

AES-Java中的简单加密,使用openssl解密

问题确实是由于OpenSSL从密码计算出的密钥所致。

原因很可能是OpenSSL拥有自己的算法来从密码派生密钥EVP_BytesToKey,这与Java的算法不同。

我发现的唯一解决方案是使用该算法的Java重新实现:

private static final int KEY_LENGTH = 32;    private byte[] deriveKey(String encryptionPassword, byte[] salt) throws NoSuchAlgorithmException {    final byte[] passAndSalt = ArrayUtils.addAll(encryptionPassword.getBytes(), salt);    byte[] hash = new byte[0];    byte[] keyAndIv = new byte[0];    for (int i = 0; i < 3 && keyAndIv.length < KEY_LENGTH; i++) {        final byte[] dataToHash = ArrayUtils.addAll(hash, passAndSalt);        final MessageDigest md = MessageDigest.getInstance("SHA-256");        hash = md.digest(dataToHash);        keyAndIv = ArrayUtils.addAll(keyAndIv, hash);    }    return Arrays.copyOfRange(keyAndIv, 0, KEY_LENGTH);}ArrayUtils 是Apache Commons库的一部分。完整用法:IvParameterSpec initializationVectorSpec = new IvParameterSpec(     Hex.depreHex(encryptionInitializationVector.toCharArray()));cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");byte[] salt = new SecureRandom().generateSeed(8);byte[] key = deriveKey(encryptionPassword, salt);Key keySpec = new SecretKeySpec(key, "AES");cipher.init(Cipher.ENCRYPT_MODE, keySpec, initializationVectorSpec);byte[] rawEncryptedInput = cipher.doFinal(input.getBytes());byte[] encryptedInputWithPrependedSalt = ArrayUtils.addAll(ArrayUtils.addAll(     "Salted__".getBytes(), salt), rawEncryptedInput);return base64.getEnprer()     .enpreToString(encryptedInputWithPrependedSalt);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/463733.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号