C#RSA加密解密(对接PHP)

上篇文章中写的RSA加密是针对C#的,现在外部调用的是PHP,我们平常见到的RSA无论公钥和私钥都是一长串数字,很显然C#生成的XML不是通用的加密。如果外部调用需要处理一下。

一、首先可以去网上找一些生成RSA密钥的工具,生成公钥和私钥。

二、拿到公钥和私钥需要处理一下,转换个XML格式的公钥和私钥

public class BouncyCastle
    {
        public static string RSAPrivateKeyJava2DotNet(string privateKey)
        {
            RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));

            return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
                Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
        }
        /// <summary>
        /// RSA公钥格式转换,java->.net
        /// </summary>
        /// <param name="publicKey">java生成的公钥</param>
        /// <returns></returns>
        public static string RSAPublicKeyJava2DotNet(string publicKey)
        {
            RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
            return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
                Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
                Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
        }
    }
View Code

三、生成工具生成的是2048位的公钥和私钥,这里加密和解密也要用2048位的

 #region RSA的加密函数

        //############################################################################## 
        //RSA 方式加密 
        //说明KEY必须是XML的行式,返回的是字符串 
        //在有一点需要说明!!该加密方式有 长度 限制的!! 
        //############################################################################## 
        //RSA的加密函数 string
        public static string RSAEncrypt(string xmlPublicKey, string m_strEncryptString)
        {
            byte[] PlainTextBArray;
            byte[] CypherTextBArray;
            string Result;
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);
            rsa.FromXmlString(xmlPublicKey);
            PlainTextBArray = (new UTF8Encoding()).GetBytes(m_strEncryptString);
            CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);
            Result = Convert.ToBase64String(CypherTextBArray);
            return Result;
        }
      
        #endregion

        #region RSA的解密函数 
        //RSA的解密函数 string
        public static string RSADecrypt(string xmlPrivateKey, string m_strDecryptString)
        {
            xmlPrivateKey = BouncyCastle.RSAPrivateKeyJava2DotNet(xmlPrivateKey);
            byte[] PlainTextBArray;
            byte[] DypherTextBArray;
            string Result;
            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);
            rsa.FromXmlString(xmlPrivateKey);
            PlainTextBArray = Convert.FromBase64String(m_strDecryptString);
            DypherTextBArray = rsa.Decrypt(PlainTextBArray, false);

            Result = (new UTF8Encoding()).GetString(DypherTextBArray);
            return Result;

        }
      
        #endregion
View Code

四、加密和解密

        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IHttpActionResult RSAEncrypt(RSARequest model)
        {
            string publicKey = BouncyCastle.RSAPublicKeyJava2DotNet(model.XmlPublicKey);
            string encryptionStr = RSACryption.RSAEncrypt(publicKey, model.StrEncryptString);
            return Ok(new
            {
                code = ResultCode.Success,
                encryptionStr = encryptionStr,
                message = "加密成功!"
            });
        }

        /// <summary>
        ///解密
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IHttpActionResult RSADecrypt(RSADecryptRequest model)
        {
            string str_Plain_Text = RSACryption.RSADecrypt(model.XmlPrivateKey, model.StrDecryptString);
            return Ok(new
            {
                code = ResultCode.Success,
                encryptionStr = str_Plain_Text,
                message = "解密成功!"
            });
        }
View Code

 

转载于:https://www.cnblogs.com/zhangjd/p/10899894.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RSA是一种非对称加密算法,通过利用大质数的特性,可以实现可靠的加密和解密过程。 RSA加密过程中,首先需要生成一对密钥,即公钥和私钥。公钥用于加密数据,私钥用于解密数据。 具体加密过程如下: 1. 选取两个不同的质数p和q,并计算它们的乘积n。 2. 计算n的欧拉函数φ(n),即φ(n) = (p-1)(q-1)。 3. 选取一个int型的整数e,使得1<e<φ(n),且e与φ(n)互质。 4. 计算e关于φ(n)的乘法逆元d,即d·e=1(mod φ(n))。 5. 公钥为(n, e),私钥为(n, d)。 6. 将明文数据转化为对应的十进制数m。 7. 加密过程为:c ≡ m^e(mod n)。 8. 得到密文c。 RSA解密过程如下: 1. 将密文c代入解密公式:m ≡ c^d(modn),得到明文m。 相比于其他加密算法,RSA具有加密效率低的特点,但是由于非对称加密的特性,它可以更好地保证数据的安全性。在JS中,通过使用各种开源的加密库,可以方便地实现RSA加密和解密的功能。 总结来说,JS加密RSA C是指通过使用JavaScript实现RSA加密算法,实现数据加密和解密的过程,保证数据的机密性和安全性。 ### 回答2: RSA是一种非对称加密算法,可以用于保护数据的安全性。在使用JavaScript进行RSA加密时,需要使用RSA加密算法的相关库或插件以实现相关功能。 在JavaScript中,我们可以使用如crypto-js或jsencrypt等库来进行RSA加密。这些库提供了一系列方法来生成RSA密钥对、加密和解密数据。 首先,我们需要生成RSA密钥对。可以使用库提供的方法来生成公钥和私钥。公钥用于加密数据,私钥用于解密数据。 使用RSA加密数据的过程如下:首先,将需要加密的数据通过公钥进行加密操作。加密后的数据可以通过网络传输或在本地存储。在接收方获取到加密数据后,可以使用私钥对其进行解密操作,以获取原始数据。 在使用RSA加密数据时,需要保证私钥的安全性,以免私钥被他人获取而导致数据泄露。因此,使用RSA加密时需要合理管理密钥,以保障数据的安全性。 总而言之,使用JavaScript进行RSA加密需要使用相关的库或插件,生成RSA密钥对并通过公钥加密数据,再通过私钥解密数据。加密数据的安全性取决于私钥的保护程度。 ### 回答3: RSA加密是一种非对称加密算法,用于保护数据的安全性和隐私性。在JavaScript中,我们可以使用一些库来实现RSA加密算法。 首先,我们需要准备一对RSA密钥,包括公钥和私钥。通常情况下,公钥用于加密数据,而私钥用于解密数据。可以通过一些在线工具或者自己生成密钥对。 接下来,我们需要引入一个JSRSA库,如"jsencrypt"来实现RSA加密。可以通过在HTML文档中引入该库的JavaScript文件或者使用npm进行安装。 接下来,我们可以在JavaScript代码中通过以下步骤来实现RSA加密: 1. 创建一个RSA实例,并传入公钥。 2. 调用实例的encrypt方法,传入要加密的数据作为参数。 3. 得到加密后的数据,可以通过调用实例的getEncryptedString方法来获取加密后的字符串。 下面是一个简单的示例代码: ```javascript // 引入jsencrypt库 const JSEncrypt = require('jsencrypt'); // 创建RSA实例 const rsa = new JSEncrypt(); // 设置公钥 rsa.setPublicKey(publicKey); // 要加密的数据 const data = 'Hello, RSA!'; // 加密数据 const encryptedData = rsa.encrypt(data); // 输出加密后的数据 console.log(encryptedData); ``` 以上示例中,我们通过传入公钥给RSA实例,并使用encrypt方法对数据进行加密,最后输出加密后的数据。 需要注意的是,RSA加密算法是一种非常安全和复杂的算法,仅仅使用以上代码可能还不够保证数据的安全性。在真实的场景中,还需要考虑密钥的生成和管理,以及数据的完整性和验证等方面的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值