php RAS暗号化クラスコード

WBOY
WBOYオリジナル
2016-07-25 08:43:161116ブラウズ
openssl を通じて実装される署名、署名検証、非対称暗号化と復号化は、x.509 証明書 (crt や pem など) ファイルとともに使用する必要があります。
  1. /**
  2. * RSA アルゴリズム クラス
  3. * 署名および暗号文エンコード:base64 文字列/16 進数文字列/バイナリ文字列ストリーム
  4. * パディング方法: PKCS1Padding (暗号化および復号化)/NOPadding (復号化)
  5. *
  6. * 注: 単一ブロックのみを受け入れます。サイズは RSA キーのサイズと同じです
  7. * キーの長さが 1024 ビットの場合、暗号化中のデータは 128 バイト未満でなければならず、PKCS1Padding 自体の情報の 11 バイトを加えたので、平文は 117 バイト未満でなければなりません
  8. *
  9. * @作者: linvo
  10. * @バージョン: 1.0.0
  11. * @日付: 2013/1/23
  12. */
  13. class RSA{
  14. private $pubKey = null;
  15. プライベート $priKey = null;
  16. /**
  17. * カスタムエラー処理
  18. */
  19. プライベート関数 _error($msg){
  20. die('RSA エラー:' . $msg); //TODO
  21. }
  22. /**
  23. * コンストラクター
  24. *
  25. * @param 文字列公開キー ファイル (署名の検証と暗号化中に渡される)
  26. * @param 文字列秘密キー ファイル (署名と復号化中に渡される)
  27. */
  28. public function __construct($public_key_file = '', $private_key_file = ''){
  29. if ($public_key_file){
  30. $this->_getPublicKey($public_key_file) );
  31. }
  32. if ($private_key_file){
  33. $this->_getPrivateKey($private_key_file);
  34. }
  35. }
  36. /**
  37. * 署名を生成
  38. *
  39. * @param 文字列署名素材
  40. * @param 文字列署名エンコーディング (base64/hex/bin)
  41. * @return 署名値
  42. */
  43. public function signed($data, $code = 'base64'){
  44. $ret = false;
  45. if (openssl_sign($data, $ret, $this->priKey)){
  46. $ret = $this->_encode($ret, $code);
  47. }
  48. $ret を返す;
  49. }
  50. /**
  51. * 署名の検証
  52. *
  53. * @param 文字列署名素材
  54. * @param 文字列署名値
  55. * @param 文字列署名エンコーディング (base64/hex/bin)
  56. * @return bool
  57. */
  58. public function verify($data, $sign, $code = 'base64'){
  59. $ret = false;
  60. $sign = $this->_decode($sign, $code);
  61. if ($sign !== false) {
  62. switch (openssl_verify($data, $sign, $this->pubKey)){
  63. case 1: $ret = true;壊す;
  64. ケース 0:
  65. ケース -1:
  66. デフォルト: $ret = false;
  67. }
  68. }
  69. $ret を返します。
  70. }
  71. /**
  72. * 暗号化
  73. *
  74. * @param string plaintext
  75. * @param string ciphertext エンコーディング (base64/hex/bin)
  76. * @param int パディングメソッド (PHP にバグがあるようで、現在 OPENSSL_PKCS1_PADDING のみサポートしています)
  77. * @return string 秘密のテキスト
  78. */
  79. public function encrypt($data, $code = 'base64', $padding = OPENSSL_PKCS1_PADDING){
  80. $ret = false;
  81. if (!$this->_checkPadding($padding, 'en')) $this->_error('パディングエラー');
  82. if (openssl_public_encrypt($data, $result, $this->pubKey, $padding)){
  83. $ret = $this->_encode($result, $code);
  84. }
  85. $ret を返す;
  86. }
  87. /**
  88. * 復号化
  89. *
  90. * @param string ciphertext
  91. * @param string ciphertext エンコーディング (base64/hex/bin)
  92. * @param int パディングメソッド (OPENSSL_PKCS1_PADDING / OPENSSL_NO_PADDING)
  93. * @param bool 平文を反転するかどうか (渡すとき) Microsoft CryptoAPI で生成された RSA 暗号文、ブロック内のバイトを元に戻します)
  94. * @return string plaintext
  95. */
  96. public function decrypt($data, $code = 'base64', $padding = OPENSSL_PKCS1_PADDING, $rev = false){
  97. $ret = false;
  98. $data = $this->_decode($data, $code);
  99. if (!$this->_checkPadding($padding, 'de')) $this->_error('padding error');
  100. if ($data !== false){
  101. if (openssl_private_decrypt($data, $result, $this->priKey, $padding)){
  102. $ret = $rev ? rtrim(strrev($result), " ") : ''.$result;
  103. }
  104. }
  105. $ret を返します。
  106. }
  107. // 私有メソッド
  108. /**
  109. * パディングタイプを検出します
  110. * 暗号化は PKCS1_PADDING のみをサポートします
  111. * 復号化は PKCS1_PADDING と NO_PADDING をサポートします
  112. *
  113. * @param int パディングモード
  114. * @param 文字列暗号化/復号化
  115. * @return bool
  116. */
  117. private function _checkPadding($padding, $type){
  118. if ($type == 'en'){
  119. switch ($padding){
  120. OPENSSL_PKCS1_PADDING の場合:
  121. $ret = true;
  122. 休憩;
  123. デフォルト:
  124. $ret = false;
  125. }
  126. }else {
  127. switch ($padding){
  128. case OPENSSL_PKCS1_PADDING:
  129. case OPENSSL_NO_PADDING:
  130. $ret = true;
  131. 休憩;
  132. デフォルト:
  133. $ret = false;
  134. }
  135. }
  136. $ret を返します。
  137. }
  138. プライベート関数 _encode($data, $code){
  139. switch (strto lower($code)){
  140. case 'base64':
  141. $data = Base64_encode(''.$data);
  142. 休憩;
  143. ケース 'hex':
  144. $data = bin2hex($data);
  145. 休憩;
  146. case 'bin':
  147. デフォルト:
  148. }
  149. return $data;
  150. }
  151. プライベート関数 _decode($data, $code){
  152. switch (strto lower($code)){
  153. case 'base64':
  154. $data = Base64_decode($data);
  155. 休憩;
  156. case 'hex':
  157. $data = $this->_hex2bin($data);
  158. 休憩;
  159. case 'bin':
  160. デフォルト:
  161. }
  162. return $data;
  163. }
  164. プライベート関数 _getPublicKey($file){
  165. $key_content = $this->_readFile($file);
  166. if ($key_content){
  167. $this->pubKey = openssl_get_publickey($key_content);
  168. }
  169. }
  170. プライベート関数 _getPrivateKey($file){
  171. $key_content = $this->_readFile($file);
  172. if ($key_content){
  173. $this->priKey = openssl_get_privatekey($key_content);
  174. }
  175. }
  176. プライベート関数 _readFile($file){
  177. $ret = false;
  178. if (!file_exists($file)){
  179. $this->_error("ファイル {$file} は存在しません");
  180. } else {
  181. $ret = file_get_contents($file);
  182. }
  183. $ret を返す;
  184. }
  185. プライベート関数 _hex2bin($hex = false){
  186. $ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ?パック("H*", $hex) : false;
  187. $ret を返す;
  188. }
  189. }
复制帽

の例
  1. header('Content-Type:text/html;Charset=utf-8;');
  2. 「rsa.php」を含める;
  3. echo '
    '; 
  4. $a = isset($_GET['a']) ? $_GET['a'] : '测试123';
  5. ///////////////////////////////////
  6. $pubfile = 'E:sslcertpwd.crt' ;
  7. $prifile = 'E:sslcertpwd.pem';
  8. $m = 新しい RSA($pubfile, $prifile);
  9. $x = $m->sign($a);
  10. $y = $m->verify($a, $x);
  11. var_dump($x, $y);
  12. $x = $m->encrypt($a);
  13. $y = $m->復号化($x);
  14. var_dump($x, $y);
复制代

php、RAS


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