我是加密新手。这个问题是我上一个问题的子问题。我有一个用OpenSSL util加密的文件:
openssl aes-256-cbc -in fileIn -out fileOUT -p -k KEY
我用这个代码来解密它:
byte[] encrypted = IOUtils.toByteArray(inputStream);
Security.addProvider(new BouncyCastleProvider());
String password = "abc";
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
// Openssl puts SALTED__ then the 8 byte salt at the start of the
// file. We simply copy it out.
byte[] salt = new byte[8];
System.arraycopy(encrypted, 8, salt, 0, 8);
SecretKeyFactory fact = SecretKeyFactory.getInstance(
"PBEWITHMD5AND256BITAES-CBC-OPENSSL", "BC");
c.init(Cipher.DECRYPT_MODE, fact.generateSecret(new PBEKeySpec(
password.toCharArray(), salt, 100)));
// Decrypt the rest of the byte array (after stripping off the salt)
byte[] data = c.doFinal(encrypted, 16, encrypted.length - 16);
而且很有效。但这是一个测试案例。实际情况是,我用以下参数对文件进行了加密:
openssl aes-256-cbc-nosalt-in fileIn-out fileOUT-p-k KEY
请注意,出现了'-no盐'参数。问题是PBEKeySpec需要不为空,也不为空的盐
和迭代计数
参数。它也有没有这些参数的构造函数,但是如果我使用它,我会得到一个错误:
02-11 11:25:06.108:W/系统。err(2155):java。安全InvalidKeyException:PBE要求设置PBE参数。
问题是如何解密这些文件?如何正确处理'-nosalt'参数?
使用空盐而不是空盐,并相应地设置偏移量
Security.addProvider(new BouncyCastleProvider());
final char[] password = "pass".toCharArray();
final int saltLength = 8;
final String saltedPrefix = "Salted__";
String[] files = { "file0.txt.enc", "file0.txt.enc.nosalt" };
for (String file : files) {
byte[] encrypted = Files.readAllBytes(Paths.get("testData", "openssl", file));
byte[] salt = new byte[0];
int offset = 0;
if (new String(encrypted, 0, saltLength, "ASCII").equals(saltedPrefix)) {
salt = new byte[saltLength];
System.arraycopy(encrypted, saltedPrefix.length(), salt, 0, saltLength);
offset = saltedPrefix.length() + saltLength;
}
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWITHMD5AND256BITAES-CBC-OPENSSL", "BC");
PBEKeySpec keySpec = new PBEKeySpec(password);
PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 0);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
cipher.init(Cipher.DECRYPT_MODE, keyFactory.generateSecret(keySpec), paramSpec);
byte[] data = cipher.doFinal(encrypted, offset, encrypted.length- offset);
System.out.println(new String(data));
}
为什么PHP解密方法不能解密用Java加密的数据? 当我仅使用Java或仅在PHP中加密和解密数据时,一切工作都很好。 加密的数据被发送到服务器,在那里我尝试用PHP openssl_decrypt对其进行解密 不幸的是,openssl_decrypt返回一个空字符串。
OpenSSL提供了一个流行的(但不安全-请参见下面!)AES加密的命令行界面: Python以PyCrypto包的形式支持AES,但它只提供了工具。如何使用Python/Pycrypto解密已经使用OpenSSL加密的文件? 这个问题过去也涉及使用相同方案在Python中进行加密。我已经删除了这部分,以阻止任何人使用它。不要再用这种方式加密任何数据,因为按照今天的标准,它是不安全的。您应该只使用
我试图解密AES-128加密的m3u8视频文件,例如: m3u8 文件 : 我尝试过使用openssl: 键.txt包含很长的键 - 我做错了什么?
加密是使用Stanford Javascript加密库(SJCL)完成的。下面是一个完整的加密示例,分为两部分。第一个是关于PBKDF2的基于密码的密钥派生。在第二部分中,使用派生密钥和初始化向量(IV)进行实际加密。注意,salt和IV是硬编码的,以便更容易提供C#解密解决方案。 null 变量的值: SJCL位阵列: 十六进制编码: Base64编码: 变量的值: null AES/CCM解密
我试图在Android和PHP端使用AES加密/解密数据,并累犯空答案。 首先,我在Android中生成了对称密钥: 在服务器端,我试图解密数据。我可以解密(从RSA)秘密的AES密钥,并得到它的字符串表示。在客户端(Android)和服务器端(PHP)上是一样的。但是如何使用这个字符串AES密钥来解密数据呢?我尝试了这个(PHP): PHP中的结果: 怎么啦?
我正在尝试用AES加密一个大文件,然后解密,与原件进行比较。 这堂课总结了工作。它适用于.txt文件,但不适用于.mp3、.pdf等文件。 我们将非常感谢你的帮助。