有全部源码,我调用openssl库的RSA和AES算法进行加密。加密字符串太长就会报错,具体如下。

报错信息是这样的:
Error encrypting message: error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size
Error decrypting message: error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02

我用的Linux环境进行开发的,不过也应该没有太大关系啦!
另外代码上有什么问题也可以指出来,万分感谢!!!
具体代码 如下:

 #include <openssl/rsa.h>
#include <openssl/sha.h>
#include <openssl/ssl.h>
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <assert.h>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <string>
#include <stdlib.h>

#define RSA_KEYLEN 2048
#define AES_KEYLEN 128
#define AES_ROUNDS 6

#define KEY_SERVER_PRI 0
#define KEY_SERVER_PUB 1
#define KEY_CLIENT_PUB 2
#define KEY_AES        3
#define KEY_AES_IV     4
#define KEY_LENGTH  2048
#define PUB_EXP     3

//用AES进行加密
int EncodeAES(unsigned char* password,unsigned int pass_len, unsigned char* data,unsigned int data_len,unsigned char** out_data,unsigned int *out_len)
{
    AES_KEY aes_key;
    if(AES_set_encrypt_key((const unsigned char*)password, 192, &aes_key) < 0)  
    {
        assert(false);
        return -1;
    }
    std::string  strRet;
    std::string  data_bak((const char*)data);
    unsigned int data_length = data_len;

    int padding = 0;
    if (data_len % AES_BLOCK_SIZE > 0)
    {
        padding =  AES_BLOCK_SIZE - data_len % AES_BLOCK_SIZE;
    }
    data_length += padding;
    while (padding > 0)
    {
        data_bak += '\0';
        padding--;
    }
    for(unsigned int i = 0; i < data_length/AES_BLOCK_SIZE; i++)
    {
        std::string str16 = data_bak.substr(i*AES_BLOCK_SIZE, AES_BLOCK_SIZE);
        unsigned char out[AES_BLOCK_SIZE];
        ::memset(out, 0, AES_BLOCK_SIZE);
        AES_encrypt((const unsigned char*)str16.c_str(), out, &aes_key);
        strRet += std::string((const char*)out, AES_BLOCK_SIZE);
    }

    *out_len=strRet.length();
    *out_data=(unsigned char*)malloc(*out_len);
    *out_data=(unsigned char*)strRet.c_str();
    return 0;
}


//用aes进行解密
int DecodeAES(unsigned char *password,unsigned int pass_len, unsigned char* data,unsigned int data_len,unsigned char** out_data,unsigned int *out_len )
{
    AES_KEY aes_key;
    if(AES_set_decrypt_key((const unsigned char*)password, 192, &aes_key) < 0)
    {
        assert(false);
        return -1;
    }
    std::string strRet;
    std::string strData((const char*)data);
    try
    {
        for(unsigned int i = 0; i < data_len/AES_BLOCK_SIZE; i++)
        {
            std::string str16 = strData.substr(i*AES_BLOCK_SIZE, AES_BLOCK_SIZE);
            unsigned char out[AES_BLOCK_SIZE];
            ::memset(out, 0, AES_BLOCK_SIZE);

            AES_decrypt((const unsigned char*)str16.c_str(), out, &aes_key);
            strRet += std::string((const char*)out, AES_BLOCK_SIZE);

        } 
    }
    catch (std::exception const &exc)
    {
        std::cerr << "Exception caught " << exc.what() << "\n";
    }
    catch (...)
    {
        std::cerr << "Unknown exception caught\n";
    }
    *out_len=strRet.length();
    *out_data=(unsigned char*)malloc(*out_len);
    *out_data=(unsigned char*)strRet.c_str();
    return 0;
}

//生成RSA需要的公钥和私钥
int generateRSAKeys(char ** pri_key, char ** pub_key) {
    RSA *keypair = RSA_generate_key(KEY_LENGTH, PUB_EXP, NULL, NULL);

    // To get the C-string PEM form:
    BIO *pri = BIO_new(BIO_s_mem());
    BIO *pub = BIO_new(BIO_s_mem());

    PEM_write_bio_RSAPrivateKey(pri, keypair, NULL, NULL, 0, NULL, NULL);
    PEM_write_bio_RSAPublicKey(pub, keypair);

    size_t pri_len = BIO_pending(pri);
    size_t pub_len = BIO_pending(pub);

    char* prikey = (char*)malloc(pri_len + 1);
    char* pubkey = (char*)malloc(pub_len + 1);

    if (prikey == NULL&&pubkey == NULL)
    {
        return -1;
    }

    BIO_read(pri, prikey, pri_len);
    BIO_read(pub, pubkey, pub_len);

    *pri_key = prikey;
    *pub_key = pubkey;

    RSA_free(keypair);
    BIO_free_all(pri);
    BIO_free_all(pub);
    return 0;
}


//用RSA公钥进行加密
int encryptWithPub(char *pub_key,char* msg, char **encrypt, int* encrypt_len ) {
    RSA *rsa = NULL;
    BIO* keybio = BIO_new_mem_buf((void *)pub_key, -1);
    char *err = (char*)malloc(130);

    if (keybio == NULL) {
        printf("failed to create key BIO\n");
        return -1;
    }

#ifdef RSAPUBKEY
    if ((rsa = PEM_read_bio_RSA_PUBKEY(keybio, NULL, NULL, NULL)) == NULL)
#else
    if ((rsa = PEM_read_bio_RSAPublicKey(keybio, NULL, NULL, NULL)) == NULL)
#endif

        if (!rsa){
            printf(" rsa is null %s\n", ERR_error_string(ERR_get_error(), NULL));
            return -1;
        }
    *encrypt_len = RSA_size(rsa);
    *encrypt = (char *)malloc(1024);

    if ((RSA_public_encrypt(strlen(msg) + 1, (unsigned char*)msg, (unsigned char*)*encrypt,rsa, RSA_PKCS1_PADDING)) == -1) 
    {
        ERR_load_crypto_strings();
        ERR_error_string(ERR_get_error(), err);
        fprintf(stderr, "Error encrypting message: %s\n", err);
        return -1;
    }

    RSA_free(rsa);
    free(err);
    BIO_free_all(keybio);
    // *encrypt_len=enstr.length();
    return 0;
}

//用RSA私钥进行解密
int decryptWtihPri(char *pri_key,char* msg,char **decrypt, int encrypt_len){
    RSA *rsa = NULL;
    BIO* keybio = BIO_new_mem_buf(pri_key, -1);
    if (keybio == NULL) {
        printf("failed to create key BIO\n");
        return -1;
    }


#ifdef RSAPRIVATE
    if ((rsa = PEM_read_bio_RSA_PRIVATE(keybio, NULL, NULL, NULL)) == NULL)
#else
    if ((rsa = PEM_read_bio_RSAPrivateKey(keybio, NULL, NULL, NULL)) == NULL)
#endif


        if (!rsa){
            printf(" rsa null %s\n", ERR_error_string(ERR_get_error(), NULL));
            return -1;
        }
    char *err = (char*)malloc(130);
    *decrypt = (char*)malloc(encrypt_len);
    if (RSA_private_decrypt(encrypt_len, (unsigned char*)msg, (unsigned char*)*decrypt, rsa, RSA_PKCS1_PADDING) == -1) {
        ERR_load_crypto_strings();
        ERR_error_string(ERR_get_error(), err);
        fprintf(stderr, "Error decrypting message: %s\n", err);
        return -1;
    }

    RSA_free(rsa);
    free(err);
    BIO_free_all(keybio);
    return 0;
}

/**
*测试函数部分
*/

int test_aes();
int test_rsa();

int main()
{
    test_rsa();
    test_aes();
    return 0;
} 

int test_rsa()
{
    printf("\n----------THE RSA TESTING -------- \n");
    char * pri_key;
    char * pub_key;
    generateRSAKeys(&pri_key, &pub_key);

    //printf("\n%s\n%s\n", pri_key, pub_key);

    char *encrypt;
    char *decrypt;
    int encrypt_length;
    encryptWithPub(pub_key,(char *)"i havei have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a key a key",&encrypt, &encrypt_length);

    decryptWtihPri( pri_key,encrypt, &decrypt,encrypt_length);
    printf("decrypted message: %s\n", decrypt);

    return 0;
}


int test_aes()
{
    printf("\n----------THE AES TESTING --------\n");
    char* pass=(char*)"key";
    int ret;
    char* data=(char*)"infocoei have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a key ei have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a key re big tree ";
    char *output=NULL;
    unsigned int out_len;
    char *newoutput=NULL;
    unsigned int new_len;

    std::cout<<"the length of key:"<<strlen(pass)<<std::endl;
    std::cout<<"before encryption:"<<data<<std::endl;

    ret=EncodeAES((unsigned char*)pass, strlen(pass),(unsigned char *)data,strlen(data),(unsigned char **)&output, &out_len);
    //std::cout<<"the en len:"<<out_len<<std::endl;
    ret=DecodeAES((unsigned char*)pass, strlen(pass),(unsigned char *)output,out_len,(unsigned char **)&newoutput, &new_len);
    //std::cout<<"the deenc len:"<<new_len<<std::endl;
    std::cout<<"after decryption:"<<newoutput<<std::endl;

}

代码的运行结果如下:

 ----------THE RSA TESTING -------- 
Error encrypting message: error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size
Error decrypting message: error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02
decrypted message: 惙l=

----------THE AES TESTING --------
the length of key:3
before encryption:infocoei have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a key ei have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a keyi have a key re big tree 
Exception caught basic_string::substr
after decryption:Ϝż§§<¾yK*. 

[root@localhost boost_encryption]# 

我的邮箱是fubohuauser@163.com 有啥问题也可以一起联系交流。谢谢

1个回答

rsa加密算法是有限制的。受到密钥长度限制。你应该把要加密的内容分块。一块块加密。这样可以避免长度限制问题

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
利用openssl进行RSA加密解密问题
利用openssl进行RSA加密解密 pem 文件是pkcs12格式 请问怎么获取公钥私钥
如何实现C++版的RSA加密,在不使用Openssl的情况下
已知公钥和私钥都是字符串、不使用Openssl等库的情况下实现C++版的RSA加密
c++ 调用openssl库AES_cbc_encrypt加解密padding解密如何去除
与服务器http通信。加密:AES_set_encrypt_key(AesKey, 128, &aes); AES_cbc_encrypt(input_string, encrypt_string, len, &aes, AesIvp, AES_ENCRYPT); 过去的字段后面添加的padding补全没问题。服务器返回的密文解密: AES_set_decrypt_key(AesKey, 128, &aes); AES_cbc_encrypt((unsigned char*)Dncrypt_string, (unsigned char*)encrypt_string, nlen, &aes, AesIvp, AES_DECRYPT); 解密出来的后面会多出padding乱码。请问哪位大神知道如何安全的去除解密后的padding。
刚开始学OPENSSL , 请问rsa加密解密和验证签名有关系吗? 为什么需要验证签名。
我只想知道具体的工作过程,不必知道里面的算法是怎么实现的。 知道怎么去用就可以了,感觉自己越看与糊涂了。 求助 谢谢
自己编译的openssl库,用来写代码时报找不到对应的函数
我自己从openssl官网下载的1.1.1的源码,然后编译好了之后,命令行openssl可以用,然后我使用lib静态库开发时,比如我想使用RSA加解密,预编译、编译、汇编都是好的,到了链接时,比如我使用RSA_new这个方法,在openssl/rsa.h下,预编译文件中都能找到,但链接时就报函数未定义,请问这是怎么回事,谢谢
C使用openssl RSA base64对数据进行加密解密出错
对数据进行RSA base64加密的时候没有出错,但是在解码base64的时候解码出来的字符串为空。 附代码,求大佬帮忙看一下: ``` int base64_encode(char *in_str, int in_len, char *out_str) { BIO *b64, *bio; BUF_MEM *bptr = NULL; size_t size = 0; if (in_str == NULL || out_str == NULL) return -1; b64 = BIO_new(BIO_f_base64()); bio = BIO_new(BIO_s_mem()); bio = BIO_push(b64, bio); BIO_write(bio, in_str, in_len); BIO_flush(bio); BIO_get_mem_ptr(bio, &bptr); memcpy(out_str, bptr->data, bptr->length); out_str[bptr->length] = '\0'; size = bptr->length; BIO_free_all(bio); return size; } ``` ``` int base64_decode(char *in_str, int in_len, char *out_str) { BIO *b64, *bio; BUF_MEM *bptr = NULL; int counts; int size = 0; if (in_str == NULL || out_str == NULL) return -1; b64 = BIO_new(BIO_f_base64()); BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); bio = BIO_new_mem_buf(in_str, in_len); bio = BIO_push(b64, bio); size = BIO_read(bio, out_str, in_len); out_str[size] = '\0'; BIO_free_all(bio); return size; } ``` ``` unsigned char *my_encrypt(char *str,char *path_key){ char *p_en; RSA *p_rsa; FILE *file,*p_file; int flen,rsa_len; if((file=fopen(path_key,"r"))==NULL){ perror("open key file error"); return NULL; } if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL){//PUBLIC KEY // if((p_rsa=PEM_read_RSAPublicKey(file,NULL,NULL,NULL))==NULL){//RSA PUBLIC KEY ERR_print_errors_fp(stdout); return NULL; } flen=strlen(str); rsa_len=RSA_size(p_rsa); p_en=(unsigned char *)malloc(rsa_len+1); memset(p_en,0,rsa_len+1); if(RSA_public_encrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_en,p_rsa,RSA_NO_PADDING)<0){ return NULL; } RSA_free(p_rsa); fclose(file); // p_file=fopen("./p_file.txt","w"); // fputs(p_en, p_file); return p_en; } ``` ``` char *my_decrypt(unsigned char *str,char *path_key){ char *p_de; RSA *p_rsa; FILE *file; int rsa_len; if((file=fopen(path_key,"r"))==NULL){ perror("open key file error"); return NULL; } if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL){ ERR_print_errors_fp(stdout); return NULL; } rsa_len=RSA_size(p_rsa); p_de=(unsigned char *)malloc(rsa_len+1); memset(p_de,0,rsa_len+1); if(RSA_private_decrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_de,p_rsa,RSA_NO_PADDING)<0){ return NULL; } RSA_free(p_rsa); fclose(file); return p_de; } ``` ``` main{ char source[1024]="hello"; char *ptr_en,*ptr_de, base64_en[1024] = "", base64_de[1024] = ""; printf("source is    :%s\n",source); ptr_en=my_encrypt(source,PUBLICKEY); printf("ptr_en strlen = %d\n", strlen(ptr_en)); printf("after encrypt:%s\n",ptr_en); base64_encode(ptr_en,strlen(ptr_en),base64_en); printf("after encode len: %d\nmsg:%s\n",strlen(base64_en), base64_en); base64_decode(base64_en,strlen(base64_en),base64_de); printf("after decode len: %d\nmsg:%s\n",strlen(base64_de), base64_de);//len输出长度为0 数据为空 ptr_de=my_decrypt(base64_de,OPENSSLKEY); printf("ptr_de strlen = %d\n", strlen(ptr_de)); printf("after decrypt:%s\n",ptr_de); if(ptr_en!=NULL){ free(ptr_en); } if(ptr_de!=NULL){ free(ptr_de); } return 0; } ``` base64_decode解码后长度为0,数据为空。当他们单独使用的加密解密的时候没问题,合起来就会出现这个情况,求大佬看一下 ,非常感谢
openssl php RSA密钥生成错误,无法加密
$res = openssl_pkey_new(); @openssl_pkey_export($res,$pri); @$d= openssl_pkey_get_details($res); $pub = $d['key']; var_dump($pub); //为什么会输出空? $res = openssl_pkey_get_private($pri); if (@openssl_sign('hello', $out, $res)) { echo $out."<br>".base64_encode($out); } $sig = $out; $sig = base64_decode($sig); $res = openssl_pkey_get_public($pub); if (@openssl_verify('hello', $sig, $res) === 1) { echo "ok"; }else{ echo "flase"; }
C++ openssl aes加密失败
我在使用openssl的aes(cbc)加密字节超过96的字符串后,在解密就会少字符,下面是我写的代码,求大神指点下什么问题,AES一次加密的明文是有长度限制么? CooloiAES::CooloiAES() : MSG_LEN(0) { for(int i = 0; i < AES_BLOCK_SIZE; i++) { key[i] = 32 + i; } } CooloiAES::~CooloiAES() { } std::string CooloiAES::aes_encrypt(std::string msg) { int i = msg.size() / 16; MSG_LEN = ( i + 1 ) * 16; //MSG_LEN = msg.size() + 16; char in[MSG_LEN]; char out[MSG_LEN]; memset((char*)in,0,MSG_LEN); memset((char*)out,0,MSG_LEN); //strncpy((char*)in,msg.c_str(),msg.size()); //memcpy((char*)in,msg.data(),msg.size()); strcpy((char*)in,msg.c_str()); unsigned char iv[AES_BLOCK_SIZE]; //加密的初始化向量 for(int j = 0; j < AES_BLOCK_SIZE; ++j) { iv[j] = 0; } AES_KEY aes; if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0) { return NULL; } size_t len = strlen(in); std::cout << "LEN ::::: " << len << std::endl; AES_cbc_encrypt((unsigned char*)in,(unsigned char*)out,len,&aes,iv,AES_ENCRYPT); std::string encrypt_msg(&out[0],&out[MSG_LEN+16]); for(int i= 0;out[i];i++){ printf("%x",(unsigned char)out[i]); //std::cout << dstStringTemp[i]; } std::cout << std::endl; return encrypt_msg; } std::string CooloiAES::aes_decrypt(std::string msg) { MSG_LEN = msg.size(); char in[MSG_LEN]; char out[MSG_LEN+16]; memset((char*)in,0,MSG_LEN); memset((char*)out,0,MSG_LEN+16); //strncpy((char*)in,msg.c_str(),msg.size()); memcpy((char*)in,msg.data(),msg.size()); for(int i= 0;in[i];i++){ printf("%x",(unsigned char)in[i]); //std::cout << dstStringTemp[i]; } std::cout << std::endl; unsigned char iv[AES_BLOCK_SIZE]; //加密的初始化向量 for(int j = 0; j < AES_BLOCK_SIZE; ++j) { iv[j] = 0; } AES_KEY aes; if(AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0) { return NULL; } //int len = msg.size(); size_t len = strlen(in); AES_cbc_encrypt((unsigned char*)in,(unsigned char*)out,len,&aes,iv,AES_DECRYPT); std::string decrypt_msg = out; return decrypt_msg; } ``` ```
在ubuntu上编译openssl时怎么取消加密算法
请问openssl怎么取消某种加密算法,如:AES128-SHA,AES256-SHA,DES-CBC3-SHA等。有试过使用no-sha 的方法,但是这样会将整个sha给去掉。谢谢!
关于IOS的RSA加密问题
由于公钥是服务器传下来的NSString类型,由于一些原因,不能使用证书加密,不能使用openssl库进行加密,要怎么加密好???急求,找了好久了,也看到有一些提问的,解决方法都不行。。。 最好有代码可以看。。。
openssl aes_256_cbc加解密的问题。
小弟这里有一个程序,使用的是openssl的库函数。 使用的解密关键函数是这样: ``` EVP_DecryptInit(&ctx, aes_256_cbc, key, iv); EVP_DecryptUpdate(&ctx, masterkey, &masterkey_len1, encrypted_masterkey, encrypted_masterkey_len); EVP_DecryptFinal(&ctx, masterkey + masterkey_len1, &masterkey_len2); ``` 其中key长度为32字节,iv长度为16字节。 masterkey_len1 为32字节,encrypted_masterkey_len 为48字节。 这里我就有些不懂了,为什么加密后的长度为48字节,与加密前的不太一样。 iv长度为16字节,我是否可以理解成明文长度分组应该是16字节? 但是如果这里不是16字节,也就是明文分组进行了padding,变成了24字节。那么就有新问题,iv是16字节,如何与padding后24字节的分组进行的异或运算? 所以我对此有些不解。大致的问题分为以下3个方面: 1、openssl中aes_256_cbc的明文分组长度是多少? 2、是否进行了padding?padding的模式是哪一种? 3、为何加密长度大于了原本明文长度,也就是解密出来的明文为何会小于密文长度?
openssl AES-CBC 命令行使用
当使用: openssl enc -e -aes-128-cbc -iv 0b1e1d000f0b07091d1f04071f1e0407 -k 1234567812345678 -in inputor.xml -out input.xml 或者 openssl enc -e -aes-128-cbc -k 1234567812345678 -in inputor.xml -out input.xml 这两种方式的时候第一种是自己输入初始化变量iv值,那下面这种方式的iv值是什么呢?怎么计算的?
openssl 中集成国密算法问题
我查了一下在github上的openssl代码已经集成了国密算法[github的openssl项目](https://github.com/openssl/openssl/ ""),国密代码在crypto目录下的sm2,sm3这些目录下面。我的操作系统是ubuntu16.04,安装以后通过命令行使用openssl的话,提供了哪些命令和参数进行国密的加解密和签名验签呢?github的仓库里和openssl官网上也没有找到相关的教程说明,求助。。。
在c++里怎么用aes(openssl)实现通信加密?
我之前写了一个程序,就是在c++里使用aes(openssl)加密消息后,再通过socket传送,加密后的二进制数据,我就直接存到了字符串里发送了出去,然后到了另一端就解密失败了,报错是539,有趣的是,我把这个消息再原封不动的转发回进行加密的那个程序中后,就可以解密了。因为以前也没有写过加解密的程序,所以也不知道是不是哪个地方的想法有问题,求大神指点迷津啊!!!!
IOS openssl AES加密是乱码
我需要AES/ECB/PKCS5Padding 加密方式,但是IOS只有PKCS7Padding,我要如何才能使用PKCS5Padding?
C++ 用openssl RSA 私钥解密
微信企业号,聊天记录提取:需要提供一个公钥给微信,他们用公钥加密聊天记录,然后我们再用私钥进行解密聊天保存。 用http://tool.chacuo.net/cryptrsapubkey这个网站生成了一对2048为的RSA密钥对,密钥格式为PKCS1。 公钥如下: -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxGzyp9l2CbGYVu8+8T9c XAnjNB7KCun6fH2j1u/8if29GxeJz/uU73lcIgewJN1z3gfZT29xoPSM3hlvoDG8 e4Kv20BWP63wr8cS5qwEuIno2IOwnhq0Mq09kylDdX9NwVnobLd110q34lN9iNzr 0csWzX07rYDWso4iuUuOTgXKxyQS34/Azgaea88hQLnCCw9YB2ocs1W0lSjhq5Gn k5FZZEhMe5UwaZI2ZgdKrBqSVQvMOxB57eBb6ofLPoDyx8DEkJmz4I6b61P/S7ZL x+Kz7nMCik/OGsJu4Cyr5CEebWyNuZzu9JyhfFc2aGGHda6Ph2/SpVjC15wGDnQL AwIDAQAB -----END PUBLIC KEY----- 加密字符串如下: bESlD7OobKjYMww9swtL6zmWvXl4mrraUt/XJvQpVbpK5u8rUP25/PJDOZms+3LF/3L2sXKj5QjUDPvQbi1ZvLBHB7fcUF59qAILIuOBi8NEgVrw6lx4CClhQciDK9FedcEkRIx/T0zuPiSNJmOyUAhYaJRG2/Xh5Mn+oMJ2LPohq5QWbd9eq17eKdY9LDKmcyoMGqCEt1iBPd1KXqHOsd79ca8aHwXdVH+mrYhHJYT5gZYwylX7LloXRevbFhFxSrFFpDNRRaSuW9vecwwO5EhUun1KoxTB3MYR3cLGowyJ+LFT1iQczr/TFW7EW1egFfeAmy9v6q8ae7blnARedw== 私钥如下: -----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAxGzyp9l2CbGYVu8+8T9cXAnjNB7KCun6fH2j1u/8if29GxeJ z/uU73lcIgewJN1z3gfZT29xoPSM3hlvoDG8e4Kv20BWP63wr8cS5qwEuIno2IOw nhq0Mq09kylDdX9NwVnobLd110q34lN9iNzr0csWzX07rYDWso4iuUuOTgXKxyQS 34/Azgaea88hQLnCCw9YB2ocs1W0lSjhq5Gnk5FZZEhMe5UwaZI2ZgdKrBqSVQvM OxB57eBb6ofLPoDyx8DEkJmz4I6b61P/S7ZLx+Kz7nMCik/OGsJu4Cyr5CEebWyN uZzu9JyhfFc2aGGHda6Ph2/SpVjC15wGDnQLAwIDAQABAoIBAQC5cy8qf+qsvkrZ ESp49NxLXV5wj/0rjrranHh6brwcwD6xfGi1v45fBlKRIncQZzCE2R43nD1IvHrf Gl7EfRC5/6nus/B6UMvj+W0D8jbG0BXRjYvLyeSF0ABJl3TEUzvjJ/KD6jZM3JN+ EFt+Qy42NatCuVEFv5V0oTNxhD9HsxC+hNvOQYUyIXNoSjXQA3VNgPrBavWpLX9d 2lwWxabu2/TcqDdhv0fB035RBNEDNzfWHmmlgfqaFDGlS+lbg6+ym46YuyX5axiw Im0xLuk8RpJ+cP2s56A4PKKwnReAdxWsJqZLeAqQ2hdepTc2TXslq9FUu/btg37f nGqcpazpAoGBAPeKLsmXE9SbL6ZqdgWOT0bY9SiFSMc4P21xB9VkoHuA71881ymt +jZSfyQyXSr1NM/bDStx4n9WmFoIfD2lstIGkURrieoaKb2SCuzQLJOIcsBV12Zz Gk+JrRxgfPqow9x/G3BVnoYird69zEo279CI0xaIYW2fZbEv7vnihmBXAoGBAMsj jEyPOTnv6TAChDLR3fy0NYhU+vBSSreDz6ZGFSO6zyRS419wzjQrjr6w4bFcvkBt 4R8M8Wx/KlXS+oiMK2IrX9QQ6eloMJrUe8lp/a4n7fbo/JsYD10lRa8v9LQGxY5X 1ck/k0J1cW4zyg4vBE7gv1N58Gu2HfrunTq8yw81AoGBAJMH+dh1qyq6bqgrTiTo rYAIeD30RRFIAKyx2ZRPq98P656nFapFE3zWrXxDigFtGkxn8T+f6of2WJIJvjoj xL5pdjmsooNxvN9D8sdMs12CS56gnkvVDIi33yIe0b1VJtk+in7D7GACE0JdfA2M 6g70ZmVY5n3lktKXBRxaB7ULAoGAKOMLzzEYvJ+cWOx4vV3eh4miKMGqDIsTvOJL /lSm1p04KkCAwWoMJxYJUjp6At/+7yrun/hT85mY5NNlV+yWotjGHgIVgsRU3CUe kUjDJbWlwQfeKD1sgjwJTZyibUXbp63oOuyP8FWBMkQ8TCSMgm/cMqodiSCL4kD6 5qKvYG0CgYEAj/v1QKuEEfm1YkkgDtiD68Eq0HDl58n6VS+GM8HLPQb/nUpdFN4z MDHY4cWb+Bt2M2csOcvx2N2Xsl3a/G0Q05q6OCmw/utCGdlHxo+ROPKZssIRYgO/ 67TdgZsRggEa66U2wSIoxBmfsD/qy42k9cYdl1rarTryuU2iJm2/+Ms= -----END RSA PRIVATE KEY----- 我利用openssl库进行解密,代码如下: // 私钥解密,cipherText--待解密字符串; priKey--私钥 std::string rsa_pri_decrypt(const std::string &cipherText, const std::string &priKey) { std::string strRet; RSA *rsa = RSA_new(); BIO *keybio; keybio = BIO_new_mem_buf((void *)priKey.c_str(), -1); // 读取私钥成RSA rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL); // 分配大小 int len = RSA_size(rsa); char *decryptedText = (char *)malloc(len + 1); memset(decryptedText, 0, len + 1); // 解密函数 int ret = RSA_private_decrypt(cipherText.length(), (const unsigned char*)cipherText.c_str(), (unsigned char*)decryptedText, rsa, RSA_PKCS1_PADDING); unsigned long error = ERR_peek_last_error(); if (ret >= 0) strRet = std::string(decryptedText, ret); // 释放内存 free(decryptedText); BIO_free_all(keybio); RSA_free(rsa); return strRet; } 得到的解密结果是解密失败,请问是哪里需要调整?
openssl 使用BIO进行加密的疑问
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/evp.h> #include <openssl/aes.h> #include <openssl/bio.h> int main(void) { BIO *bc = NULL, *b = NULL; char userkey[EVP_MAX_KEY_LENGTH]; char iv[EVP_MAX_IV_LENGTH]; unsigned char *date = malloc(AES_BLOCK_SIZE*3); unsigned char *encrypt = malloc(AES_BLOCK_SIZE*6); unsigned char *plain = malloc(AES_BLOCK_SIZE*6); int ret; int len = 0; memset((void*)userkey, 'k', EVP_MAX_KEY_LENGTH); memset((void*)iv, 'i', EVP_MAX_IV_LENGTH); memset((void*)date, 'p', AES_BLOCK_SIZE*3); memset((void*)encrypt, 0, AES_BLOCK_SIZE*6); memset((void*)plain, 0, AES_BLOCK_SIZE*6); bc = BIO_new(BIO_f_cipher()); BIO_set_cipher(bc,EVP_aes_256_ecb(), userkey, iv, 1); b = BIO_new(BIO_s_null()); b = BIO_push(bc,b); len = BIO_write(b, date, AES_BLOCK_SIZE*3); printf("result: %d\n",BIO_get_cipher_status(b)); BIO_flush(b); printf("write len: %d\n", len); len = BIO_read(b, encrypt, AES_BLOCK_SIZE*6); printf("result: %d\n",BIO_get_cipher_status(b)); printf("read len: %d\n", len); BIO_free(b); return 0; } 想使用BIO的方式使用EVP_aes_256_ecb()对数据进行加密,但是结果打印如下 result: 1 write len: 48 result: 1 read len: 16 在不使用padding的情况下,加密前后数据应该相等,为什么我read的结果是16,不是48呢? 对BIO使用不熟悉,是不是BIO使用的方式不对,请各位大大帮忙解决 系统是ubuntu 12.04
openssl EVP aes_256_cbc解密失败(c++)
我用openssl AES-CBC加密了一个字符串,然后把密文通过socket发送到另外一台电脑上解密,可是解密失败了,我原本以为是传输中丢失了数据,可是后来我把密文再发回到加密的那台电脑上就可以解密了,并且两台电脑的用的是相同的key和iv。可以排除是传输的问题,可是既然密钥和初始向量都相
openssl 的RSAD的调用
function RSA_decrypt(var tmp:PAnsiChar):PAnsiChar ; stdcall; var rsa: PRSA; key: PBIO; pkey: PEVP_PKEY; keysize :Integer; ret,P_en:PChar; begin key := BIO_new(BIO_s_file()); BIO_read_filename(key,'c:\publickey.txt'); pkey := PEM_read_bio_PUBKEY(key,pkey,nil,nil); rsa := EVP_PKEY_get1_RSA(pkey); keysize := RSA_size(rsa); P_en:=allocmem(keysize+1); FillMemory(P_en,SizeOf(P_en),0); //RSA_public_decrypt(keysize,tmp,ret,rsa,RSA_PKCS1_PADDING); RSA_public_encrypt(keysize,tmp,P_en,rsa,RSA_PKCS1_PADDING); Result:=P_en; // RSA_free(rsa); end; 调用有问题,一直返回空,不知道哪里的问题。。解密有内容后直接就崩溃。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了
这篇文章通过对话的形式,由浅入深带你读懂 AVL 树,看完让你保证理解 AVL 树的各种操作,如果觉得不错,别吝啬你的赞哦。 1、若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值。 2、若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值。 3、它的左右子树也分别可以充当为二叉查找树。 例如: 例如,我现在想要查找数值为14的节点。由于二叉查找树的特性,我们可...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
开源并不是你认为的那些事
点击上方蓝字 关注我们开源之道导读所以 ————想要理清开源是什么?先要厘清开源不是什么,名正言顺是句中国的古代成语,概念本身的理解非常之重要。大部分生物多样性的起源,...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
《C++ Primer》学习笔记(六):C++模块设计——函数
专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.csdn.net/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》习题参考答案:第6章 - C++模块设计——函数 文章目录专栏C+...
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法不过,当我看了源代码之后这程序不到50
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
相关热词 如何提升c#开发能力 矩阵乘法c# c#调用谷歌浏览器 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天
立即提问