php實(shí)現(xiàn)RSA加密類實(shí)例_PHP教程
Jul 13, 2016 am 10:00 AMphp實(shí)現(xiàn)RSA加密類實(shí)例
?這篇文章主要介紹了php實(shí)現(xiàn)RSA加密類,實(shí)例分析了php自定義RSA類實(shí)現(xiàn)加密與解密的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
?
本文實(shí)例講述了php實(shí)現(xiàn)RSA加密類。分享給大家供大家參考。具體分析如下:
通過openssl實(shí)現(xiàn)的簽名、驗(yàn)簽、非對(duì)稱加解密,需要配合x.509證書(如crt和pem)文件使用。
由于各種原因,該類并不十分完善,歡迎各種測(cè)試!
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
/** * RSA算法類 * 簽名及密文編碼:base64字符串/十六進(jìn)制字符串/二進(jìn)制字符串流 * 填充方式: PKCS1Padding(加解密)/NOPadding(解密) * * Notice:Only accepts a single block. Block size is equal to the RSA key size! * 如密鑰長(zhǎng)度為1024 bit,則加密時(shí)數(shù)據(jù)需小于128字節(jié),加上PKCS1Padding本身的11字節(jié)信息,所以明文需小于117字節(jié) * * @author: linvo * @version: 1.0.0 * @date: 2013/1/23 */ class RSA{ private $pubKey = null; private $priKey = null; /** * 自定義錯(cuò)誤處理 */ private function _error($msg){ die('RSA Error:' . $msg); //TODO } /** * 構(gòu)造函數(shù) * * @param string 公鑰文件(驗(yàn)簽和加密時(shí)傳入) * @param string 私鑰文件(簽名和解密時(shí)傳入) */ public function __construct($public_key_file = '', $private_key_file = ''){ if ($public_key_file){ $this->_getPublicKey($public_key_file); } if ($private_key_file){ $this->_getPrivateKey($private_key_file); } } /** * 生成簽名 * * @param string 簽名材料 * @param string 簽名編碼(base64/hex/bin) * @return 簽名值 */ public function sign($data, $code = 'base64'){ $ret = false; if (openssl_sign($data, $ret, $this->priKey)){ $ret = $this->_encode($ret, $code); } return $ret; } /** * 驗(yàn)證簽名 * * @param string 簽名材料 * @param string 簽名值 * @param string 簽名編碼(base64/hex/bin) * @return bool */ public function verify($data, $sign, $code = 'base64'){ $ret = false; $sign = $this->_decode($sign, $code); if ($sign !== false) { switch (openssl_verify($data, $sign, $this->pubKey)){ case 1: $ret = true; break; case 0: case -1: default: $ret = false; } } return $ret; } /** * 加密 * * @param string 明文 * @param string 密文編碼(base64/hex/bin) * @param int 填充方式(貌似php有bug,所以目前僅支持OPENSSL_PKCS1_PADDING) * @return string 密文 */ public function encrypt($data, $code = 'base64', $padding = OPENSSL_PKCS1_PADDING){ $ret = false; if (!$this->_checkPadding($padding, 'en')) $this->_error('padding error'); if (openssl_public_encrypt($data, $result, $this->pubKey, $padding)){ $ret = $this->_encode($result, $code); } return $ret; } /** * 解密 * * @param string 密文 * @param string 密文編碼(base64/hex/bin) * @param int 填充方式(OPENSSL_PKCS1_PADDING / OPENSSL_NO_PADDING) * @param bool 是否翻轉(zhuǎn)明文(When passing Microsoft CryptoAPI-generated RSA cyphertext, revert the bytes in the block) * @return string 明文 */ public function decrypt($data, $code = 'base64', $padding = OPENSSL_PKCS1_PADDING, $rev = false){ $ret = false; $data = $this->_decode($data, $code); if (!$this->_checkPadding($padding, 'de')) $this->_error('padding error'); if ($data !== false){ if (openssl_private_decrypt($data, $result, $this->priKey, $padding)){ $ret = $rev ? rtrim(strrev($result), "\0") : ''.$result; } } return $ret; } // 私有方法 /** * 檢測(cè)填充類型 * 加密只支持PKCS1_PADDING * 解密支持PKCS1_PADDING和NO_PADDING * * @param int 填充模式 * @param string 加密en/解密de * @return bool */ private function _checkPadding($padding, $type){ if ($type == 'en'){ switch ($padding){ case OPENSSL_PKCS1_PADDING: $ret = true; break; default: $ret = false; } } else { switch ($padding){ case OPENSSL_PKCS1_PADDING: case OPENSSL_NO_PADDING: $ret = true; break; default: $ret = false; } } return $ret; } private function _encode($data, $code){ switch (strtolower($code)){ case 'base64': $data = base64_encode(''.$data); break; case 'hex': $data = bin2hex($data); break; case 'bin': default: } return $data; } private function _decode($data, $code){ switch (strtolower($code)){ case 'base64': $data = base64_decode($data); break; case 'hex': $data = $this->_hex2bin($data); break; case 'bin': default: } return $data; } private function _getPublicKey($file){ $key_content = $this->_readFile($file); if ($key_content){ $this->pubKey = openssl_get_publickey($key_content); } } private function _getPrivateKey($file){ $key_content = $this->_readFile($file); if ($key_content){ $this->priKey = openssl_get_privatekey($key_content); } } private function _readFile($file){ $ret = false; if (!file_exists($file)){ $this->_error("The file {$file} is not exists"); } else { $ret = file_get_contents($file); } return $ret; } private function _hex2bin($hex = false){ $ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ? pack("H*", $hex) : false; return $ret; } } |
測(cè)試demo:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
header('Content-Type:text/html;Charset=utf-8;'); include "rsa.php"; echo ' '; <p>$a = isset($_GET['a']) ? $_GET['a'] : '測(cè)試123';</p> <p>//////////////////////////////////////</p> <p>$pubfile = 'E:\ssl\cert\pwd.crt';</p> <p>$prifile = 'E:\ssl\cert\pwd.pem';</p> <p>$m = new RSA($pubfile, $prifile);</p> <p>$x = $m->sign($a);</p> <p>$y = $m->verify($a, $x);</p> <p>var_dump($x, $y);</p> <p>$x = $m->encrypt($a);</p> <p>$y = $m->decrypt($x);</p> <p>var_dump($x, $y);</p> |
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

TostayCurrentwithPhpDevelopments andBestPractices, suiventyewnewsources likephp.netandphpweekly, engagewithcommunitiesonforumums et conférences, keeptoolingupdated etgradualadoptnewfeatures, etreadorontruttetoopensourceprojects.

PhpBecamepopularforwebDevelopmentDuetoitSeaseOflearning, Samoussentegration withhtml, widespreadhostingsupport, andalargecosystemysteclustingframeworkslikeLaravelandcmsplateformeslikewordpress.itexcelSinlingFormSubMissions, ManagetingSeSeSessions, interactif, interactif

Tosetherighttimezoneinphp, usedate_default_timezone_set () Fonctionnellestartofyourscriptwithavalididentifiersuchas'america / new_york'.1.usedate_default_timezone_set () beforeanydate / timefunctions.20

ThePhpFunctionSerialize () andUnserialize () sont utilisés pour le stobercomplexdatasterDestoRoSintOsTorasandAbackAgain.1.Serialize () C onvertsDatalikECarraysorObjectSraystringContainingTypeandStructureInformation.2

Vous pouvez intégrer le code PHP dans des fichiers HTML, mais assurez-vous que le fichier a une extension de .php afin que le serveur puisse l'analyser correctement. Utilisez des balises standard pour envelopper le code PHP, insérez le contenu dynamique n'importe où dans HTML. De plus, vous pouvez changer plusieurs fois PHP et HTML dans le même fichier pour réaliser des fonctions dynamiques telles que le rendu conditionnel. Assurez-vous de prêter attention à la configuration du serveur et à l'exactitude de la syntaxe pour éviter les problèmes causés par de courtes étiquettes, des erreurs de devis ou des étiquettes de fin omises.

La clé pour écrire le code PHP propre et facile à maintenir réside dans une dénomination claire, des normes suivantes, une structure raisonnable, une bonne utilisation des commentaires et une testabilité. 1. Utilisez des variables claires, des fonctions et des noms de classe, tels que $ userdata et calculatotalprice (); 2. Suivez le style de code unifié standard PSR-12; 3. Divisez la structure du code en fonction des responsabilités et organisez-la à l'aide de catalogues MVC ou de style Laravel; 4. évitez le code de style nouilles et divisez la logique en petites fonctions avec une seule responsabilité; 5. Ajouter des commentaires aux points clés et écrire des documents d'interface pour clarifier les paramètres, les valeurs de retour et les exceptions; 6. Améliorer la testabilité, adopter l'injection de dépendance, réduire l'état mondial et les méthodes statiques. Ces pratiques améliorent la qualité du code, l'efficacité de la collaboration et la facilité de post-maintenance.

Oui, YouCanrunsqlQueriesUsingPhp, et theprocessInvolvesChoosingAdatabaseextenten, ConnectTotheDatabase, ExecutingQueessaFely, andcosingConnectionSwhendOne.Todothis, FirstChooseBetweenmysqliorpDo, avec unplaying

Binance est la principale plate-forme de trading de crypto-monnaie au monde avec une excellente sécurité, des variétés de trading riches et une expérience utilisateur fluide. Il adopte une architecture de sécurité multicouches pour garantir la sécurité des actifs, fournit une variété de types de transactions tels que le point, l'effet de levier, les contrats, etc., et a une liquidité élevée pour garantir des transactions efficaces. Les étapes de connexion comprennent: 1. Visitez le site officiel et consultez l'URL; 2. Cliquez sur le bouton "Connexion" dans le coin supérieur droit; 3. Entrez le numéro d'e-mail / téléphone mobile et le mot de passe; 4. Vérification complète de la sécurité telle que la vérification à deux facteurs, le SMS ou le code de vérification par e-mail; 5. Cliquez pour vous connecter pour terminer l'opération. La plate-forme fournit également Binance Earn, NFT Market, Academy et d'autres fonctionnalités spéciales, et rappelle aux utilisateurs de se méfier des sites Web de phishing, de permettre le 2FA, de comprendre les risques de transaction, de méfier de la fraude et de s'assurer que
