C# 调用签名RSAwithSha256

 

    public class RSAWithSha256

    {

        public static string privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJTBuUozVo54cL5AaBI5b6BqIIXmPEY9/PeQiLulTknIyRLvUd59ZYNXV4ALR2BUFEkaDLqarzb5TtIg1hYtYikPtnaooRQyAw0V42wrPuGNAXuCxehfUNVWwoCE83n08oJ34Mt7CEJtMex+RhCG9Xlgpo91uN0dHjV1QwtNmkqZAgMBAAECgYA96eeB354+DBj4xnvKYgd439MLiAk8Px6jt4+BcksEYMJ31A3iKZTvtpGfpJIfoL8UsffsTudwXRGWWb5hWqBIzmRotfVs/0Uk7YtkAXP8G/Va6VZzCPNvTQU5jFwGInLTAfNNZddQSDoEcQdYQPCqNOu9FamKkbu6UaRPO5vG1QJBAMPBXyknxQzGn8QKaB7nO0yN3gx8MQOY6g7xG3yx+lN+i/TuXU6fGz9/v6BHTKJwSkeLxAt26yZ604SqVoRwYxsCQQDCiY4kY6YG7g8MYCEbMwEcQgjI39HPtw2irjRHscTexreh/+xKV8U/kAaQ1QRnYPl5lcJmyeDQaNZU4X1UVjBbAkAhvZLJZTFxokqnX6PSr8hoyYscW8uW8yRkruot8/9RpN46uVsb0hDAQSSmW6O52+DxtAV2dGjTmRgcJcAD09tBAkEAiOOKZgjIt2+knyy1nxIQ4fWFgPQeC2/f5G141Eo/IhPq+8++UcHZRpTuSdPbOXN/mRLMrM+5pm1fBHN3YXUUqQJAF0EwtPi/Yy+Tu0+LAx0UsDUR2rIJSLoG6XKkOfqDvg5Mrm/4rdjHuzllmHeaPtgIBYBydSJDSOBxklg5GQgRwg==";

 

        public static string publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCA7VN5cRbhFykjH+/Xz2F+6T0PHDFuyVr41Eh9U80ZK0Ml5snzhbLawyM2QGZNIyqCtAOXfdXimpKN2JlUXAx4qYzl35ggecWAzkxEz2bOKUjkVzDFKRBQqinEoDQZbyG3I9JC3U5Yc1K4DeUcqhc+lbQbw8aFcG5koC43otqCfQIDAQAB";

 

        /// <summary>

        /// </summary>

        /// <param name="str">需签名的数据</param>

        /// <param name="priKey">私钥</param>

        /// <returns>签名后的值</returns>

        public static string SignPrivate(string str, string priKey = null)

        {

            if (!string.IsNullOrWhiteSpace(priKey))

                privateKey = priKey;

            //SHA256withRSA

            //根据需要加签时的哈希算法转化成对应的hash字符节

            byte[] bt = Encoding.GetEncoding("utf-8").GetBytes(str);

 

            var sha256 = new SHA256CryptoServiceProvider();

 

            byte[] rgbHash = sha256.ComputeHash(bt);

 

            RSACryptoServiceProvider key = new RSACryptoServiceProvider();

 

            key.FromXmlString(RSAPrivateKeyJava2DotNet(privateKey));

 

            RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);

 

            formatter.SetHashAlgorithm("SHA256");//此处是你需要加签的hash算法,需要和上边你计算的hash值的算法一致,不然会报错。

 

            byte[] inArray = formatter.CreateSignature(rgbHash);

 

            return Convert.ToBase64String(inArray);

 

        }

 

        /// <summary>

        /// 私钥解密

        /// </summary>

        /// <param name="ciphertext"></param>

        /// <returns></returns>

        public static string Decrypt(string ciphertext)

        {

            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())

            {

                rsa.FromXmlString(RSAPrivateKeyJava2DotNet(privateKey));

 

                Byte[] CiphertextData = Convert.FromBase64String(ciphertext);

 

                int MaxBlockSize = rsa.KeySize / 8;    //解密块最大长度限制

 

                if (CiphertextData.Length <= MaxBlockSize)

 

                    return Encoding.Default.GetString(rsa.Decrypt(CiphertextData, false));

 

                using (MemoryStream CrypStream = new MemoryStream(CiphertextData))

 

                using (MemoryStream PlaiStream = new MemoryStream())

                {

                    Byte[] Buffer = new Byte[MaxBlockSize];

 

                    int BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize);

 

                    while (BlockSize > 0)

                    {

                        Byte[] ToDecrypt = new Byte[BlockSize];

 

                        Array.Copy(Buffer, 0, ToDecrypt, 0, BlockSize);

 

                        Byte[] Plaintext = rsa.Decrypt(ToDecrypt, false);

 

                        PlaiStream.Write(Plaintext, 0, Plaintext.Length);

 

                        BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize);

                    }

 

                    return Encoding.Default.GetString(PlaiStream.ToArray());

                }

            }

        }

 

        /// <summary>

        /// 公钥签名

        /// </summary>

        /// <param name="contentForSign"></param> 

        /// <param name="pubKey"></param>

        /// <returns></returns>

        public static string SignPublic(string contentForSign, string pubKey = null)

        {

            if (!string.IsNullOrWhiteSpace(pubKey))

                publicKey = pubKey;

            //转换成适用于.Net的秘钥

            var netKey = RSAPublicKeyJava2DotNet(publicKey);

 

            string encryptedContent = string.Empty;

 

            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())

            {

                rsa.FromXmlString(netKey);

 

                var contentData = Encoding.UTF8.GetBytes(contentForSign);

 

                int MaxBlockSize = rsa.KeySize / 8 - 11;    //加密块最大长度限制

 

                if (contentData.Length <= MaxBlockSize)

                {

                    return Convert.ToBase64String(rsa.Encrypt(Encoding.UTF8.GetBytes(contentForSign), false));

                }

 

                using (MemoryStream PlaiStream = new MemoryStream(contentData))

 

                using (MemoryStream CrypStream = new MemoryStream())

                {

                    Byte[] Buffer = new Byte[MaxBlockSize];

 

                    int BlockSize = PlaiStream.Read(Buffer, 0, MaxBlockSize);

 

                    while (BlockSize > 0)

                    {

                        Byte[] ToEncrypt = new Byte[BlockSize];

 

                        Array.Copy(Buffer, 0, ToEncrypt, 0, BlockSize);

 

                        Byte[] Cryptograph = rsa.Encrypt(ToEncrypt, false);

 

                        CrypStream.Write(Cryptograph, 0, Cryptograph.Length);

 

                        BlockSize = PlaiStream.Read(Buffer, 0, MaxBlockSize);

                    }

 

                    return Convert.ToBase64String(CrypStream.ToArray(), Base64FormattingOptions.None);

                }

            }

        }

 

        /// <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()));

        }

 

        /// <summary>

        /// RSA私钥格式转换,java->.net

        /// </summary>

        /// <param name="privatekey">java生成的私钥</param>

        /// <returns></returns>

        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()));

        }

    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值