gpt4 book ai didi

Java AES 与 CBC 使用密码

转载 作者:搜寻专家 更新时间:2023-11-01 02:28:47 25 4
gpt4 key购买 nike

我想用 Java 实现带有 CBC 加密的 256 key AES。收件人向我发送了 256 位密码作为字符串 'absnfjtyrufjdngjvhfgksdfrtifghkv' 并且使用此 openssl 命令可以完美运行:

 echo test | openssl enc  -aes-256-cbc -a -k 'absnfjtyrufjdngjvhfgksdfrtifghkv'

base64格式的输出是:U2FsdGVkX1/yA4J8T+i1M3IZS+TO/V29rBJNl2P88oI=

当我描述它时,它返回原始输入字符串:

 echo U2FsdGVkX1/yA4J8T+i1M3IZS+TO/V29rBJNl2P88oI= | openssl enc -d -aes-256-cbc -a -k 'absnfjtyrufjdngjvhfgksdfrtifghkv'     

我的问题是我无法使我的加密在 Java 中工作并使用上述命令对其进行解密。我知道我的 key 应该使用我的密码生成。下面是我的代码示例,其中 IV 是随机生成的, key 是使用密码短语和随机盐生成的。

byte[] input = "test".getBytes();
String passphrase = "absnfjtyrufjdngjvhfgksdfrtifghkv";
int saltLength = 8;

SecureRandom random = new SecureRandom();

//randomly generate salt
byte[] salt = new byte[saltLength];
random.nextBytes(salt);

// generating key from passphrase and salt
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), salt, 1024, 256);
SecretKey key = factory.generateSecret(spec);
SecretKey kspec = new SecretKeySpec(key.getEncoded(), "AES");

// randomly generate IV
byte iv[] = new byte[16];
random.nextBytes(iv);
IvParameterSpec ips = new IvParameterSpec(iv);

Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, kspec, ips);
byte[] encryptedData = c.doFinal(input);
System.out.println(new String(Base64.encodeBase64(encryptedData)));

我的 java base64 输出是 XimWIM+8UewzobFOMfevaw==,当我尝试运行时:

echo XimWIM+8UewzobFOMfevaw= | openssl enc -d -aes-256-cbc -a -k   'absnfjtyrufjdngjvhfgksdfrtifghkv'

我收到“坏魔数(Magic Number)”错误。我做错了 java 加密的哪一步?

最佳答案

根据 this answer ,OpenSSL 使用与您在 Java 代码中使用的算法不同的 key 派生算法。因此,用于加密的 key 在您的 OpenSSL 命令和您的 Java 程序中将不同,因此输出将不同且不兼容。

您还应该查看 key derivation function 的文档在 OpenSSL 中。显然它在算法中使用 MD5,而您的 Java 代码使用的是 SHA1。他们不会输出相同的 key 。

您必须指定完全相同的 key 派生函数,或者直接指定 key ,而不是从密码短语派生。

最后,避免自己创建 key 派生函数(您可以使用 bash 和 Java 轻松实现)并坚持标准,如果安全是一个问题(如果不是,为什么还要使用加密?);算法很可能会被破坏。

关于Java AES 与 CBC 使用密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14695766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com