Java 如何使用'-诺萨尔特';param
我是加密新手。这个问题是我上一个问题的子问题。我有一个用OpenSSL util加密的文件:Java 如何使用'-诺萨尔特';param,java,android,encryption,aes,password-encryption,Java,Android,Encryption,Aes,Password Encryption,我是加密新手。这个问题是我上一个问题的子问题。我有一个用OpenSSL util加密的文件: openssl aes-256-cbc -in fileIn -out fileOUT -p -k KEY 我正在使用此代码对其进行解密: byte[] encrypted = IOUtils.toByteArray(inputStream); Security.addProvider(new BouncyCastleProvider()); Stri
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密钥
请注意出现了'-nosalt'参数。问题是PBEKeySpec要求不为null且不为空salt
和iterationscont
参数。它也有没有这些参数的构造函数,但如果我使用它,我会得到一个错误:
02-11 11:25:06.108:W/System.err(2155):java.security.InvalidKeyException:PBE要求设置PBE参数
问题是如何解密这些文件?如何正确处理'-nosalt'参数?使用emptysalt而不是null,并相应地设置偏移量
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));
}