2014-02-11 3 views
2

Я новичок в шифровании. Этот вопрос является подтекстом моего предыдущего. У меня есть файл, зашифрованный с OpenSSL Util:Как расшифровать зашифрованный файл AES с параметром '-nosalt'

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); 

И это работает. Но это тестовый пример. Реальная ситуация такова, что у меня есть файл, зашифрованный с этими Params:

openssl aes-256-cbc -nosalt -in fileIn -out fileOUT -p -k KEY

Обратите внимание, что "-nosalt Парам появился. Проблема в том, что PBEKeySpec требует не пустых, а не пустых salt и iterationsCount параметров. Кроме того, есть конструктор без этих Params, но если я использую его, то я получаю сообщение об ошибке:

02-11 11:25:06.108: W/System.err(2155): java.security.InvalidKeyException: PBE requires PBE parameters to be set.

Вопрос заключается в том, чтобы расшифровать эти файлы? Как правильно обращаться с параметром «-nosalt»?

ответ

2

Используйте пустой соль вместо нулевой и установить смещение соответственно

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)); 
} 
Смежные вопросы