当前位置: 首页 > 面试题库 >

使用密码短语和CBC的Java AES

伯鸿达
2023-03-14
问题内容

我想用Java用CBC加密实现256密钥AES。收件人以字符串’absnfjtyrufjdngjvhfgksdfrtifghkv’的形式向我发送了256位密码,使用以下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中并使用上述命令将其解密。我知道我的密钥应该使用我的密码生成。以下是我的代码示例,其中IV是随机生成的,而密钥是使用密码短语和随机盐生成的。

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'

我收到“错误的魔术数字”错误。我做错了Java加密的哪一步?


问题答案:

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

您还应该检查OpenSSL中密钥派生功能的文档。显然,它在算法中使用MD5,而Java代码使用SHA1。他们不会输出相同的密钥。

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

最后,避免创建自己的密钥派生函数(可以使用bash和Java轻松实现)并遵循标准(如果需要考虑安全性的话)(如果不是,为什么还要使用加密?);该算法最有可能被破坏。



 类似资料:
  • 这几天我一直在纠结。我需要使用一个接受加密参数的API。API是用C#编写的。请求的加密如下: 算法:AES 密码模式:CBC 填充模式:PKCS7 块大小:128 密钥大小:256 加密字符串的表示形式:Base64 在搜索和尝试了网上建议的那么多东西之后,我仍然无法生成相同的加密值(特别是默认情况下不支持PKCS7,而PKCS5应该工作相同,但事实并非如此)。以下是我尝试过的一些方法: 1)使

  • 我正在尝试在Go中加密数据,并使用带有PKCS7填充的AES CBC模式在Angular中解密。但是当我尝试在Angular中解密数据时,它没有返回任何内容 Go代码: Angular/CryptoJs代码: 我从加密JS解密方法中得到一个空响应。 cryptoJS的iv值应该是多少?

  • 我是密码学的新手。我的要求是对使用openssl加密/解密的文本进行解密/加密。我们在Openssl中使用的算法是aes-256-cbc。因此,我尝试在我的应用程序中实现相同的功能。到目前为止,在谷歌搜索了很多次之后,我所能做的就是。。 我的openssl命令是 我的密钥长度是32位IV是16位 Thnx...

  • 我使用以下命令加密了一个文件 openssl rand 32>test.key openssl enc-aes-256-cbc-iter 10000-pbkdf2-salt-输入test.txt-输出test.txt.enc-通过文件:test.key 我的代码 我得到的错误 我引用了以下链接 尝试使用时,仍然得到错误

  • 我最近在Java中使用了AES CBC 128算法来加密数据。现在我需要用PHP重建算法,但我不知道如何重建,因为互联网上的PHP算法返回不同的结果。也许你能帮我。 这是要加密的Java代码: 这是我的php代码: 当我从java加密加密数据时,此结果无法在Php解密上解密。 你们能帮我构建一个PHP脚本吗?它可以返回与java加密相同的结果?

  • 我需要一些帮助来验证下面的代码片段的Java AES加密与CBC、PKCS5Padding和IV。 我测试了代码,能够加密和解密。我有几个问题如下所述。 密码应该存储在哪里? 向密码文本附加/检索salt和IV字节的方式是否正确? 高度赞赏任何其他评论,谢谢!