2009-04-30 24 views
7

Dường như không có cách nào dễ dàng để mã hóa một tệp trong php.Phương thức mã hóa tệp Php. Có cái gì đơn giản tồn tại?

Các phương pháp được xây dựng trong php, mcrypt, không phải là rất dễ dàng vì hầu hết các máy chủ không hỗ trợ chúng.

Công cụ mã hóa dòng lệnh giống như các hacks xấu xí.

Có mã hóa cho các chuỗi đẹp, nhưng nếu chúng tôi muốn mã hóa một tệp, nó sẽ không giúp ích nhiều cho người khác không mã hóa nó.

Các công cụ mã hóa khác yêu cầu khóa công cộng, vòng chìa khóa, khóa cá nhân, mẫu máu ... Có vẻ như quá phức tạp để chỉ mã hóa tệp.

Dường như chúng ta chỉ nên có một chức năng đơn giản cho PHP có thể làm việc như vậy:

$crypt = new Crypt(); 
$crypt->encryptFile("Password1245!", 'secret_file.txt', 'encrypted_file.txt'); 
$crypt->decryptFile("Password1245!", 'encrypted_file.txt', 'original_file.txt'); 

Bất kỳ một có bất cứ ý tưởng? Tôi đang kéo tóc ra!

EDIT: Một điều tôi nên thêm, để người dùng cuối có thể giải mã tệp một cách dễ dàng.

Về cơ bản tôi đang cố gắng để tìm một cái gì đó mà có thể thay thế một mật khẩu bảo vệ file zip

Trả lời

2

Nếu bạn không nhớ có phần mở rộng Mcrypt cài đặt, mã này nên làm điều đó:

function Encrypt($string, $key) 
{ 
    if (extension_loaded('mcrypt') === true) 
    { 
     return base64_encode(mcrypt_encrypt(MCRYPT_BLOWFISH, substr($key, 0, mcrypt_get_key_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB)), trim($string), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
    } 

    return false; 
} 

function Decrypt($string, $key) 
{ 
    if (extension_loaded('mcrypt') === true) 
    { 
     return trim(mcrypt_decrypt(MCRYPT_BLOWFISH, substr($key, 0, mcrypt_get_key_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB)), base64_decode($string), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
    } 

    return false; 
} 

function Encrypt_File($source, $destination, $key) 
{ 
    if (extension_loaded('mcrypt') === true) 
    { 
     if (is_file($source) === true) 
     { 
      $source = file_get_contents($source); 

      if (file_put_contents($destination, Encrypt($source, $key), LOCK_EX) !== false) 
      { 
       return true; 
      } 
     } 
    } 

    return false; 
} 

function Decrypt_File($source, $destination, $key) 
{ 
    if (extension_loaded('mcrypt') === true) 
    { 
     if (is_file($source) === true) 
     { 
      $source = file_get_contents($source); 

      if (file_put_contents($destination, Decrypt($source, $key), LOCK_EX) !== false) 
      { 
       return true; 
      } 
     } 
    } 

    return false; 
} 
+0

Tại sao bạn sẽ muốn mã hóa base64 nội dung của một tập tin? Không có gì sai với nội dung nhị phân cho các tệp. Mã hóa base64 tăng kích thước dữ liệu 33% – Jacco

+1

Tôi không thích có dòng mới vì chúng có thể không được sao chép nếu tôi cần sử dụng dữ liệu được mã hóa trong trường hợp sao chép/dán, nhưng có nó vẫn hoạt động mà không cần mã hóa/giải mã base64 . –

-3

gì về xor đơn giản?

function Crypt($source, $key) 
{ 
$rv=''; 
for($i=0;$i<strlen($source);$i++) 
{ 
    $rv.=chr(ord($source[$i])^ord($key[$i%strlen($key)])); 
} 
return $rv; 
} 

=> Crypt (Crypt ('aaa', 'key'), 'key') trả về 'aaa'.

EDIT: tất nhiên, bạn nên sử dụng

file_put_contents(Crypt(file_get_contents('file'), 'key')); 

cho file đọc + ghi:]

+0

Đó là một thuật toán tốt, nhưng vấn đề xảy ra khi người dùng cuối cần giải mã nó. Viết tắt một ứng dụng windows để giải mã có lẽ không phải là một cách dễ dàng để họ giải mã nó. Có lẽ tôi sẽ sử dụng những gì bạn có ở đây trong các dự án khác, nó đẹp và đơn giản. – SeanDowney

+0

Lỗi nghiêm trọng: Không thể redeclare crypt() ... Lỗi nghiêm trọng: Gọi đến chức năng không xác định asc() ... NULL ...? –

+0

@SeanDowney: theo Yossarian nó nên mã hóa và giải mã các chuỗi, vấn đề duy nhất là tôi không thể làm cho nó hoạt động ngay cả sau khi sửa lỗi. = \ –

-3

Yossarian của Crypt() chức năng cố định:

function _Crypt($source, $key) 
{ 
    $result = ''; 

    for($i = 0; $i < strlen($source); $i++) 
    { 
     $result .= chr(ord($source[$i])^ord($key[$i % strlen($key)])); 
    } 

    return $result; 
} 

_Crypt('aaa', 'key'); // 
_Crypt(_Crypt('aaa', 'key'), 'key'); // aaa 
+2

Đó có phải là XOR không? -nói "mã hóa em gái", nghĩa là chỉ hữu ích cho việc giấu nội dung từ em gái của bạn (vâng, bạn có thể sử dụng OTP và các công cụ, nhưng điều đó không đơn giản) – Piskvor

+0

Đôi khi, hữu ích: P –

+1

Điều này không hữu ích trong một _Crypt là một tên chức năng gây hiểu lầm, nó không phải là mã hóa, nó là obfuscation tốt nhất – Jacco

Các vấn đề liên quan