2012-06-24 2 views
0

мне нужно сделать скрипт, чтобы сделать следующую последовательность:Зашифровать файл Jar, Альтернативный, данные, зашифровать его снова и сохранить

  • 1) Пользователь вводит секретный ключ, давайте назовем его $ user_key
  • 2) Прочитайте содержимое файла по умолчанию (file_get_contents сохраняется в $ data)
  • 3) Шифровать $ данные в AES 128 с 3 случайными клавишами (сохраняется в $ data)
  • 4) Объедините эти 3 ключа в конце $ данные
  • 5) Введите данные
  • 6) Шифрование $ данных с пользователя секретного ключа
  • 7) Написать $ данных в уникальный файл

Он работает (Java дешифрование), если я делаю только части 1, 2, 4 , 5, 6 и 7. Это вообще не работает (дешифрование Java не работает), если я шифрую файл со случайными ключами.

Я сделал что-то не так в Php (как пропуская пробел или что-то еще)?

Вот код, который я использую. Я выделил строки с 1 по 3, которые заставляют скрипт работать неправильно.

$data = file_get_contents('default_file.jar'); 

// Generate 3 AES keys 
$ramdom_key_1 = randomAESKey(); 
$ramdom_key_2 = randomAESKey(); 
$ramdom_key_3 = randomAESKey(); 

// Encrypt three times the raw data with the user key 
$data = AESEncrypt(pad($data, 16), $ramdom_key_1);  // LINE 1 
$data = AESEncrypt($data, $ramdom_key_2);    // LINE 2 
$data = AESEncrypt($data, $ramdom_key_3);    // LINE 3 

// Add the 3 keys to the data raw 
$data .= $ramdom_key_3 . $ramdom_key_2 . $ramdom_key_1; 

// Final encryption with the user's key 
$data = AESEncrypt(pad($data, 16), $user_key); 

// Write the raw data to an unique file 
file_put_contents('new_file.jar', $data); 

Вот мой Java-код для расшифровки файла:

byte[] content = download(url); 
content = Crypto.decrypt(content, user_key); 

String content = new String(data); 
String keys = content.substring(content.length() - 48, content.length()); 
String[] keys = new String[] { keys.substring(0, 16), keys.substring(16, 32), keys.substring(32, 48) }; 

byte[] cleared_content = new byte[content.length - 48]; 
System.arraycopy(content, 0, cleared_content, 0, content.length - 48); 

// For each keys, decrypt the file data 
for (String key : keys) 
{ 
    cleared_content = Crypto.decrypt(cleared_content, key.getBytes()); 
} 

return cleared_content; 

Мой класс криптографических выглядит следующим образом (лишь малая часть):

public static byte[] decrypt(byte[] input) 
{ 
    try 
    { 
     SecretKeySpec skey = new SecretKeySpec(KEY.getBytes(), "AES"); 
     Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, skey); 
     return cipher.doFinal(input); 
    } 
    catch (Exception e) {} 
    return input; 
} 

Поскольку ключи хранящийся в порядке desc, мне просто нужно выполнить дешифрование.

Быстрый редактировать, чтобы показать свою функцию коврик в PHP:

function pad($data, $blocksize) 
{ 
    $pad = $blocksize - (strlen($data) % $blocksize); 
    return $data . str_repeat(chr($pad), $pad); 
} 
+0

Прежде всего, необходимо обновить вопрос с фактическим описанием ошибки. «Это совсем не работает» - не очень хорошее описание ошибки. Добавьте код расшифровки Java, если это вообще возможно. –

+0

С кодом с точки зрения программирования нет чего-то неотъемлемо. Интересно, расшифровываете ли вы в Java, используя правильный режим и дополнение, и используя ключи в правильном порядке. Если вы применяете только прописку для пропуска № 1 шифрования, вы не должны ожидать заполнения для расшифровки # 1 и # 2 в Java. Я не буду вдаваться в тщетность шифрования и добавления ключей к зашифрованному тексту. –

+0

Пользователь не может ввести ключ, пользователь может ввести только пароль. Ключи не являются пропущенными фразами. Вам нужна функция деривации ключей для безопасного преобразования фразы доступа в ключ, такой как PBKDF2, bcrypt или scrypt. И если вы идете этим путем, вы можете просто использовать шифрование на основе пароля, как это определено в общедоступном стандарте PKCS № 5 лабораториями RSA. –

ответ

0

Проблема решена. Благодаря owlstead.

Я изменил

$data = AESEncrypt(pad($data, 16), $ramdom_key_1);  // LINE 1 
$data = AESEncrypt($data, $ramdom_key_2);    // LINE 2 
$data = AESEncrypt($data, $ramdom_key_3);    // LINE 3 

в

$data = AESEncrypt(pad($data, 16), $ramdom_key_1);  // LINE 1 
$data = AESEncrypt(pad($data, 16), $ramdom_key_2);  // LINE 2 
$data = AESEncrypt(pad($data, 16), $ramdom_key_3);  // LINE 3 
Смежные вопросы