node-rsa 和 PHP RSA加密解密方法

PHP RSA加密参考

<?php
/**
 * RSA算法类
 * 签名及密文编码:base64字符串/十六进制字符串/二进制字符串流
 * 填充方式: PKCS1Padding(加解密) 
 * 密钥信息  密钥位数:1024 bit  密钥格式: PKCS#8
 * Notice:Only accepts a single block. Block size is equal to the RSA key size!
 * 如密钥长度为1024 bit,则加密时数据需小于128字节,加上PKCS1Padding本身的11字节信息,所以分段操作每段明文需小于117字节
 * 创建密钥对 以去网页工具生成  http://web.chacuo.net/netrsakeypair
 */

class XRsas
{
    protected $public_key;
    protected $public_key_sign;
    protected $private_key;
    protected $private_key_sgin;
    protected $key_len;

    public function __construct( )
    {
         //以下秘钥用于rsa加密
        $this->public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAWsfxlxw429+9ZpvVrhpHRuQF
3FQKVg4ruECx49fT2vYzPnrfvPQ1G/yvJBKAmsGVoA8xEOLqZs3Mvl4rDi0QQOM4
DEWcB5AIzV2/hkuF8ooihyiMJqr7Kq1zPbGgxVR9G6mq+PzGL9OkzS4CfA/2UTZx
6ibgRLZ7WXY/YFTZJwIDAQAB
-----END PUBLIC KEY-----';
        $this->private_key = '-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMBax/GXHDjb371m
m9WuGkdG5AXcVApWDiu4QLHj19Pa9jM+et+89DUb/K8kEoCawZWgDzEQ4upmzcy+
XisOLRBA4zgMRZwHkAjNXb+GS4XyiiKHKIwmqvsqrXM9saDFVH0bqar4/MYv06TN
LgJ8D/ZRNnHqJuBEtntZdj9gVNknAgMBAAECgYEAmV/JTblPp4aqQDswxpCsI2lD
J+kmmZdEdVfVPgKOdT6CURngn8Xqcu597Ki2mBTNhqC5fEYaqQyPzFF+hJYpFwmY
y22A53tXPD2Z+SeIOM6AwjKEjpKnIaY6ko9YmHsrfACWnvyIE4697/K0hRmGU6lR
PPVz2FOYgItbTq167QECQQDwtUEnqiSVOKhr1BgJVQTsERuRM5Ca0p2qn5Bamhdo
nBhncHoI89ZJw+tua8JAYUdBk8wIIUTxINjP4muys3R7AkEAzJMh+RVUCSg7IA6j
P4DtZYFBBtrMFsp4Zgyq326A9OvbKRSChO281nSwMjcVDbGZCX9YQCgHJUGCYZ9M
0NscRQJBAKrCKsKUtPcXBoPYJmUYZzGAwWm0hvUOTMNqBuH/RnPzqGxZInmPYYla
732Z/GfnmsEutCNgVqQohSaUnYpcPFkCQQCamjb6ftvbb8P/HhDRVSYTp/L0szW5
o5oJxVj9Mg3TCsu95/oba29iwxzFVkta5fS58LtJAPcleLSIAlOTI4PhAkBzyuwh
YBBVyIauF6MIk6b4bJc1SKuGa+25As6vTp9QQfupMuWlPmPr9nduGNAZeohfNWPl
NByIAYSFAyYyv8iq
-----END PRIVATE KEY-----';

        
        //以下秘钥用于签名
        $this->public_key_sign = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsM3EAkOkufMjk/P4aDo+5RJAq
g2VhR1+nvDI8J8wH0NfeNauVOJxypD6wpvXcQ8gRNQ0dnPY1A4JYfGlQGFNDvbsy
aZxC6U6+76hwbgFrWg5Wkmr0LEmjRe6JkjjcCL8zrgZNgxW/EAEXodUjiTx/YEnr
0ZmcB3gSjTC7OSlnfQIDAQAB
-----END PUBLIC KEY-----';
        
                $this->private_key_sign = '-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAKwzcQCQ6S58yOT8
/hoOj7lEkCqDZWFHX6e8MjwnzAfQ1941q5U4nHKkPrCm9dxDyBE1DR2c9jUDglh8
aVAYU0O9uzJpnELpTr7vqHBuAWtaDlaSavQsSaNF7omSONwIvzOuBk2DFb8QAReh
1SOJPH9gSevRmZwHeBKNMLs5KWd9AgMBAAECgYBXJx3tLGpoFc3TX1v3siD5ooLY
kXHw/x+hlDVUjsvLtN5cX4t81Y8Q0qHL5GSQ21lZpCEEONm/UQxaXnUqjXUuAar9
mVMOJo94HzJro5K/3LgYaAP4KlCYBWIKMgqxrexDHFHpgWcHmnBEtm9s2I+e9pCN
Td7+VVlM+sDcrr6d3QJBAOJQnDmMi7FKE7Vagon3lQYrefMOgqVfwwTZJVU20kH0
6dI6Lvnc3peuke7nKG2ySb9Dk9gu8gqypbvXTEGnsocCQQDCyb+H6TD1ZiKFQA2w
brtfZOUA4iw3ezRL15DFVS3efCyCk5X+WtoFljlM3XRR1S+xQHodnKzm9ICtB4ir
xGLbAkEAjhAR8SIjclfQxU+aj+alWmkiNQvPwOW68qkogTRXieWmfTvezyPxan+/
xZq/SxTWrERMYzEc6NA5rw84JCKTswJBAIFlpGaU8oESqDv8oRtjc/WbAMXleZoh
rkvzl6h/PUlfE/JqOGoP0GWFterp8iuqg1QskPK68eE664AGUTRJ8aECQQCoxNN3
sxNGgdY+fE49aI8BgtNy293Oy9HIYZhnQx+ElhKTvpfhnjk2Vmp3aTNu7x3uKCQs
lvoIcdNOZXVzhFU+
-----END PRIVATE KEY-----';

        $pub_id = openssl_get_publickey($this->public_key);
        $this->key_len = openssl_pkey_get_details($pub_id)['bits'];
    }

    /*
     * 公钥加密
     */
    public function publicEncrypt($data)
    {
        $encrypted = '';
        $part_len = $this->key_len / 8 - 11;
        $parts = str_split($data, $part_len);
        foreach ($parts as $part) {
            $encrypted_temp = '';
            openssl_public_encrypt($part, $encrypted_temp,$this->public_key,OPENSSL_PKCS1_PADDING);
            $encrypted .=  $encrypted_temp;
        }
        return base64_encode($encrypted);
    }

    /*
     * 私钥解密
     */
    public function privateDecrypt($encrypted)
    {
        $decrypted = "";
        $part_len = $this->key_len / 8;
        $base64_decoded = base64_decode($encrypted);
        $parts = str_split($base64_decoded, $part_len);
        foreach ($parts as $part) {
            $decrypted_temp = '';
            openssl_private_decrypt($part, $decrypted_temp,$this->private_key,OPENSSL_PKCS1_PADDING);
            $decrypted .= $decrypted_temp;
        }
        return $decrypted;
    }

    /*
     * 私钥加密
     */
    public function privateEncrypt($data)
    {
        $encrypted = '';
        $part_len = $this->key_len / 8 - 11;
        $parts = str_split($data, $part_len);

        foreach ($parts as $part) {

            $encrypted_temp = '';
            openssl_private_encrypt($part, $encrypted_temp, $this->private_key,OPENSSL_PKCS1_PADDING);
            $encrypted .= $encrypted_temp;
        }

        return base64_encode($encrypted);
    }

    /*
     * 公钥解密
     */
    public function publicDecrypt($encrypted)
    {
        $decrypted = "";
        $part_len = $this->key_len / 8;
        $base64_decoded = base64_decode($encrypted);
        $parts = str_split($base64_decoded, $part_len);

        foreach ($parts as $part) {
            $decrypted_temp = '';
            openssl_public_decrypt($part, $decrypted_temp,$this->public_key,OPENSSL_PKCS1_PADDING);
            $decrypted .= $decrypted_temp;
        }
        return $decrypted;
    }

    /*
     * 数据加签
     */
    public function sign($data)
    {
        openssl_sign($data, $sign, $this->private_key_sign, OPENSSL_ALGO_SHA256);

        return base64_encode($sign);
    }

    /*
     * 数据签名验证
     */
    public function verify($data, $sign)
    {
         $result = FALSE;
        $pub_id = openssl_get_publickey($this->public_key_sign);
        $result = openssl_verify($data, base64_decode($sign),$pub_id , OPENSSL_ALGO_SHA256);
        return $result;
    }
}

node-rsa 加密解密参考

  const NodeRSA = require('node-rsa');
  var key = new NodeRSA();
  key.setOptions({ encryptionScheme: 'pkcs1' });//指定加密格式
   // 私钥 加密
  var encryData = key.encryptPrivate('要加密的数据',  'base64', 'utf8');
  // 公钥 解密
  var decryptData = key.decryptPublic(encryData, 'utf8');


  // 1.创建RSA对象
  var publicKey = new NodeRSA();
  // 2. 公钥 加密
  publicKey.importKey(publicPem,  'pkcs8-public-pem');
  // 3. 公钥 解密 
  var decrypted = publicKey.decryptPublic(encryData, 'utf8');  


  //  使用私钥签名 
  privateKey.importKey('私钥', 'pkcs8-private-pem');
  var signedData = privateKey.sign(Buffer.from('要签名的数据'),  'base64' ).toString('base64');
  // 公钥钥验证签名 
  var result = publicKey.verify(Buffer.from('要验证的签名数据'), signedData, 'Buffer', 'base64');

 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值