php rsa加密解密使用实例


RSA,简单地说,是生成一组数字n、e和d。用n和e加密明文(明文要求小于n),用n和d解密密文。
  寻找一组n、e、d很容易,但当n足够大时,由n和e求出d很难。这是RSA的安全性所在。

php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密。
首先确保php开启openssl,大多数情况下openssl是没有开启的,这个网上有很多教程,就不赘述了。

1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)

openssl genrsa -out rsa_private_key.pem 1024
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem
从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端.

2、php中用生成的公钥、私钥进行加密解密,直接上代码

<?
class rsa{

    
    /**
    *返回对应的私钥
    */
    public static function getPrivateKey(){
    
        $privKey = @file_get_contents('/location/rsa/rsa_private_key.pem');
        return openssl_pkey_get_private($privKey);      
    }


    /**
    *返回对应的公钥
    */
    public static function getPublicKey(){
    
        $pubkey = @file_get_contents('/location/rsa/rsa_public_key.pem');
        return openssl_pkey_get_public($pubkey);      
    }


    /**
     * 私钥加密
     * @param  [type] $data [description]
     * @return [type]       [description]
     */
    public static function privEncrypt($data){

        if(!is_string($data)){
                return null;
        }           
        return openssl_private_encrypt($data,$encrypted,self::getPrivateKey())? base64_encode($encrypted) : null;
    }
    

    /**
     * 公钥解密
     * @param  [type] $data [description]
     * @return [type]       [description]
     */
    public static function pubDecrypt($data) {

        if(!is_string($data)){
                return null;
        }
        if (openssl_public_decrypt(base64_decode($data), $decrypted, self::getPublicKey()))  
            $data = $decrypted; 
        else  
            throw new Exception('Unable to decrypt data. Perhaps it is bigger than the key size?');  
  
        return $data;  
    }
    

    /**
     * 公钥加密
     * @param  [type] $data [description]
     * @return [type]       [description]
     */
    public static function pubEncrypt($data) {

        if(!is_string($data)){
            return null;
        }
        if (openssl_public_encrypt($data, $encrypted, self::getPublicKey()))
            $data = base64_encode($encrypted);
        else 
            throw new Exception('Unable to encrypt data. Perhaps it is bigger than the key size?');  

        return $data;
    }


    /**
     * 私钥解密
     * @param  [type]  $encrypted 密文(二进制格式且base64编码)
     * @param  boolean $fromjs    密文是否来源于JS的RSA加密
     * @return [type]             [description]
     */
    public static function privDecrypt($encrypted, $fromjs = FALSE){

        if(!is_string($encrypted)){
                return null;
        }
        $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;  
        if (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey(), $padding))  
        {  
            return $fromjs ? trim(strrev($decrypted)) :$decrypted;
        }  
        return null; 
    }  

}
?>

大家可以在本地环境中,尝试玩玩rsa,总体还是比较简单的。

, , , ,

发表评论

3 + 1 = ?