Heim > Artikel > Backend-Entwicklung > Verschlüsseln und entschlüsseln Sie Daten mithilfe des DES-Algorithmus und der integrierten PHP-Funktionen
Aufgrund der Anforderungen des Projekts ist es notwendig, eine Klasse zu schreiben, die einen „Autorisierungscode“ generieren kann (der Autorisierungscode enthält hauptsächlich die Ablaufzeit des Projekts. Der generierte Autorisierungscode wird in eine Datei geschrieben). Sobald das Projekt ausgeführt wird, wird der Chiffretext in der Datei automatisch gelesen und dann wird ein eindeutiger „Schlüssel“ verwendet, um eine Funktion zum Entschlüsseln des Chiffriertexts und zur Interpretation der Ablaufzeit des Projekts aufzurufen.
Vorher habe ich versucht, es selbst zu schreiben, hauptsächlich Base64+MD5+Reverse-String. Der Algorithmus ist zu einfach und kann leicht geknackt werden. Er erkennt nicht die Bedeutung des „Schlüssels“ bei der Ver- und Entschlüsselung und wird daher aufgegeben.
Später habe ich nach relevanten Informationen gesucht und festgestellt, dass in PHP eine leistungsstarke Funktionsbibliothek integriert ist, nämlich Mcrypt.
Tatsächlich bietet mcrypt selbst leistungsstarke Verschlüsselungs- und Entschlüsselungsmethoden und unterstützt viele gängige öffentliche Verschlüsselungsalgorithmen wie DES, TripleDES, Blowfish (Standard), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 und GOST in CBC, OFB, CFB und ECB.
Hier ist ein einfaches Zitat aus der Erklärung der Baidu Encyclopedia zum „Verschlüsselungsalgorithmus“:
Der grundlegende Prozess der Datenverschlüsselung besteht darin, Dateien oder Daten, die ursprünglich reiner Text waren, nach einem bestimmten Algorithmus zu verarbeiten, um sie in einen unlesbaren Teil zu verwandeln Code, üblicherweise „Chiffretext“ genannt, sodass der Originalinhalt erst nach Eingabe des entsprechenden Schlüssels angezeigt werden kann. Auf diese Weise wird der Zweck erreicht, die Daten vor Diebstahl und Auslesen durch illegale Personen zu schützen. Die Umkehrung dieses Prozesses ist die Entschlüsselung, der Prozess der Umwandlung der verschlüsselten Informationen in ihre Originaldaten.
Verschlüsselungstechnologie wird normalerweise in zwei Kategorien unterteilt: „symmetrisch“ und „asymmetrisch“.
Symmetrische Verschlüsselung bedeutet, dass für die Verschlüsselung und Entschlüsselung derselbe Schlüssel verwendet wird, der üblicherweise als „Sitzungsschlüssel“ bezeichnet wird. Diese Verschlüsselungstechnologie wird derzeit häufig verwendet. Beispielsweise ist der von der US-Regierung übernommene DES-Verschlüsselungsstandard eine typische „symmetrische Verschlüsselung“. „Verschlüsselungsmethode, die Länge des Sitzungsschlüssels beträgt 56 Bit.
Asymmetrische Verschlüsselung bedeutet, dass für die Verschlüsselung und Entschlüsselung unterschiedliche Schlüssel verwendet werden, die als „öffentlicher Schlüssel“ und „privater Schlüssel“ bezeichnet werden. Andernfalls kann das verschlüsselte Dokument nicht geöffnet werden. Der „öffentliche Schlüssel“ bedeutet hier, dass er der Außenwelt zugänglich gemacht werden kann, der „private Schlüssel“ jedoch nicht und nur vom Inhaber bekannt sein kann. Hier liegt seine Überlegenheit, denn wenn die symmetrische Verschlüsselungsmethode verschlüsselte Dateien im Netzwerk überträgt, ist es schwierig, der anderen Partei den Schlüssel mitzuteilen, und er kann abgehört werden, egal welche Methode verwendet wird. Die asymmetrische Verschlüsselungsmethode verfügt über zwei Schlüssel, und der „öffentliche Schlüssel“ kann öffentlich gemacht werden, sodass keine Angst davor besteht, dass andere davon erfahren. Der Empfänger muss beim Entschlüsseln nur seinen eigenen privaten Schlüssel verwenden, wodurch eine Schlüsselübertragung vermieden wird Sicherheitsprobleme.
Wie bereits erwähnt, unterstützt mcrypt eine Vielzahl internationaler öffentlicher Algorithmen. In diesem Projekt habe ich den DES-Algorithmus (Data Encryption Standard) verwendet, einen symmetrischen Algorithmus, der schnell und für die Verschlüsselung großer Datenmengen geeignet ist.
Als nächstes werde ich kurz einige Funktionen erläutern, die in der Verschlüsselungsklasse verwendet werden.
---------------- ------ ------------------------------------
resource mcrypt_module_open ( string $ algorithm , string $algorithm_directory , string $mode , string $mode_directory )
Parameter $algorithm: der zu verwendende Algorithmus. Sie können alle unterstützten Algorithmusnamen über die Funktion mcrypt_list_algorithms() anzeigen
Parameter $mode: welcher Modus Verwenden Sie auf ähnliche Weise die integrierte Funktion mcrypt_list_algorithms(), um alle unterstützten Modi anzuzeigen
----------------------------------------- -------- ------------------------------------------ -----
int mcrypt_enc_get_iv_size ( Ressource $td )
Diese Funktion gibt die Größe des Initialisierungsvektors (IV) des verwendeten Algorithmus zurück (es sieht etwas abstrakt aus) und gibt 0 zurück, wenn der IV vorhanden ist im Algorithmus ignoriert.
Der Parameter $td ist der Rückgabewert der Funktion mcrypt_module_open.
---------------- ------ ------------------------------------
string mcrypt_create_iv ( int $ size [, int $source = MCRYPT_DEV_RANDOM ] )
Diese Funktion erstellt einen Initialisierungsvektor (IV)
Parameter:
$source kann MCRYPT_RAND, MCRYPT_DEV_RANDOM,
MCRYPT_DEV_URANDOM sein
Hinweis: PHP5. 3.0 oder höher, unterstützt nur MCRYPT_RAND
Rückgabewert:
Bei Erfolg wird ein String-Anfangsvektor zurückgegeben. Bei Fehlschlag wird False zurückgegeben
---------- ------ -------------------------------------------- ------ -------------
int mcrypt_enc_get_key_size ( Ressource $td )
Diese Funktion kann die maximale Schlüssellänge (in Bytes) abrufen, die vom aktuellen Algorithmus unterstützt wird
int mcrypt_generic_init ( Ressource $td , String $key , String $iv )
Bevor Sie mcrypt_generic() oder mdecrypt_generic() aufrufen, müssen Sie zuerst diese Funktion aufrufen, um den Puffer zum Speichern verschlüsselter Daten zu initialisieren .
Parameter $key: Schlüssellänge. Denken Sie daran, dass der aktuelle Wert von $key kleiner ist als der von der Funktion mcrypt_enc_get_key_size() zurückgegebene Wert问题:$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中文网!