PHPのRSA暗号解読方法及び開発インターフェースの使用

7978 ワード

ネットの安全問題はとても重要で、特にデータの安全を保証します.インタフェースを書いているプログラマーに直接会ったのは明文データの転送です.私から見れば、これはとても専門的ではないと思います.本人はインターフェースを通るデータは暗号解読して使うことを提唱しています.
この記事は主にPHP開発インターフェースを使って、RSA暗号解読を実現したデータを使用して、PHPカスタムRSA類の暗号化と解読を実現する技術を分析しました.とても実用的な価値があります.必要な友達は下記を参照してください.
簡単な紹介RSA
RSA暗号化アルゴリズムは最も一般的な非対称暗号化アルゴリズムであり、CFCAは証明書サービスでは欠かせない.しかし、多くの初心者があまりよく分かりません.簡単に紹介します.RSAは、暗号化のためにもデジタル署名のためにも利用できる、最初の比較的完全な公開鍵アルゴリズムである.RSAはその3つの発明者Ron Rivest、Adi Shamar、Leonard Adlemanの名前の頭文字で命名され、このアルゴリズムは長年にわたって深い暗号分析を受けました.暗号解析者はRSAの安全性を証明することも否定することもできませんが、これはまさにこのアルゴリズムの信頼性を示しています.RSAの安全は、大数分解の難しさに基づいています.公開鍵と秘密鍵は、一対の大きな素数(100から200ビットの10進数以上)の関数である.一つの公開鍵と暗号文から明文を回復するのは、二つの大きな素数の積を分解するのと同じです.
以下は具体的なクラス、実例です.

_getPublicKey($public_key_file); 
    } 
    if ($private_key_file) { 
      $this->_getPrivateKey($private_key_file); 
    } 
  } 
 
  //      
  /** 
   *         
   */ 
  private function _error($msg) 
  { 
    die('RSA Error:' . $msg); //TODO 
  } 
 
  /** 
   *        
   *      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; 
  } 
 
  /** 
   *      
   * 
   * @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; 
  } 
 
  /** 
   *      
   * 
   * @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       (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; 
  } 
} 
これは具体的なRSAクラスです.

'; 
 
$pubfile = 'D:\WWW\test\rsa_public_key.pem'; 
$prifile = 'D:\WWW\test\rsa_private_key.pem'; 
$rsa = new RSA($pubfile, $prifile); 
$rst = array( 
  'ret' => 200, 
  'code' => 1, 
  'data' => array(1, 2, 3, 4, 5, 6), 
  'msg' => "success", 
); 
$ex = json_encode($rst); 
//   
$ret_e = $rsa->encrypt($ex); 
//   
$ret_d = $rsa->decrypt($ret_e); 
echo $ret_e; 
echo '
'; 
echo $ret_d; 
echo '
';  
$a = 'test'; 
//   
$x = $rsa->sign($a); 
//   
$y = $rsa->verify($a, $x); 
var_dump($x, $y); 
exit;