ホームページ  >  記事  >  バックエンド開発  >  PHPの暗号化と復号化について詳しく解説

PHPの暗号化と復号化について詳しく解説

小云云
小云云オリジナル
2018-05-11 15:26:426549ブラウズ

あなたが PHP の暗号化と復号化についてどれだけ知っているかはわかりませんが、この記事では主に PHP の暗号化と復号化に関する知識を皆さんと共有し、皆さんのお役に立つことを願っています。

対称暗号化

1. mycyrpt:

/** 
* @param $key  //数据加密密钥 由自己定义,长度有限制 string 
* @param $string  //需要进行加解密的字符串 string 
* @param $decrypt //加密还是解密 (最简单的,0代表加密,1代表解密) 
* @return string */
function encryptDecrypt($key, $string, $decrypt)
{   
 if(!$decrypt){        
 //加密        
 $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));        
 return $encrypted;    
 }else{       
 //解密        
 $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");        
 return $decrypted;    
 }

}//使用方法:echo encryptDecrypt('passwordgg', 'Hello欢迎您',0);  
//加密  
ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM=echo encryptDecrypt('passwordgg', 'ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM=',1);  
//解密  
Hello欢迎您

の対称暗号化 注: この方法は php7.1 以降廃止され、openssl_encrypt と openssl_decrypt が暗号化に使用されることが公式に推奨されています。 decryption

2.OpenSSL 拡張

/** 
* @param string $data 需要加解密的数据字符串 string
* @param int $yes 加密还是解密(1表示加密,0表示解密) 
* @param string $key 数据加密密钥 
* @param string $iv 初始化向量 //注:这里为了显示效果,暂时将iv存储到session中, 
* @param string $iv 实际应用中,应该将iv和加密后的字符串都存储在数据库 
* @param string $encryptMethod  
数据加密方式 100余种,可通过openssl_get_cipher_methods()函数获取, 
* @param string $encryptMethod  选择其中一种(如果选择cbc结尾的加密算法,
需要初始化向量iv,如本例) 
* @return string 
*/
function openssl_crypt($data='',$yes=1,$key='secret',$iv='',$encryptMethod='aes-256-cbc'){    
if($yes)
{        
$ivLength = openssl_cipher_iv_length($encryptMethod); //获取该加密算法iv应该具有的长度        
$iv = openssl_random_pseudo_bytes($ivLength, $isStrong); //生成iv(初始化向量)       
 if (false === $iv && false === $isStrong) 
 {            
 die('IV generate failed');        
 }        
//加密        
$encrypted = openssl_encrypt($data, $encryptMethod, $key, 0, $iv);        
$_SESSION['iv']=$iv; //将iv存到session中        
return $encrypted;    
}else{       
 //解密        
 $decrypted = openssl_decrypt($data, $encryptMethod, $key, 0, $iv);        
 return $decrypted;    
 }
}//使用方法
echo $a=openssl_crypt('我爱北京天安门 /我爱祖国',1,'passG506'); //加密 
LMcwSGlTFijXRdcPaccYoc08xgr7NydtZ+Wrhdv/145gF3/ayKQCJvRLmvhs5ec8echo "<br>";
echo openssl_crypt($a,0,&#39;passG506&#39;,$_SESSION[&#39;iv&#39;]); //解密 我爱北京天安门 /我爱祖国
の対称暗号化

注: 1. iv を生成する必要があるのはなぜですか、iv の役割は何ですか

openssl_get_cipher_methods() によって返される暗号化アルゴリズムのリストを確認してください。多くのアルゴリズムがあります名前の中央に「CBC」という単語が含まれている場合、これらの暗号化アルゴリズムは同じ暗号化モード、つまり暗号ブロック チェーンを使用します。

CBC モードの暗号化アルゴリズムでは、平文がいくつかのグループに分割され、グループごとに暗号化されます。各グループの暗号化プロセスは前のグループのデータに依存します。このグループの暗号文を生成するには、前のグループのデータと XOR 演算する必要があります。では、最初のグループは誰を頼りにするのでしょうか?これは IV に依存するため、IV は初期化ベクトルと呼ばれます。 IV は初期化ベクトルの略称です

IV はランダムに生成される必要があるため、コードでは openssl_random_pseudo_bytes() を使用して IV を生成します。この関数は、生成する必要がある IV の長さを表す int を受け取ります。
IVの長さは暗号化アルゴリズムによって異なります。ほとんどの人は、非常に多くのアルゴリズムで必要とされる IV 長を覚えていません。そのため、openssl_cipher_iv_length() 関数を直接使用します。この関数は、暗号化アルゴリズムで必要な IV 長を示す int を返します:

echo openssl_cipher_iv_length(&#39;AES-256-CBC&#39;); // 16
echo openssl_cipher_iv_length(&#39;BC-CBC&#39;); // 8
echo openssl_cipher_iv_length(&#39;AES-128-ECB&#39;); // 0

たとえば、AES-256-CBC には 16 ビットの IV が必要で、BC-CBC には 8 ビットの IV が必要です。 -bit IV、AES-128-ECB は IV を必要としないため、0 が返されます。

2. 使用上の注意点

暗号化と復号を実行する場合、スムーズな復号のために、2 つの関数の最初のパラメータを除く他のパラメータは同じである必要があります。最後に、IV を必要とする暗号化アルゴリズムを使用する場合は、次の点に注意する必要があります。
$iv パラメータを渡す必要があります。渡さない場合、PHP は警告をスローします (たとえば、openssl_random_pseudo_bytes() を使用します)。 ) 手動で設定することはできません。
IV は暗号化ごとに再生成する必要があります。複数の暗号化に同じ IV を使用しないでください (そうしないと、暗号化が解除されません)。暗号文文字列に直接添付することも、個別に保存することもできます。


理解できない場合は、対称暗号化を参照してください

2 番目の非対称暗号化

一般的に使用される非対称暗号化は、RSA アルゴリズムです。復号化には異なるキーが使用され、一方は公開キーとして外部に公開され、もう一方はプライベート所有者のみが所有し、秘密キーとして機能します。

秘密鍵で暗号化された情報は公開鍵でのみ復号化でき、逆に、公開鍵で暗号化された情報は秘密鍵でのみ復号化できます。

RSA 暗号化と復号化の前に、公開キーと秘密キーのペアを生成する必要があります。Linux に付属の RSA キー生成ツール openssl を使用して、公開キーと秘密キーのペアを取得することもできます。公開鍵と秘密鍵のペアを生成する拡張関数。

以下を参照してください: RSA 非対称暗号化

注: 非対称暗号化の欠点は、機密保持と復号化に時間がかかり、低速であり、少量のデータの暗号化にのみ適していることです。

高速な暗号化速度が必要だが、対称暗号化よりもデータの安全性も確保したい場合は、ハイブリッド暗号化を使用できます。 (つまり、データに対して対称暗号化を実行し、キーに対して非対称暗号化を実行します)

復号するときは、まず非対称暗号を使用してキーを取得し、次にそのキーを使用して暗号文を復号し、平文を取得します。

関連する推奨事項:

PHP がカスタムキーを使用してデータの暗号化と復号化メソッドを実装する方法

暗号化と復号化に関する mysql 関数

PHP 文字列の暗号化と復号化の実装プロセスの共有

以上がPHPの暗号化と復号化について詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。