McRyptを使用してファイルを暗号化 /復号化します
質問
ファイルを暗号化または復号化する機能をいくつか作成しようとしています。これを試して達成するためにここにあるクラスを使用しています。
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%大きくなります。以下は、上記のすべての問題を透過的に解決するAES Cryptファイル形式の私のPHP実装です。
https://github.com/philios33/php-aes-file-encryption
バイナリセーフであり、認証された暗号化が含まれています。オープンソースAES Cryptファイル形式(.AES)を使用するため、他の.AESソフトウェアと完全に互換性があります。
インターフェイスは、暗号化または復号化する場合でも、非常に簡単です。ソースファイルとパスワードを提供するだけです。
McRyptを使用してデータを暗号化/復号化する必要はありません。あなたの質問と受け入れられた答えで示されているように、データは認証されていません。つまり、選択した暗号文攻撃の犠牲になります。
さらに、開発者が暗号化のプリミティブを正しくまとめることを確認するために多大な努力が払われました。そのため、McRyptの代わりに、PHPプロジェクトにLibsodiumを使用する必要があります。 LibsodiumはNaClのフォークです。 NaCl/Libsodiumは、MACタグの検証を伴うタイミング攻撃など、開発者が自分自身で発見する多くの暗号化落とし穴を削除するために書かれています。
McRyptはPHP 7.1で非難されており、LibsodimはPHPの暗号化を処理するための好ましい方法です。
PHPプロジェクトでLibsodiumを使用するのは簡単で安全です。 Scott Arciszewskiは、PHPでLibsodiumを使用することに関する広範な電子ブックを書いています https://paragonie.com/book/pecl-libsodium. 。 PHP暗号化を行っている人にとっては読む価値があります。
cakephp かなり良いです 実装 Rijndaelの。法的な影響がわからないので、ここに直接コードを投稿していません。
これがAPIドキュメントです のために Security::rijndael()
方法。
ファイルをエンコードする場合は、する必要があります base64_encode()
この方法を呼び出す前にencrypt
'、 と base64_decode()
この方法を呼び出した後decrypt
'