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

时间:2022-06-18 12:58:51

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

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

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

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

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

.Net端代码

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

Linux端代码

    1. BIO *b64, *bmem;
    2. // Base64解码
    3. unsigned char *buffer = (unsigned char *)malloc(length);
    4. memset(buffer, 0, length);
    5. b64 = BIO_new(BIO_f_base64());
    6. BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    7. bmem = BIO_new_mem_buf(szKey, length);
    8. bmem = BIO_push(b64, bmem);
    9. int len = BIO_read(bmem, buffer, length);
    10. BIO_free_all(bmem);
    11. // 加载私钥
    12. BIO * key = NULL;
    13. RSA * r = NULL;
    14. key = BIO_new(BIO_s_file());
    15. BIO_read_filename(key,  "/val/XXX/private.pem" );
    16. r = PEM_read_bio_RSAPrivateKey(key, NULL, NULL, NULL);
    17. BIO_free_all(key);
    18. unsigned char * plainText = (unsigned char *)malloc(len);
    19. memset( plainText, 0, len);
    20. // 解密
    21. int ret = RSA_private_decrypt( RSA_size(r), buffer, plainText, r, RSA_PKCS1_OAEP_PADDING);
    22. RSA_free(r);
    23. free(plainText);
    24. free(buffer);

http://blog.csdn.net/wangjia184/article/details/6941242