OpenSSL RSA加解密 (.Net公钥加密/ Linux端私钥解密)

要求在.Net端生成公钥私钥对。

然后在.Net端使用RSA公钥加密;在Linux端使用RSA私钥解密。

最初的尝试是:.Net端使用RSACryptoServiceProvider; Linux端使用OpenSSL


搞了整整5个小时,有木有啊,有木有啊! .Net的RSA和OpenSSL对不上,有木有啊,有木有啊!

人都搞晕了就是对不上。最后解决方式换成了,.Net端使用 OpenSSL.Net. 


.Net端代码

        string publicKeyFile = context.Server.MapPath("~/App_Data/public.pem");
        using( RSA rsa = RSA.FromPublicKey(BIO.File(publicKeyFile, "r")) )
        {
            buffer = rsa.PublicEncrypt( buffer, RSA.Padding.OAEP);
            encryptedKey = Convert.ToBase64String(buffer);
        }


Linux端代码

BIO *b64, *bmem;

// Base64解码
unsigned char *buffer = (unsigned char *)malloc(length);
memset(buffer, 0, length);

b64 = BIO_new(BIO_f_base64());
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
bmem = BIO_new_mem_buf(szKey, length);
bmem = BIO_push(b64, bmem);
int len = BIO_read(bmem, buffer, length);
BIO_free_all(bmem);


// 加载私钥
BIO * key = NULL; 
RSA * r = NULL; 
key = BIO_new(BIO_s_file()); 
BIO_read_filename(key,  "/val/XXX/private.pem" ); 
r = PEM_read_bio_RSAPrivateKey(key, NULL, NULL, NULL); 
BIO_free_all(key);


unsigned char * plainText = (unsigned char *)malloc(len);
memset( plainText, 0, len);

// 解密
int ret = RSA_private_decrypt( RSA_size(r), buffer, plainText, r, RSA_PKCS1_OAEP_PADDING);
RSA_free(r);


free(plainText);
free(buffer);



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个简单的示例,展示了如何使用 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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值