openssl rsa 私钥加密,公钥解密测试

参考:http://co63oc.blog.51cto.com/904636/625459

公钥加密,私钥解密时,因为加入随机数,每次得到的加密信息不固定。

私钥加密,公钥解密时,得到的加密信息固定。

 ======》生成RSA密钥文件

/*
 * rsa_test2.c
 *
 *  Created on: 2015年11月24日
 *      Author: mengfh
 */


#include <stdio.h>
#include <string.h>
#include <openssl/crypto.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#include <openssl/bn.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>

#define SetKey \
    key->n = BN_bin2bn(n, sizeof(n)-1, key->n); \
key->e = BN_bin2bn(e, sizeof(e)-1, key->e); \
key->d = BN_bin2bn(d, sizeof(d)-1, key->d); \
key->p = BN_bin2bn(p, sizeof(p)-1, key->p); \
key->q = BN_bin2bn(q, sizeof(q)-1, key->q); \
key->dmp1 = BN_bin2bn(dmp1, sizeof(dmp1)-1, key->dmp1); \
key->dmq1 = BN_bin2bn(dmq1, sizeof(dmq1)-1, key->dmq1); \
key->iqmp = BN_bin2bn(iqmp, sizeof(iqmp)-1, key->iqmp); \
return 0;

static int key5(RSA *key)
{
    //密钥中变量
    static unsigned char n[] =
        "\x9c\xb5\xd4\x87\x70\xb6\x43\x03\x49\x5e\xe8\x40\xbc\xbf\x15\x79\x9e\xb2\x18\x0d\xfa\xde\xf7\xb2\x37\xd0\x22\xdb\xd4\xef\x2d\x79\x63\xdb\x38\x2b\xed\x05\xe5\x14\x0b\x9a\x80\x5c\x75\x11\xef\x1b\x89\x5b\x40\xb7\x1c\x22\x7d\x84\x59\xbc\xcc\xb5\xca\x63\xbd\x7b\xdf\x1e\x3a\x72\x13\x86\x93\xa9\x9c\xc7\xcb\x48\x3d\x8b\x8c\xa9\x4c\xce\xd7\xca\xc0\xb0\x62\x7a\x95\x7a\xd7\xbd\x27\x82\x91\x40\x90\x35\xb1\xe4\xab\x5f\xbb\x06\x29\x01\xf4\x91\xe5\x15\x5f\xd3\xc2\x13\x38\xaf\x1f\x75\x88\x47\xd1\x04\xd2\xb3\x71\xa0\x9e\xc7";

    static unsigned char e[] = "\x00\x01\x00\x01";

    static unsigned char d[] =
        "\x09\x33\x83\xef\x0f\xe7\x23\xb8\x25\xae\xb4\xe4\x58\x30\xc0\x0a\x0c\x0f\x58\xea\x39\x38\xae\x42\x80\x94\x6f\xf7\x88\x61\x22\xc2\x65\xe2\x91\x41\xc3\x00\xfd\x9a\x57\xb4\x12\xa5\x5b\x1a\x5a\x77\xbb\x70\xe8\x33\xd8\x2b\x0e\x43\x9f\x21\x3e\xc3\xcd\xc6\x5d\x71\xb8\xec\x6e\xea\x5f\x17\xa5\xe1\x43\xeb\xdd\x71\xa4\x6f\xed\x09\xf0\x8b\xbe\xd9\x26\xb5\x70\x9b\xab\x42\x70\x70\x71\xd4\x14\x8f\xa8\x2c\xc4\x23\x21\x70\x1f\xd7\xef\xfd\x6b\x02\x40\x8b\xf4\x77\x5c\x78\x08\x80\x8b\x7d\x7e\x7a\xb2\x14\xe0\xf6\x94\xf2\x56\x81";

    static unsigned char p[] =
        "\xd6\x8c\xf3\x60\x76\x5b\x6e\x55\xde\x5a\xf7\x43\x95\x6b\x5e\xc0\xd9\x5a\xcd\xd8\x03\xd3\x65\xcb\x1d\xf6\xfe\x57\x39\x6c\xfd\x72\x06\x8b\xe8\x2e\x05\xfd\xe4\x7c\x39\x94\xa2\xea\xb8\x4c\xf5\xd6\xdc\xd7\x9a\xb8\xef\x05\xd9\xef\x96\xfa\x91\xa3\xb6\x9a\xd4\x19";

    static unsigned char q[] =
        "\xba\xfc\x43\xf4\x79\x60\x09\x97\x37\x6e\x55\x83\xbb\xb6\xb3\x5f\x4c\x39\x00\x93\x19\x90\x64\x65\x3a\xf7\xa0\xca\x5e\x9d\x66\xd9\xee\x7d\xdb\xd0\xe2\xe7\x57\x55\x41\x90\xc7\x4b\xed\x91\x42\xea\x34\x93\x1a\x76\xb8\xd0\xf2\x74\xed\xf5\xd3\xb9\xa6\x34\x65\xdf";

    static unsigned char dmp1[] =
        "\x4f\xfd\x89\x17\xa3\xc8\xfe\xe0\x00\xe0\xc5\x63\x6b\x27\xf6\xd1\xcb\xb7\xb1\x1b\x22\x82\x04\x67\xb0\x2a\x50\x35\x50\xf1\xb3\xa4\x79\x90\x5b\xe6\x1c\xd1\xc6\x08\x12\xa7\xb9\xfd\xec\xec\xb4\x93\x81\x0e\xd9\x5e\xad\xae\xee\xcc\x06\xec\x30\xb4\x6a\xf6\x5a\xb1";

    static unsigned char dmq1[] =
        "\x60\x9b\x5d\x70\xbe\x15\x04\x5f\x80\x60\x1d\x06\x86\xc1\x8a\x43\x3e\x5a\x65\x15\x9b\x2b\xa2\xf3\x3a\x58\x1e\x56\xf0\x33\x5a\xa4\x56\x37\xe8\x8e\x2f\xed\x5e\x8d\xc9\xe6\x47\x51\xcf\x58\x31\xbe\x57\x93\x79\x24\xc5\xb0\x0e\xd4\xa2\xed\x53\x8a\xa3\x78\x86\xf9";

    static unsigned char iqmp[] =
        "\x28\xc6\xca\x44\x40\x7a\xad\x4c\x74\x4d\xeb\x2d\xaa\xd7\xc8\x43\xef\x4a\x12\x44\x0a\x89\xb8\x12\x11\x7f\x40\x91\x9a\xe1\x4a\xfe\xe2\xe5\x3e\x6c\x7f\x07\x49\x04\xc9\x95\x8a\x4e\xa5\x7f\x3c\x8f\xea\xbd\x71\x2e\xca\x7a\x37\xdf\x99\x05\x2f\x0c\x03\x11\x6d\x5d";

    SetKey;
}

int main(int argc, char *argv[])
{
    int err = 0;
    int v;
    RSA *key;
    unsigned char ptext[256];
    unsigned char ctext[256];
    static unsigned char ptext_ex[] = "12345678";
    unsigned char ctext_ex[256];
    int plen;
    int clen = 0;
    int num;
    int n;
    int i;
    EVP_PKEY *pkey;

    printf("ptext_ex: %s\n", ptext_ex);
    {
        key = RSA_new();
        key5(key);

        plen = sizeof(ptext_ex) - 1;
        num = RSA_private_encrypt(plen, ptext_ex, ctext, key,
                RSA_PKCS1_PADDING);
        if (num != 128)   //模数长度
        {
            printf("PKCS#1 v1.5 encryption failed!\n");
            err=1;
            goto next;
        }

        //加密后的数据
        printf("encrypted text: \n");
        for (i = 0; i < num; i++)
        {
            printf("\\x%02x", ctext[i]);
        }
        printf("\n");

        printf("RSA_private_encrypt num: %d\n", num);

        num = RSA_public_decrypt(num, ctext, ptext, key,
                RSA_PKCS1_PADDING);
        if (num != plen || memcmp(ptext, ptext_ex, num) != 0)
        {
            printf("PKCS#1 v1.5 decryption failed!\n");
            err=1;
        }
        else
            printf("PKCS #1 v1.5 encryption/decryption ok\n");

        printf("RSA_public_decrypt num: %d\n", num);
        ptext[num] = '\0';    //字符串结尾
        printf("ptext: %s\n", ptext);

next:
        //公钥和私钥输出为 PEM 格式:
        PEM_write_RSAPrivateKey(stdout, key, NULL, NULL, 0, NULL, NULL);
        PEM_write_RSAPublicKey(stdout, key);

        //释放申请的内存
        RSA_free(key);
    }

    if (err) printf("ERROR: %d\n", err);
    return err;
}
./a.out 
ptext_ex: 12345678
encrypted text: 
\x75\x3a\x8f\x2b\x27\x2a\x84\x9e\x71\x80\x9b\x4e\xc6\xcc\x5b\x85\x63\x1f\x51\x13\x9f\x8c\xd9\x67\x8b\xde\x83\x32\x36\x65\x5e\x7f\xfa\x12\x15\xbb\x6a\xef\xf0\x07\x6d\x3b\x57\x02\x9d\x7f\x22\x98\x02\xb5\x2e\x55\xcc\xb3\x1e\x0f\xae\x81\xed\x57\x3e\x1a\xca\xe7\x18\x24\x71\x37\xe0\x4e\xa6\xf2\xc1\x52\x28\x9c\xf3\xc7\xd9\x87\x70\x05\x47\x92\x5b\xe2\xa4\xfe\xb0\x0c\x99\x44\x63\xd0\xf1\x5c\x8a\x2c\x69\x0f\x09\x02\x9d\xc1\xb6\x0d\xb8\xb9\x64\xa5\xcf\xb6\xa3\xb2\x49\xce\x23\x6d\x1c\x45\xf5\xf9\x8b\xc6\x9d\x2b\xbf\xd6
RSA_private_encrypt num: 128
PKCS #1 v1.5 encryption/decryption ok
RSA_public_decrypt num: 8
ptext: 12345678
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCctdSHcLZDA0le6EC8vxV5nrIYDfre97I30CLb1O8teWPbOCvt
BeUUC5qAXHUR7xuJW0C3HCJ9hFm8zLXKY7173x46chOGk6mcx8tIPYuMqUzO18rA
sGJ6lXrXvSeCkUCQNbHkq1+7BikB9JHlFV/TwhM4rx91iEfRBNKzcaCexwIDAQAB
AoGACTOD7w/nI7glrrTkWDDACgwPWOo5OK5CgJRv94hhIsJl4pFBwwD9mle0EqVb
Glp3u3DoM9grDkOfIT7DzcZdcbjsbupfF6XhQ+vdcaRv7Qnwi77ZJrVwm6tCcHBx
1BSPqCzEIyFwH9fv/WsCQIv0d1x4CICLfX56shTg9pTyVoECQQDWjPNgdltuVd5a
90OVa17A2VrN2APTZcsd9v5XOWz9cgaL6C4F/eR8OZSi6rhM9dbc15q47wXZ75b6
kaO2mtQZAkEAuvxD9HlgCZc3blWDu7azX0w5AJMZkGRlOvegyl6dZtnufdvQ4udX
VUGQx0vtkULqNJMadrjQ8nTt9dO5pjRl3wJAT/2JF6PI/uAA4MVjayf20cu3sRsi
ggRnsCpQNVDxs6R5kFvmHNHGCBKnuf3s7LSTgQ7ZXq2u7swG7DC0avZasQJAYJtd
cL4VBF+AYB0GhsGKQz5aZRWbK6LzOlgeVvAzWqRWN+iOL+1ejcnmR1HPWDG+V5N5
JMWwDtSi7VOKo3iG+QJAKMbKREB6rUx0TestqtfIQ+9KEkQKibgSEX9AkZrhSv7i
5T5sfwdJBMmVik6lfzyP6r1xLsp6N9+ZBS8MAxFtXQ==
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAJy11IdwtkMDSV7oQLy/FXmeshgN+t73sjfQItvU7y15Y9s4K+0F5RQL
moBcdRHvG4lbQLccIn2EWbzMtcpjvXvfHjpyE4aTqZzHy0g9i4ypTM7XysCwYnqV
ete9J4KRQJA1seSrX7sGKQH0keUVX9PCEzivH3WIR9EE0rNxoJ7HAgMBAAE=
-----END RSA PUBLIC KEY-----


===>从RSA密钥文件中进行加载

/*
 * rsa_test3.c
 *
 *  Created on: 2015年11月24日
 *      Author: mengfh
 *
 *      功能:从文件中读取公钥、私钥数据之后再RSA相对应的操作
 */



#include <stdio.h>
#include <string.h>
#include <openssl/crypto.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#include <openssl/bn.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>

#define SetKey \
    key->n = BN_bin2bn(n, sizeof(n)-1, key->n); \
key->e = BN_bin2bn(e, sizeof(e)-1, key->e); \
key->d = BN_bin2bn(d, sizeof(d)-1, key->d); \
key->p = BN_bin2bn(p, sizeof(p)-1, key->p); \
key->q = BN_bin2bn(q, sizeof(q)-1, key->q); \
key->dmp1 = BN_bin2bn(dmp1, sizeof(dmp1)-1, key->dmp1); \
key->dmq1 = BN_bin2bn(dmq1, sizeof(dmq1)-1, key->dmq1); \
key->iqmp = BN_bin2bn(iqmp, sizeof(iqmp)-1, key->iqmp); \
return 0;

static int key5(RSA *key)
{
    //密钥中变量
    static unsigned char n[] =
        "\x9c\xb5\xd4\x87\x70\xb6\x43\x03\x49\x5e\xe8\x40\xbc\xbf\x15\x79\x9e\xb2\x18\x0d\xfa\xde\xf7\xb2\x37\xd0\x22\xdb\xd4\xef\x2d\x79\x63\xdb\x38\x2b\xed\x05\xe5\x14\x0b\x9a\x80\x5c\x75\x11\xef\x1b\x89\x5b\x40\xb7\x1c\x22\x7d\x84\x59\xbc\xcc\xb5\xca\x63\xbd\x7b\xdf\x1e\x3a\x72\x13\x86\x93\xa9\x9c\xc7\xcb\x48\x3d\x8b\x8c\xa9\x4c\xce\xd7\xca\xc0\xb0\x62\x7a\x95\x7a\xd7\xbd\x27\x82\x91\x40\x90\x35\xb1\xe4\xab\x5f\xbb\x06\x29\x01\xf4\x91\xe5\x15\x5f\xd3\xc2\x13\x38\xaf\x1f\x75\x88\x47\xd1\x04\xd2\xb3\x71\xa0\x9e\xc7";

    static unsigned char e[] = "\x00\x01\x00\x01";

    static unsigned char d[] =
        "\x09\x33\x83\xef\x0f\xe7\x23\xb8\x25\xae\xb4\xe4\x58\x30\xc0\x0a\x0c\x0f\x58\xea\x39\x38\xae\x42\x80\x94\x6f\xf7\x88\x61\x22\xc2\x65\xe2\x91\x41\xc3\x00\xfd\x9a\x57\xb4\x12\xa5\x5b\x1a\x5a\x77\xbb\x70\xe8\x33\xd8\x2b\x0e\x43\x9f\x21\x3e\xc3\xcd\xc6\x5d\x71\xb8\xec\x6e\xea\x5f\x17\xa5\xe1\x43\xeb\xdd\x71\xa4\x6f\xed\x09\xf0\x8b\xbe\xd9\x26\xb5\x70\x9b\xab\x42\x70\x70\x71\xd4\x14\x8f\xa8\x2c\xc4\x23\x21\x70\x1f\xd7\xef\xfd\x6b\x02\x40\x8b\xf4\x77\x5c\x78\x08\x80\x8b\x7d\x7e\x7a\xb2\x14\xe0\xf6\x94\xf2\x56\x81";

    static unsigned char p[] =
        "\xd6\x8c\xf3\x60\x76\x5b\x6e\x55\xde\x5a\xf7\x43\x95\x6b\x5e\xc0\xd9\x5a\xcd\xd8\x03\xd3\x65\xcb\x1d\xf6\xfe\x57\x39\x6c\xfd\x72\x06\x8b\xe8\x2e\x05\xfd\xe4\x7c\x39\x94\xa2\xea\xb8\x4c\xf5\xd6\xdc\xd7\x9a\xb8\xef\x05\xd9\xef\x96\xfa\x91\xa3\xb6\x9a\xd4\x19";

    static unsigned char q[] =
        "\xba\xfc\x43\xf4\x79\x60\x09\x97\x37\x6e\x55\x83\xbb\xb6\xb3\x5f\x4c\x39\x00\x93\x19\x90\x64\x65\x3a\xf7\xa0\xca\x5e\x9d\x66\xd9\xee\x7d\xdb\xd0\xe2\xe7\x57\x55\x41\x90\xc7\x4b\xed\x91\x42\xea\x34\x93\x1a\x76\xb8\xd0\xf2\x74\xed\xf5\xd3\xb9\xa6\x34\x65\xdf";

    static unsigned char dmp1[] =
        "\x4f\xfd\x89\x17\xa3\xc8\xfe\xe0\x00\xe0\xc5\x63\x6b\x27\xf6\xd1\xcb\xb7\xb1\x1b\x22\x82\x04\x67\xb0\x2a\x50\x35\x50\xf1\xb3\xa4\x79\x90\x5b\xe6\x1c\xd1\xc6\x08\x12\xa7\xb9\xfd\xec\xec\xb4\x93\x81\x0e\xd9\x5e\xad\xae\xee\xcc\x06\xec\x30\xb4\x6a\xf6\x5a\xb1";

    static unsigned char dmq1[] =
        "\x60\x9b\x5d\x70\xbe\x15\x04\x5f\x80\x60\x1d\x06\x86\xc1\x8a\x43\x3e\x5a\x65\x15\x9b\x2b\xa2\xf3\x3a\x58\x1e\x56\xf0\x33\x5a\xa4\x56\x37\xe8\x8e\x2f\xed\x5e\x8d\xc9\xe6\x47\x51\xcf\x58\x31\xbe\x57\x93\x79\x24\xc5\xb0\x0e\xd4\xa2\xed\x53\x8a\xa3\x78\x86\xf9";

    static unsigned char iqmp[] =
        "\x28\xc6\xca\x44\x40\x7a\xad\x4c\x74\x4d\xeb\x2d\xaa\xd7\xc8\x43\xef\x4a\x12\x44\x0a\x89\xb8\x12\x11\x7f\x40\x91\x9a\xe1\x4a\xfe\xe2\xe5\x3e\x6c\x7f\x07\x49\x04\xc9\x95\x8a\x4e\xa5\x7f\x3c\x8f\xea\xbd\x71\x2e\xca\x7a\x37\xdf\x99\x05\x2f\x0c\x03\x11\x6d\x5d";

    SetKey;
}

int main(int argc, char *argv[])
{
    int err = 0;
    int v;
    RSA *key;
    unsigned char ptext[256];
    unsigned char ctext[256];
    static unsigned char ptext_ex[] = "12345678";
    unsigned char ctext_ex[256];
    int plen;
    int clen = 0;
    int num;
    int n;
    int i;
    FILE *fprivate, *fpbulic;
    EVP_PKEY *pkey;

    printf("ptext_ex: %s\n", ptext_ex);
    {
        key = RSA_new();
//        key5(key);

        fprivate = fopen("./private.pem","r");
        fpbulic = fopen("./public.pem", "r");
        PEM_read_RSAPrivateKey(fprivate,&key,NULL,NULL);
        PEM_read_RSAPublicKey(fpbulic, &key, NULL, NULL);

        plen = sizeof(ptext_ex) - 1;
        num = RSA_private_encrypt(plen, ptext_ex, ctext, key,
                RSA_PKCS1_PADDING);
        if (num != 128)   //模数长度
        {
            printf("PKCS#1 v1.5 encryption failed!\n");
            err=1;
            goto next;
        }

        //加密后的数据
        printf("encrypted text: \n");
        for (i = 0; i < num; i++)
        {
            printf("\\x%02x", ctext[i]);
        }
        printf("\n");

        printf("RSA_private_encrypt num: %d\n", num);

        num = RSA_public_decrypt(num, ctext, ptext, key,
                RSA_PKCS1_PADDING);
        if (num != plen || memcmp(ptext, ptext_ex, num) != 0)
        {
            printf("PKCS#1 v1.5 decryption failed!\n");
            err=1;
        }
        else
            printf("PKCS #1 v1.5 encryption/decryption ok\n");

        printf("RSA_public_decrypt num: %d\n", num);
        ptext[num] = '\0';    //字符串结尾
        printf("ptext: %s\n", ptext);

next:
        //公钥和私钥输出为 PEM 格式:
        PEM_write_RSAPrivateKey(stdout, key, NULL, NULL, 0, NULL, NULL);
        PEM_write_RSAPublicKey(stdout, key);

        //释放申请的内存
        RSA_free(key);
    }

    if (err) printf("ERROR: %d\n", err);
    return err;
}


转载于:https://my.oschina.net/3pgp/blog/534962

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的示例,展示了如何使用 OpenSSL 库进行 RSA 加密解密。 首先,我们需要生成一对 RSA 密钥。这可以使用以下命令完成: ``` openssl genrsa -out private_key.pem 2048 openssl rsa -in private_key.pem -pubout -out public_key.pem ``` 其中,`private_key.pem` 是生成的私钥文件,`public_key.pem` 是生成的公钥文件。 接下来,我们可以使用以下代码来进行 RSA 加密解密: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/pem.h> int main() { RSA *rsa = NULL; FILE *fp = NULL; int rsa_len = 0; unsigned char *encrypted = NULL; unsigned char *decrypted = NULL; // 读取公钥文件 fp = fopen("public_key.pem", "r"); if (fp == NULL) { printf("Failed to open public key file\n"); return -1; } rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL); fclose(fp); if (rsa == NULL) { printf("Failed to read public key\n"); return -1; } // 计算 RSA 密钥长度 rsa_len = RSA_size(rsa); // 分配加密解密缓冲区 encrypted = (unsigned char*)malloc(rsa_len * sizeof(unsigned char)); decrypted = (unsigned char*)malloc(rsa_len * sizeof(unsigned char)); // 要加密的明文 const char *plain_text = "Hello, RSA!"; int plain_text_len = strlen(plain_text); // 加密明文 int encrypted_len = RSA_public_encrypt(plain_text_len, (unsigned char*)plain_text, encrypted, rsa, RSA_PKCS1_PADDING); if (encrypted_len == -1) { printf("Failed to encrypt\n"); return -1; } // 输出加密后的结果 printf("Encrypted: "); for (int i = 0; i < encrypted_len; i++) { printf("%02x", encrypted[i]); } printf("\n"); // 读取私钥文件 fp = fopen("private_key.pem", "r"); if (fp == NULL) { printf("Failed to open private key file\n"); return -1; } rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL); fclose(fp); if (rsa == NULL) { printf("Failed to read private key\n"); return -1; } // 解密密文 int decrypted_len = RSA_private_decrypt(encrypted_len, encrypted, decrypted, rsa, RSA_PKCS1_PADDING); if (decrypted_len == -1) { printf("Failed to decrypt\n"); return -1; } // 输出解密后的结果 printf("Decrypted: %s\n", decrypted); free(encrypted); free(decrypted); return 0; } ``` 在上述示例中,我们首先读取公钥文件,然后计算 RSA 密钥长度,并分配加密解密缓冲区。接下来,我们使用 `RSA_public_encrypt` 函数对明文进行加密,并使用 `RSA_private_decrypt` 函数对密文进行解密。在解密后,我们可以输出解密后的结果。 需要注意的是,在实际使用中,我们应该使用更安全的填充方式,如 RSA OAEP 填充。此外,为了确保安全,我们应该使用随机数生成器来生成 RSA 密钥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值