263

つまり、次のとおりです。

Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)

たぶん次のようなものです:

"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
  • PHPでは、どうすればこれを行うことができますか?

を使用しようとしましCrypt_Blowfishたが、うまくいきませんでした。

4

10 に答える 10

113

私はパーティーに遅れましたが、それを行う正しい方法を探していて、このページに出くわしました.これはGoogle検索のトップリターンの1つでした.この記事を書いている時点 (2017 年初頭) で最新の状態になっています。PHP 7.1.0 からmcrypt_decryptandmcrypt_encryptは非推奨になる予定です。そのため、将来的に証明されるコードを構築するには、openssl_encryptopenssl_decryptを使用する必要があります。

次のようなことができます:

$string_to_encrypt="Test";
$password="password";
$encrypted_string=openssl_encrypt($string_to_encrypt,"AES-128-ECB",$password);
$decrypted_string=openssl_decrypt($encrypted_string,"AES-128-ECB",$password);

重要: これは安全ではないECB モードを使用します。暗号工学の短期集中コースを受講せずに簡単なソリューションが必要な場合は、自分で作成するのではなく、ライブラリを使用してください。

セキュリティの必要性に応じて、他のチッパー方法も使用できます。利用可能なチッパー メソッドを見つけるには、 openssl_get_cipher_methods関数を参照してください。

于 2017-01-12T22:24:21.723 に答える
18

更新しました

PHP 7 対応バージョン。PHP OpenSSL Libraryのopenssl_encrypt関数を使用します。

class Openssl_EncryptDecrypt {
    function encrypt ($pure_string, $encryption_key) {
        $cipher     = 'AES-256-CBC';
        $options    = OPENSSL_RAW_DATA;
        $hash_algo  = 'sha256';
        $sha2len    = 32;
        $ivlen = openssl_cipher_iv_length($cipher);
        $iv = openssl_random_pseudo_bytes($ivlen);
        $ciphertext_raw = openssl_encrypt($pure_string, $cipher, $encryption_key, $options, $iv);
        $hmac = hash_hmac($hash_algo, $ciphertext_raw, $encryption_key, true);
        return $iv.$hmac.$ciphertext_raw;
    }
    function decrypt ($encrypted_string, $encryption_key) {
        $cipher     = 'AES-256-CBC';
        $options    = OPENSSL_RAW_DATA;
        $hash_algo  = 'sha256';
        $sha2len    = 32;
        $ivlen = openssl_cipher_iv_length($cipher);
        $iv = substr($encrypted_string, 0, $ivlen);
        $hmac = substr($encrypted_string, $ivlen, $sha2len);
        $ciphertext_raw = substr($encrypted_string, $ivlen+$sha2len);
        $original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $encryption_key, $options, $iv);
        $calcmac = hash_hmac($hash_algo, $ciphertext_raw, $encryption_key, true);
        if(function_exists('hash_equals')) {
            if (hash_equals($hmac, $calcmac)) return $original_plaintext;
        } else {
            if ($this->hash_equals_custom($hmac, $calcmac)) return $original_plaintext;
        }
    }
    /**
     * (Optional)
     * hash_equals() function polyfilling.
     * PHP 5.6+ timing attack safe comparison
     */
    function hash_equals_custom($knownString, $userString) {
        if (function_exists('mb_strlen')) {
            $kLen = mb_strlen($knownString, '8bit');
            $uLen = mb_strlen($userString, '8bit');
        } else {
            $kLen = strlen($knownString);
            $uLen = strlen($userString);
        }
        if ($kLen !== $uLen) {
            return false;
        }
        $result = 0;
        for ($i = 0; $i < $kLen; $i++) {
            $result |= (ord($knownString[$i]) ^ ord($userString[$i]));
        }
        return 0 === $result;
    }
}

define('ENCRYPTION_KEY', '__^%&Q@$&*!@#$%^&*^__');
$string = "This is the original string!";

$OpensslEncryption = new Openssl_EncryptDecrypt;
$encrypted = $OpensslEncryption->encrypt($string, ENCRYPTION_KEY);
$decrypted = $OpensslEncryption->decrypt($encrypted, ENCRYPTION_KEY);
于 2019-07-29T08:15:42.860 に答える
8

歴史的な注意:これは PHP4 の時点で書かれました。これが現在「レガシー コード」と呼ばれるものです。

歴史的な目的のためにこの回答を残しましたが、一部の方法は現在廃止されており、DES 暗号化方法は推奨される方法ではありません。

このコードを更新していない理由は 2 つあります。1) PHP で手動で暗号化メソッドを使用することはもうありません。2) このコードは、暗号化がどのように機能するかについての最小限の単純な概念を示すという、本来の目的を果たしています。 PHPで。

10 ~ 20 行以下のコードで始めることができる、同様に単純化された「ダミーのための PHP 暗号化」の種類のソースを見つけた場合は、コメントでお知らせください。

それを超えて、初期の PHP4 の最小限の暗号化の答えのこの古典的なエピソードをお楽しみください。


理想的には、mcrypt PHP ライブラリにアクセスできる (またはアクセスできる) のが理想的です。これは、確かに人気があり、さまざまなタスクが非常に便利であるためです。さまざまな種類の暗号化とサンプル コードの概要を以下に示します: PHP での暗号化手法

//Listing 3: Encrypting Data Using the mcrypt_ecb Function 

<?php 
echo("<h3> Symmetric Encryption </h3>"); 
$key_value = "KEYVALUE"; 
$plain_text = "PLAINTEXT"; 
$encrypted_text = mcrypt_ecb(MCRYPT_DES, $key_value, $plain_text, MCRYPT_ENCRYPT); 
echo ("<p><b> Text after encryption : </b>"); 
echo ( $encrypted_text ); 
$decrypted_text = mcrypt_ecb(MCRYPT_DES, $key_value, $encrypted_text, MCRYPT_DECRYPT); 
echo ("<p><b> Text after decryption : </b>"); 
echo ( $decrypted_text ); 
?> 

いくつかの警告:

1) 一方向ハッシュで十分な場合は、可逆暗号化または「対称」暗号化を使用しないでください。

2) クレジット カードや社会保障番号など、データが本当に機密性の高いものである場合は、停止します。単純なコードの塊が提供する以上のものを必要としますが、むしろ、この目的のために設計された暗号化ライブラリと、必要なメソッドを調査するためのかなりの時間が必要です。さらに、ソフトウェアの暗号化は、おそらく機密データのセキュリティの 10% 未満です。それは、原子力発電所の配線をやり直すようなものです。その作業が危険で困難であり、その場合は自分の知識を超えていることを受け入れてください。金銭的なペナルティは計り知れない可能性があるため、サービスを使用して責任を負う方がよい.

3) ここにリストされているように、簡単に実装できる暗号化であれば、ある程度重要な情報を合理的に保護し、偶発的/意図的な漏洩の場合に、覗き見されないようにしたり、露出を制限したりすることができます。しかし、キーが Web サーバー上にプレーン テキストで保存されていることを考えると、データを取得できれば、復号化キーを取得できます。

それが何であれ、楽しんでください:)

于 2013-05-17T04:00:36.730 に答える