ホームページ > バックエンド開発 > PHPチュートリアル > PHP の組み込み関数を使用した DES アルゴリズムによるデータの暗号化と復号化

PHP の組み込み関数を使用した DES アルゴリズムによるデータの暗号化と復号化

高洛峰
リリース: 2023-03-03 18:44:02
オリジナル
1069 人が閲覧しました

プロジェクトの都合上、「認可コード」を生成できるクラスを記述する必要があります(認可コードには主にプロジェクトの有効期限が含まれます)。生成された認可コードはファイルに書き込まれます。プロジェクトが実行されると、ファイル内の暗号文が自動的に読み取られ、一意の「キー」を使用して関数が呼び出され、暗号文が復号化され、プロジェクトの有効期限が解釈されます。
以前、base64+md5+reverse stringを中心にまずは書いてみました。このアルゴリズムは単純すぎるため簡単に解読され、暗号化と復号化における「鍵」の重要性を認識できていないため、放棄されました。
その後、関連情報を検索したところ、Mcrypt という強力な関数ライブラリが PHP に組み込まれていることがわかりました。実際、mcrypt 自体は強力な暗号化および復号化メソッドを提供し、DES、TripleDES、Blowfish (デフォルト)、3-WAY、SAFER-SK64、SAFER-SK128、TWOFISH、TEA、RC2、およびCBC、OFB、CFB、ECB の GOST。
以下は、Baidu Encyclopedia の「暗号化アルゴリズム」の説明からの簡単な引用です:
データ暗号化の基本的なプロセスは、元はプレーン テキストだったファイルまたはデータを特定のアルゴリズムに従って処理し、通常「暗号化アルゴリズム」と呼ばれる読み取り不可能なコードにします。 「暗号文」では、対応するキーを入力した場合にのみ元のコンテンツが表示されます。この方法により、不正な人物によるデータの盗難や読み取りを保護するという目的が達成されます。 このプロセスの逆は復号化であり、エンコードされた情報を元のデータに変換するプロセスです。
暗号化技術は通常「対称」と「非対称」の2つに分類されます。
対称暗号化は、暗号化と復号化に同じキーを使用します。この暗号化技術は、現在広く使用されています。たとえば、米国政府が採用している DES 暗号化規格は、その代表的な暗号化方式です。セッションキーの長さは56ビットです。
非対称暗号化とは、暗号化と復号化に異なる鍵が使用されることを意味します。通常、「公開鍵」と「秘密鍵」と呼ばれる 2 つの鍵があり、それらをペアにする必要があります。そうしないと、暗号化されたファイルを開くことができません。ここでの「公開鍵」は外部に公開できることを意味しますが、「秘密鍵」は外部に公開できず、所有者のみが知ることができます。ここに対称暗号方式の優位性があり、暗号化されたファイルをネットワーク上に送信する場合、どの方法を使っても相手に鍵を伝えることが難しく、盗聴される可能性がある。非対称暗号化方式は鍵が 2 つあり、「公開鍵」を公開できるため、受信者は復号するときに自分の秘密鍵を使用するだけで済み、鍵の送信を回避できる点が非常に優れています。セキュリティ上の問題。
前述したように、mcrypt はさまざまな国際的に公開されているアルゴリズムをサポートしています。このプロジェクトでは、対称アルゴリズムであり、高速で大量のデータの暗号化に適した DES (Data Encryption Standard) アルゴリズムを使用しました。
次に、暗号化クラスで使用されるいくつかの関数について簡単に説明します。

------------------------------------------------ --------------------------------
resource mcrypt_module_open ( string $algorithm , string $algorithm_directory , string $mode , string $ mode_directory )
パラメータ $algorithm: 使用するアルゴリズム。関数 mcrypt_list_algorithms() を使用して、サポートされているすべてのアルゴリズム名を表示できます。
パラメータ $mode: 使用するモード。同様に、組み込み関数 mcrypt_list_algorithms() を使用して、サポートされているすべてのモードを表示

------------------------------------------ ---- --------------------------------
int mcrypt_enc_get_iv_size ( resource $td )
この関数は、使用されるアルゴリズムの初期化 ベクトル (IV) のサイズ (少し抽象的ですが)、IV がアルゴリズムで無視される場合は 0 を返します。
パラメータ$tdはmcrypt_module_open関数の戻り値です。

------------------------------------------------ --------------------------------
string mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_RANDOM ] )
これこの関数は初期化ベクトル (IV) を作成します
パラメータ:
$source は MCRYPT_RAND、MCRYPT_DEV_RANDOM、
MCRYPT_DEV_URANDOM です
注: PHP5.3.0 以降は MCRYPT_RAND のみをサポートします
戻り値:
成功した場合、文字列が返されます 初期ベクトル、失敗した場合はFalseが返されます

-------------------------------------- - --------------------------------------
int mcrypt_enc_get_key_size ( resource $td )
この関数は、現在のアルゴリズムでサポートされている最大キー長 (バイト単位) を取得できます
int mcrypt_generic_init ( resource $td , string $key , string $iv )
mcrypt_generic() または mdecrypt_generic() を呼び出す前に、最初に呼び出す必要がありますこの関数は、暗号化されたデータを保存するためのバッファを初期化するのに役立ちます。
パラメータ $key: キーの長さ $key の現在の値は関数 mcrypt_enc_get_key_size() によって返される値より小さいことに注意してください。问题:$key的值,越大越好吗?有同学会的,帮忙解答下。 

-------------------------------------------------------------------------------- 
string mcrypt_generic ( resource $td , string $data ) 
完成了前面的工作之后,就可以调用该函数用以加密数据了。 
参数$data:要加密的数据内容 
返回值:返回加密后的密文 

-------------------------------------------------------------------------------- 
bool mcrypt_generic_deinit ( resource $td ) 
该函数能够帮我们卸载当前使用的加密模块。 
返回值 
成功时返回 TRUE, 或者在失败时返回 FALSE. 

-------------------------------------------------------------------------------- 
string mdecrypt_generic ( resource $td , string $data ) 
该函数能够用来解密数据。 
注意:解密后的数据可能比实际上的更长,可能会有后续的\0,需去掉 

-------------------------------------------------------------------------------- 
bool mcrypt_module_close ( resource $td ) 
关闭指定的加密模块资源句柄 
返回值 
成功时返回 TRUE, 或者在失败时返回 FALSE. 

<?php 
class authCode { 
public $ttl;//到期时间 时间格式:20120101(年月日) 
public $key_1;//密钥1 
public $key_2;//密钥2 
public $td; 
public $ks;//密钥的长度 
public $iv;//初始向量 
public $salt;//盐值(某个特定的字符串) 
public $encode;//加密后的信息 
public $return_array = array(); // 返回带有MAC地址的字串数组 
public $mac_addr;//mac地址 
public $filepath;//保存密文的文件路径 
public function __construct(){ 
//获取物理地址 
$this->mac_addr=$this->getmac(PHP_OS); 
$this->filepath="./licence.txt"; 
$this->ttl="20120619";//到期时间 
$this->salt="~!@#$";//盐值,用以提高密文的安全性 
// echo "<pre class="brush:php;toolbar:false">".print_r(mcrypt_list_algorithms ())."
"; // echo "
".print_r(mcrypt_list_modes())."
"; } /** * 对明文信息进行加密 * @param $key 密钥 */ public function encode($key) { $this->td = mcrypt_module_open(MCRYPT_DES,'','ecb',''); //使用MCRYPT_DES算法,ecb模式 $size=mcrypt_enc_get_iv_size($this->td);//设置初始向量的大小 $this->iv = mcrypt_create_iv($size, MCRYPT_RAND);//创建初始向量 $this->ks = mcrypt_enc_get_key_size($this->td);//返回所支持的最大的密钥长度(以字节计算) $this->key_1 = substr(md5(md5($key).$this->salt),0,$this->ks); mcrypt_generic_init($this->td, $this->key_1, $this->iv); //初始处理 //要保存到明文 $con=$this->mac_addr.$this->ttl; //加密 $this->encode = mcrypt_generic($this->td, $con); //结束处理 mcrypt_generic_deinit($this->td); //将密文保存到文件中 $this->savetofile(); } /** * 对密文进行解密 * @param $key 密钥 */ public function decode($key) { try { if (!file_exists($this->filepath)){ throw new Exception("授权文件不存在"); }else{//如果授权文件存在的话,则读取授权文件中的密文 $fp=fopen($this->filepath,'r'); $secret=fread($fp,filesize($this->filepath)); $this->key_2 = substr(md5(md5($key).$this->salt),0,$this->ks); //初始解密处理 mcrypt_generic_init($this->td, $this->key_2, $this->iv); //解密 $decrypted = mdecrypt_generic($this->td, $secret); //解密后,可能会有后续的\0,需去掉 $decrypted=trim($decrypted) . "\n"; //结束 mcrypt_generic_deinit($this->td); mcrypt_module_close($this->td); return $decrypted; } }catch (Exception $e){ echo $e->getMessage(); } } /** * 将密文保存到文件中 */ public function savetofile(){ try { $fp=fopen($this->filepath,'w+'); if (!$fp){ throw new Exception("文件操作失败"); } fwrite($fp,$this->encode); fclose($fp); }catch (Exception $e){ echo $e->getMessage(); } } /** * 取得服务器的MAC地址 */ public function getmac($os_type){ switch ( strtolower($os_type) ){ case "linux": $this->forLinux(); break; case "solaris": break; case "unix": break; case "aix": break; default: $this->forWindows(); break; } $temp_array = array(); foreach( $this->return_array as $value ){ if (preg_match("/[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f]/i",$value,$temp_array )){ $mac_addr = $temp_array[0]; break; } } unset($temp_array); return $mac_addr; } /** * windows服务器下执行ipconfig命令 */ public function forWindows(){ @exec("ipconfig /all", $this->return_array); if ( $this->return_array ) return $this->return_array; else{ $ipconfig = $_SERVER["WINDIR"]."\system32\ipconfig.exe"; if ( is_file($ipconfig) ) @exec($ipconfig." /all", $this->return_array); else @exec($_SERVER["WINDIR"]."\system\ipconfig.exe /all", $this->return_array); return $this->return_array; } } /** * Linux服务器下执行ifconfig命令 */ public function forLinux(){ @exec("ifconfig -a", $this->return_array); return $this->return_array; } } $code=new authCode(); //加密 $code->encode("~!@#$%^"); //解密 echo $code->decode("~!@#$%^"); ?>
ログイン後にコピー

更多通过PHP的内置函数,通过DES算法对数据加密和解密相关文章请关注PHP中文网!


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート