문제
쓰려고 부부의 함수를 암호화 또는 암호 해독 파일을 사용하는 클래스는 여기에서 찾을 시도하고 이를 수행:
http://www.itnewb.com/v/PHP-Encryption-Decryption-Using-the-MCrypt-Library-libmcrypt
암호화 기능을 아래 작동하는 것 같다는 점에서 나타나는 파일을 암호화하고 장소에서 그것이 의도한 디렉토리에 있습니다.내가 하려고 해독하는 파일이 지금,그것은 그냥 죽는 메시지와 함께"을 완료하지 못했 암호 해독"(코딩기...)에 아무것도 없 php 오류 로그를,그래서는 이유를 모르겠어요 그것은 실패하지만,mcrypt 은 완전히 새로운 나에게 나보다 더 기울어 내가 뭔가 잘못된 일을 해요 여기...
여기에는 이 기능:
//ENCRYPT FILE
function encryptFile() {
global $cryptastic;
$pass = PGPPASS;
$salt = PGPSALT;
$key = $cryptastic->pbkdf2($pass, $salt, 1000, 32) or die("Failed to generate secret key.");
if ($handle = opendir(PATH.'/ftpd')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$newfile = PATH.'/encrypted/'.$file.'.txt';
$msg = file_get_contents(PATH.'/ftpd/'.$file);
$encrypted = $cryptastic->encrypt($msg, $key) or die("Failed to complete encryption.");
$nfile = fopen($newfile, 'w');
fwrite($nfile, $encrypted);
fclose($nfile);
unlink(PATH.'/ftpd/'.$file);
}
}
closedir($handle);
}
//DECRYPT FILE
function inFTP() {
global $cryptastic;
$pass = PGPPASS;
$salt = PGPSALT;
$key = $cryptastic->pbkdf2($pass, $salt, 1000, 32) or die("Failed to generate secret key.");
if ($handle = opendir(PATH.'/encrypted')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$newfile = PATH.'/decrypted/'.$file;
$msg = PATH.'/encrypted/'.$file;
$decrypted = $cryptastic->decrypt($msg, $key) or die("Failed to complete decryption.");
$nfile = fopen($newfile, 'w');
fwrite($nfile, $decrypted);
fclose($nfile);
//unlink(PATH.'/encrypted/'.$file);
}
}
closedir($handle);
}
//$crypt->decrypt($file);
}
해결책
McRypt를 사용한 암호화에 대한이 PHP5 클래스를 사용해보십시오. 이 경우 AES 암호화를 사용하고 있습니다. 사용하는 각 사이트의 키를 변경하고 싶을 것입니다. 적어도 사용하지 않으면 자신의 버전을 작성하는 데 안내 할 수 있습니다.
<?php
class Encryption
{
const CIPHER = MCRYPT_RIJNDAEL_128; // Rijndael-128 is AES
const MODE = MCRYPT_MODE_CBC;
/* Cryptographic key of length 16, 24 or 32. NOT a password! */
private $key;
public function __construct($key) {
$this->key = $key;
}
public function encrypt($plaintext) {
$ivSize = mcrypt_get_iv_size(self::CIPHER, self::MODE);
$iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM);
$ciphertext = mcrypt_encrypt(self::CIPHER, $this->key, $plaintext, self::MODE, $iv);
return base64_encode($iv.$ciphertext);
}
public function decrypt($ciphertext) {
$ciphertext = base64_decode($ciphertext);
$ivSize = mcrypt_get_iv_size(self::CIPHER, self::MODE);
if (strlen($ciphertext) < $ivSize) {
throw new Exception('Missing initialization vector');
}
$iv = substr($ciphertext, 0, $ivSize);
$ciphertext = substr($ciphertext, $ivSize);
$plaintext = mcrypt_decrypt(self::CIPHER, $this->key, $ciphertext, self::MODE, $iv);
return rtrim($plaintext, "\0");
}
}
용법:
$key = /* CRYPTOGRAPHIC!!! key */;
$crypt = new Encryption($key);
$encrypted_string = $crypt->encrypt('this is a test');
$decrypted_string = $crypt->decrypt($encrypted_string); // this is a test
메모:
- 이 클래스는 이진 데이터와 함께 사용하기에 안전하지 않습니다 (NUL 바이트로 끝날 수 있음)
- 이 클래스는 인증 된 암호화를 제공하지 않습니다.
다른 팁
면서 존 응답이 좋은,사용 base64 인코딩을 해결 하기 위해 그냥 바이너리 안전 문제와 함께 만들 것입니다 암호화된 파일이 33%더 커진 것입니다.여기에 내 PHP 의 구현 AES 립트 파일 형식으로 해결하는 모든 위의 문제됩니다.
https://github.com/philios33/PHP-AES-File-Encryption
그것은 바이너리는 안전하고 포함한 인증 암호화 합니다.사용하기 때문에 오픈 소스 aes 립트 파일 형식(.aes)그것은 완전히 호환되는 무료로 다운로드하여 설치합니다.aes 소프트웨어입니다.
인터페이스는 매우 간단하는 여부를 암호화 또는 암호 해독하고.당신은 단지 그것에 소스 파일과 암호입니다.
McRypt를 사용하여 데이터를 암호화/암호화해서는 안됩니다. 귀하의 질문과 허용 된 답변에서 볼 수 있듯이 데이터는 인증되지 않으므로 선택한 암호 텍스트 공격이 희생됩니다.
또한 개발자들이 암호화 프리미티브를 올바르게 정리할 수 있도록 많은 노력이 이루어졌습니다. 따라서 McRypt 대신 PHP 프로젝트에 Libsodium을 사용해야합니다. Libsodium은 NaCl의 포크입니다. NaCl/Libsodium은 Mac 태그 검증을 통한 타이밍 공격과 같이 개발자가 찾은 많은 암호화 함정을 제거하기 위해 작성되었습니다.
McRypt는 PHP 7.1에서 더 이상 사용되지 않으며 Libsodim은 PHP에서 암호화를 처리하는 선호하는 방법입니다.
PHP 프로젝트에서 Libsodium을 사용하는 것은 쉽고 안전합니다. Scott Arciszewski https://paragonie.com/book/pecl-libsodium. PHP 암호화를하는 사람에게는 읽을 가치가 있습니다.
케이크 꽤 좋습니다 구현 Rijndael의. 법적 파급 효과가 확실하지 않기 때문에 여기에 직접 코드를 게시하지 않습니다.
API 문서는 다음과 같습니다 용 Security::rijndael()
방법.
파일을 인코딩하는 경우 원할 것입니다 base64_encode()
이 방법을 '로 호출하기 전에'encrypt
', 그리고 base64_decode()
이 방법을 '로 호출 한 후decrypt
'