前言:RSA加密算法是一种非对称加密(不能根据加密算法推算出解密算法)算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。主要运用了大质数难以分解的特点。

1.使用方法

<?php
$rsa = new RSA('public key abs path','private key abs path');
$encoded = $rsa->encode('hello');

 

2.源码

<?php
class RSA{
	public $path_pubkey_der = '';
	public $path_prvkey_der='';

	protected $sPublicKey;
	protected $publickey;
	
	protected $sPrivateKey;
	protected $privatekey;
	
        /**
         * 构造函数
         * @param type $path_pubkey_der 公钥路径
         * @param type $path_prvkey_der 私钥路径
         */
	public function __construct($path_pubkey_der = '', $path_prvkey_der = '') {
		$this->path_pubkey_der = $path_pubkey_der;
		$this->path_prvkey_der = $path_prvkey_der;
	}

	/**
	 * 转换密钥文件格式
	 *
	 * @param unknown_type $der_data der密钥内容
	 * @return unknown $pem pem密钥内容
	 */
	protected function der2pem($der_data,$type='PUBLIC') {
		$pem = chunk_split(base64_encode($der_data), 64, "\n");
		$pem = "-----BEGIN {$type} KEY-----\n".$pem."-----END {$type} KEY-----\n";
		return $pem;
	}

        /**
         * 加载密钥
         */
	protected function loadKey(){
		if ( empty( $this->sPublicKey ) ){

			if ( is_file( $this->path_pubkey_der ) ){
				$this->sPublicKey = $this->der2pem( @file_get_contents( $this->path_pubkey_der ) );
			}
		}

//		var_dump( $this->sPublicKey );

		if ( empty( $this->publickey ) && !empty( $this->sPublicKey ) ){
			$this->publickey = openssl_pkey_get_public( $this->sPublicKey );
		}
		
		
		//load private key
		if (empty($this->sPrivateKey)) {
			if (is_file($this->path_prvkey_der)) {
				$this->sPrivateKey = $this->der2pem(@file_get_contents($this->path_prvkey_der),'RSA PRIVATE');
			}
		}

		if (empty($this->privatekey) && !empty($this->sPrivateKey)) {
			$this->privatekey = openssl_pkey_get_private($this->sPrivateKey);
		}
		
	}

        /**
         * 解密
         * @param type $encoded 加密的字符串
         * @return boolean
         */
	public function decode( $encoded ){
		$decoded = false;

		if ( empty( $this->publickey ) ){
			$this->loadKey();
		}

		if ( !empty( $this->publickey ) && !empty( $encoded ) ){
			$encoded=  base64_decode($encoded);
				if(openssl_public_decrypt( $encoded, $decoded, $this->publickey )){
					return $decoded;		
				}
		}

		return $decoded;
	}
	
        /**
         * 加密
         * @param type $data 字符串,建议长度限制在117个字符以内
         * @return type
         */
	public function encode($data) {
		$encoded = false;
		
		if(empty($this->privatekey)){
			$this->loadKey();
		}

		if (!empty($this->privatekey) && !empty($data)) {
			if (openssl_private_encrypt($data, $encoded, $this->privatekey)) {
				$encoded = base64_encode($encoded);
				return $encoded;
			}
		}

		return $encoded;
	}
}

 

Post Navigation