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

要求在.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.   
    3. // Base64解码  
    4. unsigned char *buffer = (unsigned char *)malloc(length);  
    5. memset(buffer, 0, length);  
    6.   
    7. b64 = BIO_new(BIO_f_base64());  
    8. BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);  
    9. bmem = BIO_new_mem_buf(szKey, length);  
    10. bmem = BIO_push(b64, bmem);  
    11. int len = BIO_read(bmem, buffer, length);  
    12. BIO_free_all(bmem);  
    13.   
    14.   
    15. // 加载私钥  
    16. BIO * key = NULL;   
    17. RSA * r = NULL;   
    18. key = BIO_new(BIO_s_file());   
    19. BIO_read_filename(key,  "/val/XXX/private.pem" );   
    20. r = PEM_read_bio_RSAPrivateKey(key, NULL, NULL, NULL);   
    21. BIO_free_all(key);  
    22.   
    23.   
    24. unsigned char * plainText = (unsigned char *)malloc(len);  
    25. memset( plainText, 0, len);  
    26.   
    27. // 解密  
    28. int ret = RSA_private_decrypt( RSA_size(r), buffer, plainText, r, RSA_PKCS1_OAEP_PADDING);  
    29. RSA_free(r);  
    30.   
    31.   
    32. free(plainText);  
    33. free(buffer);  

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

原文地址:https://www.cnblogs.com/findumars/p/7460380.html