当前位置: 首页 > news >正文

夺宝网站是怎么做推广的创业网站建设政策

夺宝网站是怎么做推广的,创业网站建设政策,公司网站设计与实现,网站建设需要报告文章目录 前言对方接口签名要求我方对接思路1.RSA 加密2.AES256加密 完整的加密帮助类 前言 提示#xff1a;这里可以添加本文要记录的大概内容#xff1a; 在我们对接其他公司接口的时候#xff0c;时常会出现对方使用的开发语言和我方使用的开发语言不同的情况#xff… 文章目录 前言对方接口签名要求我方对接思路1.RSA 加密2.AES256加密 完整的加密帮助类 前言 提示这里可以添加本文要记录的大概内容 在我们对接其他公司接口的时候时常会出现对方使用的开发语言和我方使用的开发语言不同的情况因为每个语言之间都会有些许差别在进行加密签名中就会出现签名一直对接不上的问题下面我就来和各位分享一下我所遇到的问题以及解决方案。 对方接口签名要求 报文发送方自行产生随机密钥然后再使用接收方公钥对随机秘钥进行RSA 非对称加密生成 encrypted。按照报文规范生成报文原文然后对报文原文JSON 格式字符串使用 对称密钥字节数组进行 AES256 算法加密再进行 Base64 编码生成msg再对报文原文进行签名得到签名结果十六进制字符串签名算法采用“SHA1withRSA”生成 signature 可以看到上面这一堆文字看似字很少实则却使用到了很多种加密方式 可以梳理出会用到的加密有RSA加密AES256加密Base64加密SHA1加密 我方对接思路 1.RSA 加密 由于对方时使用的javajava密钥的key格式和我们C#这边RSA加密使用的key格式不一样需要进行格式处理也就是下面的“RSAPrivateKeyJava2DotNet”方法。 public class RSAUtils{/// summary/// 生成私钥/// /summary/// returns/returnspublic static string CreatePrivateKey(){string str Guid.NewGuid().ToString(N);Byte[] bytes Encoding.GetEncoding(utf-8).GetBytes(str);byte[] aesKey new byte[16];for (int i 0; i 16; i){aesKey[i] bytes[i];}return Convert.ToBase64String(aesKey);}/// summary/// 生成密钥/// param nameprivateKey私钥/param/// param namepublicKey公钥/param/// param namekeySize密钥长度512,1024,204840968192/param/// /summarypublic static void Generator(out string privateKey, out string publicKey, int keySize 1024){RSACryptoServiceProvider rsa new RSACryptoServiceProvider(keySize);privateKey rsa.ToXmlString(true); //将RSA算法的私钥导出到字符串PrivateKey中 参数为true表示导出私钥 true 表示同时包含 RSA 公钥和私钥false 表示仅包含公钥。publicKey rsa.ToXmlString(false); //将RSA算法的公钥导出到字符串PublicKey中 参数为false表示不导出私钥 true 表示同时包含 RSA 公钥和私钥false 表示仅包含公钥。}/// summary/// RSA加密 将公钥导入到RSA对象中准备加密/// /summary/// param namepublicKey公钥/param/// param nameencryptstring待加密的字符串/parampublic static string RsaEncrypt(string publicKey, string encryptstring){using (var rsaProvider new RSACryptoServiceProvider()){string key RSAPublicKeyJava2DotNet(publicKey);var inputBytes Encoding.UTF8.GetBytes(encryptstring);//有含义的字符串转化为字节流rsaProvider.FromXmlString(key);//载入公钥int bufferSize (rsaProvider.KeySize / 8) - 11;//单块最大长度var buffer new byte[bufferSize];using (MemoryStream inputStream new MemoryStream(inputBytes), outputStream new MemoryStream()){while (true){ //分段加密int readSize inputStream.Read(buffer, 0, bufferSize);if (readSize 0){break;}var temp new byte[readSize];Array.Copy(buffer, 0, temp, 0, readSize);var encryptedBytes rsaProvider.Encrypt(temp, false);outputStream.Write(encryptedBytes, 0, encryptedBytes.Length);}return Convert.ToBase64String(outputStream.ToArray());//转化为字节流方便传输}}}/// summary/// Java转.net格式/// /summary/// param nameJavaPublicKeyJava格式公钥/param/// returns/returnspublic static string RSAPublicKeyJava2DotNet(string JavaPublicKey){RsaKeyParameters publicKeyParam (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(JavaPublicKey));return string.Format(RSAKeyValueModulus{0}/ModulusExponent{1}/Exponent/RSAKeyValue,Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));}/// summary/// .NET格式转Java格式/// /summary/// param namecPublicKeyc#的.net格式公钥/param/// returns/returnspublic static string RSAPublicKeyDotNet2Java(string cPublicKey){XmlDocument doc new XmlDocument(); doc.LoadXml(cPublicKey);BigInteger m new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(Modulus)[0].InnerText));BigInteger p new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(Exponent)[0].InnerText));RsaKeyParameters pub new RsaKeyParameters(false, m, p);SubjectPublicKeyInfo publicKeyInfo SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);byte[] serializedPublicBytes publicKeyInfo.ToAsn1Object().GetDerEncoded();return Convert.ToBase64String(serializedPublicBytes);}/// summary/// .java格式密钥转c#使用的.net格式密钥/// /summary/// param nameJavaPrivateKey.java密钥/param/// returns/returnspublic static string RSAPrivateKeyJava2DotNet(string JavaPrivateKey){RsaPrivateCrtKeyParameters privateKeyParam (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(JavaPrivateKey));return string.Format(RSAKeyValueModulus{0}/ModulusExponent{1}/ExponentP{2}/PQ{3}/QDP{4}/DPDQ{5}/DQInverseQ{6}/InverseQD{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/// c#使用的.net格式密钥转换成.Java格式密钥/// /summary/// param namecPrivateKey.net格式密钥/param/// returns/returnspublic static string RSAPrivateKeyDotNet2Java(string cPrivateKey){XmlDocument doc new XmlDocument();doc.LoadXml(cPrivateKey);BigInteger m new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(Modulus)[0].InnerText));BigInteger exp new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(Exponent)[0].InnerText));BigInteger d new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(D)[0].InnerText));BigInteger p new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(P)[0].InnerText));BigInteger q new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(Q)[0].InnerText));BigInteger dp new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(DP)[0].InnerText));BigInteger dq new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(DQ)[0].InnerText));BigInteger qinv new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(InverseQ)[0].InnerText));RsaPrivateCrtKeyParameters privateKeyParam new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);PrivateKeyInfo privateKeyInfo PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);byte[] serializedPrivateBytes privateKeyInfo.ToAsn1Object().GetEncoded();return Convert.ToBase64String(serializedPrivateBytes);}/// summary /// RSA解密 载入私钥解密数据 /// /summary /// param nameprivateKey私钥/param /// param namedecryptstring待解密的字符串/param public static string RsaDecrypt(string privateKey, string decryptstring){using (var rsaProvider new RSACryptoServiceProvider()){string key RSAPrivateKeyJava2DotNet(privateKey);rsaProvider.FromXmlString(key); //载入私钥 var encryptedBytes Convert.FromBase64String(decryptstring); //将传入的字符串转化为字节流 //var outputStream new MemoryStream(encryptedBytes);var bufferSize rsaProvider.KeySize / 8;var buffer new byte[bufferSize];using (MemoryStream inputStream new MemoryStream(encryptedBytes), outputStream new MemoryStream()){while (true){int readSize inputStream.Read(buffer, 0, bufferSize);if (readSize 0){break;}var temp new byte[readSize];Array.Copy(buffer, 0, temp, 0, readSize);var decryptedBytes rsaProvider.Decrypt(temp, false);outputStream.Write(decryptedBytes, 0, decryptedBytes.Length);}return Encoding.UTF8.GetString(outputStream.ToArray()); //转化为字符串 }}}/// summary/// RSA私钥加密/// /summary/// param nameprivateKey私钥/param/// param nameencryptstring待加密的字符串/parampublic static string RsaPrivateEncrypt(string privateKey, string encryptstring){var rsaProvider new RSACryptoServiceProvider();rsaProvider.FromXmlString(privateKey);//载入私钥var inputBytes Convert.FromBase64String(encryptstring);//有含义的字符串转化为字节流int bufferSize (rsaProvider.KeySize / 8) - 11;//单块最大长度var buffer new byte[bufferSize];using (MemoryStream inputStream new MemoryStream(inputBytes), outputStream new MemoryStream()){while (true){//分段加密int readSize inputStream.Read(buffer, 0, bufferSize);if (readSize 0){break;}var temp new byte[readSize];Array.Copy(buffer, 0, temp, 0, readSize);var encryptedBytes RsaPrivateEncrypt(privateKey, temp);outputStream.Write(encryptedBytes, 0, encryptedBytes.Length);}return Convert.ToBase64String(outputStream.ToArray());//转化为字节流方便传输}}/// summary /// RSA公钥解密/// /summary /// param namepublicKey公钥/param /// param namedecryptstring待解密的字符串/param public static string RsaPublicDecrypt(string publicKey, string decryptstring){var rsaProvider new RSACryptoServiceProvider();rsaProvider.FromXmlString(publicKey); //载入私钥 var encryptedBytes Convert.FromBase64String(decryptstring); //将传入的字符串转化为字节流 var bufferSize rsaProvider.KeySize / 8;var buffer new byte[bufferSize];using (MemoryStream inputStream new MemoryStream(encryptedBytes), outputStream new MemoryStream()){while (true){int readSize inputStream.Read(buffer, 0, bufferSize);if (readSize 0){break;}var temp new byte[readSize];Array.Copy(buffer, 0, temp, 0, readSize);var decryptedBytes decryptByPublicKey(publicKey, temp);outputStream.Write(decryptedBytes, 0, decryptedBytes.Length);}return Convert.ToBase64String(outputStream.ToArray());}}/// summary/// SHA1 加密返回大写字符串/// /summary/// param namecontent需要加密字符串/param/// returns返回40位UTF8 大写/returnspublic static string SHA1(string content){return SHA1(content, Encoding.UTF8);}/// summary/// SHA1 加密返回大写字符串/// /summary/// param namecontent需要加密字符串/param/// param nameencode指定加密编码/param/// returns返回40位大写字符串/returnsprivate static string SHA1(string content, Encoding encode){try{SHA1 sha1 new SHA1CryptoServiceProvider();byte[] bytes_in encode.GetBytes(content);byte[] bytes_out sha1.ComputeHash(bytes_in);sha1.Dispose();string result BitConverter.ToString(bytes_out);result result.Replace(-, );return result;}catch (Exception ex){throw new Exception(SHA1加密出错 ex.Message);}}/// summary/// 私钥加密/// 这个方法只能加密 私钥长度/8 -11 个字符分段加密的代码要自己处理了。/// /summary/// param nameprivateKey密钥/param/// param namedata要加密的数据/param/// returns/returnspublic static byte[] RsaPrivateEncrypt(string privateKey, byte[] data){string xmlPrivateKey privateKey;//加载私钥 RSACryptoServiceProvider privateRsa new RSACryptoServiceProvider();privateRsa.FromXmlString(xmlPrivateKey);//转换密钥 AsymmetricCipherKeyPair keyPair DotNetUtilities.GetKeyPair(privateRsa);//IBufferedCipher c CipherUtilities.GetCipher(RSA/ECB/PKCS1Padding);// 参数与Java中加密解密的参数一致 IBufferedCipher c CipherUtilities.GetCipher(RSA);c.Init(true, keyPair.Private); //第一个参数为true表示加密为false表示解密第二个参数表示密钥 byte[] DataToEncrypt data;byte[] outBytes c.DoFinal(DataToEncrypt);//加密 return outBytes;}/// summary/// 用公钥解密/// 这个方法只能加密 私钥长度/8 -11 个字符分段加密的代码要自己处理了。/// /summary/// param namedata/param/// param namekey/param/// returns/returnspublic static byte[] decryptByPublicKey(string publicKey, byte[] data){string xmlPublicKey publicKey;RSACryptoServiceProvider publicRsa new RSACryptoServiceProvider();publicRsa.FromXmlString(xmlPublicKey);AsymmetricKeyParameter keyPair DotNetUtilities.GetRsaPublicKey(publicRsa);//转换密钥 // AsymmetricCipherKeyPair keyPair DotNetUtilities.GetRsaKeyPair(publicRsa);//IBufferedCipher c CipherUtilities.GetCipher(RSA/ECB/PKCS1Padding);// 参数与Java中加密解密的参数一致 IBufferedCipher c CipherUtilities.GetCipher(RSA);c.Init(false, keyPair); //第一个参数为true表示加密为false表示解密第二个参数表示密钥 byte[] DataToEncrypt data;byte[] outBytes c.DoFinal(DataToEncrypt);//解密 return outBytes;}}调用方法 string pkey RSAUtils.CreatePrivateKey();encrypt.data.encrypted RSAUtils.RsaEncrypt(publicKey, pkey);其中publicKey 是对方公司(JAVA)给我们的公钥, 这里我们生成的KEY是Q2THHWOD1H4L81DO 加密出来的值是rZdVr8ksB4EyJ0L6GGjcgHRXYKwRnxxs94Hyd/Y52SgqaROFva3DLACjYrzyAHetmGrMpPLKf4TRq0V8F5eDrjZRhOQelA5ogSWRoLwzpN4KZirBc1HCHyrfaEvHDtoJeNabZzKFTDHvNZ94NRQfpHXqABlS7TzOXJKLK1Z/BiQjGuyOGL3xohwhyZvgjqNFjpTYU7gqobno5kBK6zoG8B2wilsDP4hkF7IAn6dAlw8scBMpuULZF6ceBCEakkgWrBYn4E5DiC5c1tz2x3yViBNO2XV0YdZIrBVkWKZGCWBYVkq53ovyPavuMMyK16HF7CnKlE3RdMc2WvT6g 这一步我们加密后对方公司的java是能解密出正确明文的。 2.AES256加密 这里问题就来了 下面是错误方法 /// summary/// AES加密/// /summary/// param nameencryptStr明文/param/// param namekey密钥/param/// returns/returnspublic static string Encrypt(string encryptStr,string key){byte[] keyArray UTF8Encoding.UTF8.GetBytes(key);byte[] toEncryptArray UTF8Encoding.UTF8.GetBytes(encryptStr);RijndaelManaged rDel new RijndaelManaged();rDel.Key keyArray;rDel.Mode CipherMode.ECB;rDel.Padding PaddingMode.PKCS7;ICryptoTransform cTransform rDel.CreateEncryptor();byte[] resultArray cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return Convert.ToBase64String(resultArray, 0, resultArray.Length);}/// summary/// AES解密/// /summary/// param namedecryptStr密文/param/// param namekey密钥/param/// returns/returnspublic static string Decrypt(string decryptStr,string key){byte[] keyArray UTF8Encoding.UTF8.GetBytes(key);byte[] toEncryptArray Convert.FromBase64String(decryptStr);RijndaelManaged rDel new RijndaelManaged();rDel.Key keyArray;rDel.Mode CipherMode.ECB;rDel.Padding PaddingMode.PKCS7;ICryptoTransform cTransform rDel.CreateDecryptor();byte[] resultArray cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return UTF8Encoding.UTF8.GetString(resultArray);}这种方式加密在网上的在线解密工具都解密不了只有我们C#写的解密方法能解密估计是因为填充类型或者其他什么地方有问题。在这里我也困惑了很久 下面是正确方法 public class AESUtils {/// summary/// AES256加密/// /summary/// param namecontent明文/param/// param namepassphase密钥/param/// returns/returnspublic static string Encrypt(string content, string passphase){byte[] bytes Encoding.UTF8.GetBytes(content);byte[] key, iv, salt new byte[8];using (var rng new RNGCryptoServiceProvider()){rng.GetBytes(salt); }using (var md5 new MD5CryptoServiceProvider()){var preHash Encoding.UTF8.GetBytes(passphase).Concat(salt).ToArray();var bs1 md5.ComputeHash(preHash);var bs2 md5.ComputeHash(bs1.Concat(preHash).ToArray());var bs3 md5.ComputeHash(bs2.Concat(preHash).ToArray());key bs1.Concat(bs2).ToArray();iv bs3;}using (var aes new AesCryptoServiceProvider() { Key key, IV iv })using (var encryptor aes.CreateEncryptor()){var encryptedBytes encryptor.TransformFinalBlock(bytes, 0, bytes.Length);var concated Encoding.UTF8.GetBytes(Salted__).Concat(salt).Concat(encryptedBytes);return Convert.ToBase64String(concated.ToArray());}}/// summary/// AES256解密/// /summary/// param namecontent密文/param/// param namepassphase密钥/param/// returns/returnspublic static string Decrypt(string content, string passphase){// openssl aes-256-cbc -k 123456789 -md md5 -e -base64//byte[] bytes Convert.FromBase64String(content);byte[] key, iv, salt new byte[8], encryptedBytes new byte[bytes.Length - 8 - 8];//提取 saltArray.ConstrainedCopy(sourceArray: bytes,sourceIndex: 8, //剔除开头的 Salted__destinationArray: salt,destinationIndex: 0,length: salt.Length);//提取 encryptedBytesArray.ConstrainedCopy(sourceArray: bytes,sourceIndex: 8 8, //并剔除开头的 saltdestinationArray: encryptedBytes,destinationIndex: 0,length: encryptedBytes.Length);using (var md5 new MD5CryptoServiceProvider()){var preHash Encoding.UTF8.GetBytes(passphase).Concat(salt).ToArray();var bs1 md5.ComputeHash(preHash);var bs2 md5.ComputeHash(bs1.Concat(preHash).ToArray());var bs3 md5.ComputeHash(bs2.Concat(preHash).ToArray());key bs1.Concat(bs2).ToArray();iv bs3;}using (var aes new AesCryptoServiceProvider() { Key key, IV iv })using (var decryptor aes.CreateDecryptor()){byte[] decryptedBytes decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);return Encoding.UTF8.GetString(decryptedBytes);}}/// summary/// 加密 (新的思路)/// /summary/// param namecontent明文/param/// param namepassphase密码(固定32位)/param/// returns密文(base64)/returnsstatic string CryptoJsEncrypt_New(string content, string passphase ){byte[] bytes Encoding.UTF8.GetBytes(content);byte[] key Encoding.UTF8.GetBytes(passphase); //32位的keybyte[] iv new byte[16];using (var rng new RNGCryptoServiceProvider())rng.GetBytes(iv); // 产生16个字节的随机ivusing (var aes new AesCryptoServiceProvider() { Key key, IV iv })using (var encryptor aes.CreateEncryptor()){var encryptedBytes encryptor.TransformFinalBlock(bytes, 0, bytes.Length);var concated iv.Concat(encryptedBytes);return aes256: Convert.ToBase64String(concated.ToArray());}}/// summary/// 解密 (新的思路)/// /summary/// param namecontent密文(base64)/param/// param namepassphase密码(固定32位)/param/// returns明文/returnsstatic string CryptoJsDecrypt_New(string content, string passphase ){byte[] bytes Convert.FromBase64String(content.Substring(7)); //剔除开头的 aes256:byte[] key Encoding.UTF8.GetBytes(passphase); //32位的keybyte[] iv new byte[16];byte[] encryptedBytes new byte[bytes.Length - 16];//提取 ivArray.ConstrainedCopy(sourceArray: bytes,sourceIndex: 0,destinationArray: iv,destinationIndex: 0,length: iv.Length);//提取 加密结果Array.ConstrainedCopy(sourceArray: bytes,sourceIndex: 16, //并剔除开头的 ivdestinationArray: encryptedBytes,destinationIndex: 0,length: encryptedBytes.Length);using (var aes new AesCryptoServiceProvider() { Key key, IV iv })using (var decryptor aes.CreateDecryptor()){byte[] decryptedBytes decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);return Encoding.UTF8.GetString(decryptedBytes);}} }调用方法 AESUtils.Encrypt(datastr, pkey);加密前明文字符串 {storeId:1788431406828474370,merchantId:1788027169854296065,tradeNo:123456,phone:13366237305,tradeAmount:5.0,notifyUrl:http://wx.wjy99.com/onlinemtorder/yunxin/orderMsg,callbackUrl:http://wx.wjy99.com/onlinemtorder/yunxin/orderMsg,remark:测试请求} 加密后密文 U2FsdGVkX1FSSnYrXRRcvfDoSeLLPcaA2LEN0/ix7Z41jXIYRdCdIm3DMobxwvVdMnFwv4iq7LhFxAZcetRHbS3hxhbjObhNvkQrvd79AnZdEMoM/BGTx66U/c8xtdMheqxrRWoXoIIpfRfUQCGZBuU5upwMjTmuU3vJKQX/2r5qUHkjH05qkRioLb6bvi1FKI6vp3Bs4sKPEKtq5M26aBdOfo5RmmrSJ023GkvC4DGxlyVn7ac97bBj3X/8h2yfpT1E6zW6FwZIBKaVPlPFVeKVeXBZwdX5tgpgB4e6duHPAjArQ1XYRfx2ugNn38IDxwtap7ocBi3GnPB8U4iTXPCz/7uFutDzIQi0hRVEMpVRqaaaw2Ri2fFV84QYgotJCqXkKRwyx9g 这种加密方式网上的解密都能解开了。 完整的加密帮助类 /// summary/// RSA/// /summarypublic class RSAUtils{/// summary/// 生成私钥/// /summary/// returns/returnspublic static string CreatePrivateKey(){string str Guid.NewGuid().ToString(N);Byte[] bytes Encoding.GetEncoding(utf-8).GetBytes(str);byte[] aesKey new byte[16];for (int i 0; i 16; i){aesKey[i] bytes[i];}return Convert.ToBase64String(aesKey);}/// summary/// 生成密钥/// param nameprivateKey私钥/param/// param namepublicKey公钥/param/// param namekeySize密钥长度512,1024,204840968192/param/// /summarypublic static void Generator(out string privateKey, out string publicKey, int keySize 1024){RSACryptoServiceProvider rsa new RSACryptoServiceProvider(keySize);privateKey rsa.ToXmlString(true); //将RSA算法的私钥导出到字符串PrivateKey中 参数为true表示导出私钥 true 表示同时包含 RSA 公钥和私钥false 表示仅包含公钥。publicKey rsa.ToXmlString(false); //将RSA算法的公钥导出到字符串PublicKey中 参数为false表示不导出私钥 true 表示同时包含 RSA 公钥和私钥false 表示仅包含公钥。}/// summary/// RSA加密 将公钥导入到RSA对象中准备加密/// /summary/// param namepublicKey公钥/param/// param nameencryptstring待加密的字符串/parampublic static string RsaEncrypt(string publicKey, string encryptstring){using (var rsaProvider new RSACryptoServiceProvider()){string key RSAPublicKeyJava2DotNet(publicKey);var inputBytes Encoding.UTF8.GetBytes(encryptstring);//有含义的字符串转化为字节流rsaProvider.FromXmlString(key);//载入公钥int bufferSize (rsaProvider.KeySize / 8) - 11;//单块最大长度var buffer new byte[bufferSize];using (MemoryStream inputStream new MemoryStream(inputBytes), outputStream new MemoryStream()){while (true){ //分段加密int readSize inputStream.Read(buffer, 0, bufferSize);if (readSize 0){break;}var temp new byte[readSize];Array.Copy(buffer, 0, temp, 0, readSize);var encryptedBytes rsaProvider.Encrypt(temp, false);outputStream.Write(encryptedBytes, 0, encryptedBytes.Length);}return Convert.ToBase64String(outputStream.ToArray());//转化为字节流方便传输}}}/// summary/// Java转.net格式/// /summary/// param nameJavaPublicKeyJava格式公钥/param/// returns/returnspublic static string RSAPublicKeyJava2DotNet(string JavaPublicKey){RsaKeyParameters publicKeyParam (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(JavaPublicKey));return string.Format(RSAKeyValueModulus{0}/ModulusExponent{1}/Exponent/RSAKeyValue,Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));}/// summary/// .NET格式转Java格式/// /summary/// param namecPublicKeyc#的.net格式公钥/param/// returns/returnspublic static string RSAPublicKeyDotNet2Java(string cPublicKey){XmlDocument doc new XmlDocument(); doc.LoadXml(cPublicKey);BigInteger m new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(Modulus)[0].InnerText));BigInteger p new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(Exponent)[0].InnerText));RsaKeyParameters pub new RsaKeyParameters(false, m, p);SubjectPublicKeyInfo publicKeyInfo SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);byte[] serializedPublicBytes publicKeyInfo.ToAsn1Object().GetDerEncoded();return Convert.ToBase64String(serializedPublicBytes);}/// summary/// .java格式密钥转c#使用的.net格式密钥/// /summary/// param nameJavaPrivateKey.java密钥/param/// returns/returnspublic static string RSAPrivateKeyJava2DotNet(string JavaPrivateKey){RsaPrivateCrtKeyParameters privateKeyParam (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(JavaPrivateKey));return string.Format(RSAKeyValueModulus{0}/ModulusExponent{1}/ExponentP{2}/PQ{3}/QDP{4}/DPDQ{5}/DQInverseQ{6}/InverseQD{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/// c#使用的.net格式密钥转换成.Java格式密钥/// /summary/// param namecPrivateKey.net格式密钥/param/// returns/returnspublic static string RSAPrivateKeyDotNet2Java(string cPrivateKey){XmlDocument doc new XmlDocument();doc.LoadXml(cPrivateKey);BigInteger m new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(Modulus)[0].InnerText));BigInteger exp new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(Exponent)[0].InnerText));BigInteger d new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(D)[0].InnerText));BigInteger p new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(P)[0].InnerText));BigInteger q new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(Q)[0].InnerText));BigInteger dp new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(DP)[0].InnerText));BigInteger dq new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(DQ)[0].InnerText));BigInteger qinv new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName(InverseQ)[0].InnerText));RsaPrivateCrtKeyParameters privateKeyParam new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);PrivateKeyInfo privateKeyInfo PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);byte[] serializedPrivateBytes privateKeyInfo.ToAsn1Object().GetEncoded();return Convert.ToBase64String(serializedPrivateBytes);}/// summary /// RSA解密 载入私钥解密数据 /// /summary /// param nameprivateKey私钥/param /// param namedecryptstring待解密的字符串/param public static string RsaDecrypt(string privateKey, string decryptstring){using (var rsaProvider new RSACryptoServiceProvider()){string key RSAPrivateKeyJava2DotNet(privateKey);rsaProvider.FromXmlString(key); //载入私钥 var encryptedBytes Convert.FromBase64String(decryptstring); //将传入的字符串转化为字节流 //var outputStream new MemoryStream(encryptedBytes);var bufferSize rsaProvider.KeySize / 8;var buffer new byte[bufferSize];using (MemoryStream inputStream new MemoryStream(encryptedBytes), outputStream new MemoryStream()){while (true){int readSize inputStream.Read(buffer, 0, bufferSize);if (readSize 0){break;}var temp new byte[readSize];Array.Copy(buffer, 0, temp, 0, readSize);var decryptedBytes rsaProvider.Decrypt(temp, false);outputStream.Write(decryptedBytes, 0, decryptedBytes.Length);}return Encoding.UTF8.GetString(outputStream.ToArray()); //转化为字符串 }}}/// summary/// RSA私钥加密/// /summary/// param nameprivateKey私钥/param/// param nameencryptstring待加密的字符串/parampublic static string RsaPrivateEncrypt(string privateKey, string encryptstring){var rsaProvider new RSACryptoServiceProvider();rsaProvider.FromXmlString(privateKey);//载入私钥var inputBytes Convert.FromBase64String(encryptstring);//有含义的字符串转化为字节流int bufferSize (rsaProvider.KeySize / 8) - 11;//单块最大长度var buffer new byte[bufferSize];using (MemoryStream inputStream new MemoryStream(inputBytes), outputStream new MemoryStream()){while (true){//分段加密int readSize inputStream.Read(buffer, 0, bufferSize);if (readSize 0){break;}var temp new byte[readSize];Array.Copy(buffer, 0, temp, 0, readSize);var encryptedBytes RsaPrivateEncrypt(privateKey, temp);outputStream.Write(encryptedBytes, 0, encryptedBytes.Length);}return Convert.ToBase64String(outputStream.ToArray());//转化为字节流方便传输}}/// summary /// RSA公钥解密/// /summary /// param namepublicKey公钥/param /// param namedecryptstring待解密的字符串/param public static string RsaPublicDecrypt(string publicKey, string decryptstring){var rsaProvider new RSACryptoServiceProvider();rsaProvider.FromXmlString(publicKey); //载入私钥 var encryptedBytes Convert.FromBase64String(decryptstring); //将传入的字符串转化为字节流 var bufferSize rsaProvider.KeySize / 8;var buffer new byte[bufferSize];using (MemoryStream inputStream new MemoryStream(encryptedBytes), outputStream new MemoryStream()){while (true){int readSize inputStream.Read(buffer, 0, bufferSize);if (readSize 0){break;}var temp new byte[readSize];Array.Copy(buffer, 0, temp, 0, readSize);var decryptedBytes decryptByPublicKey(publicKey, temp);outputStream.Write(decryptedBytes, 0, decryptedBytes.Length);}return Convert.ToBase64String(outputStream.ToArray());}}/// summary/// SHA1 加密返回大写字符串/// /summary/// param namecontent需要加密字符串/param/// returns返回40位UTF8 大写/returnspublic static string SHA1(string content){return SHA1(content, Encoding.UTF8);}/// summary/// SHA1 加密返回大写字符串/// /summary/// param namecontent需要加密字符串/param/// param nameencode指定加密编码/param/// returns返回40位大写字符串/returnsprivate static string SHA1(string content, Encoding encode){try{SHA1 sha1 new SHA1CryptoServiceProvider();byte[] bytes_in encode.GetBytes(content);byte[] bytes_out sha1.ComputeHash(bytes_in);sha1.Dispose();string result BitConverter.ToString(bytes_out);result result.Replace(-, );return result;}catch (Exception ex){throw new Exception(SHA1加密出错 ex.Message);}}/// summary/// 私钥加密/// 这个方法只能加密 私钥长度/8 -11 个字符分段加密的代码要自己处理了。/// /summary/// param nameprivateKey密钥/param/// param namedata要加密的数据/param/// returns/returnspublic static byte[] RsaPrivateEncrypt(string privateKey, byte[] data){string xmlPrivateKey privateKey;//加载私钥 RSACryptoServiceProvider privateRsa new RSACryptoServiceProvider();privateRsa.FromXmlString(xmlPrivateKey);//转换密钥 AsymmetricCipherKeyPair keyPair DotNetUtilities.GetKeyPair(privateRsa);//IBufferedCipher c CipherUtilities.GetCipher(RSA/ECB/PKCS1Padding);// 参数与Java中加密解密的参数一致 IBufferedCipher c CipherUtilities.GetCipher(RSA);c.Init(true, keyPair.Private); //第一个参数为true表示加密为false表示解密第二个参数表示密钥 byte[] DataToEncrypt data;byte[] outBytes c.DoFinal(DataToEncrypt);//加密 return outBytes;}/// summary/// 用公钥解密/// 这个方法只能加密 私钥长度/8 -11 个字符分段加密的代码要自己处理了。/// /summary/// param namedata/param/// param namekey/param/// returns/returnspublic static byte[] decryptByPublicKey(string publicKey, byte[] data){string xmlPublicKey publicKey;RSACryptoServiceProvider publicRsa new RSACryptoServiceProvider();publicRsa.FromXmlString(xmlPublicKey);AsymmetricKeyParameter keyPair DotNetUtilities.GetRsaPublicKey(publicRsa);//转换密钥 // AsymmetricCipherKeyPair keyPair DotNetUtilities.GetRsaKeyPair(publicRsa);//IBufferedCipher c CipherUtilities.GetCipher(RSA/ECB/PKCS1Padding);// 参数与Java中加密解密的参数一致 IBufferedCipher c CipherUtilities.GetCipher(RSA);c.Init(false, keyPair); //第一个参数为true表示加密为false表示解密第二个参数表示密钥 byte[] DataToEncrypt data;byte[] outBytes c.DoFinal(DataToEncrypt);//解密 return outBytes;}}/// summary/// AES /// /summarypublic class AESUtils{/// summary/// AES256加密/// /summary/// param namecontent明文/param/// param namepassphase密钥/param/// returns/returnspublic static string Encrypt(string content, string passphase){byte[] bytes Encoding.UTF8.GetBytes(content);byte[] key, iv, salt new byte[8];using (var rng new RNGCryptoServiceProvider()){rng.GetBytes(salt); }using (var md5 new MD5CryptoServiceProvider()){var preHash Encoding.UTF8.GetBytes(passphase).Concat(salt).ToArray();var bs1 md5.ComputeHash(preHash);var bs2 md5.ComputeHash(bs1.Concat(preHash).ToArray());var bs3 md5.ComputeHash(bs2.Concat(preHash).ToArray());key bs1.Concat(bs2).ToArray();iv bs3;}using (var aes new AesCryptoServiceProvider() { Key key, IV iv })using (var encryptor aes.CreateEncryptor()){var encryptedBytes encryptor.TransformFinalBlock(bytes, 0, bytes.Length);var concated Encoding.UTF8.GetBytes(Salted__).Concat(salt).Concat(encryptedBytes);return Convert.ToBase64String(concated.ToArray());}}/// summary/// AES256解密/// /summary/// param namecontent密文/param/// param namepassphase密钥/param/// returns/returnspublic static string Decrypt(string content, string passphase){// openssl aes-256-cbc -k 123456789 -md md5 -e -base64//byte[] bytes Convert.FromBase64String(content);byte[] key, iv, salt new byte[8], encryptedBytes new byte[bytes.Length - 8 - 8];//提取 saltArray.ConstrainedCopy(sourceArray: bytes,sourceIndex: 8, //剔除开头的 Salted__destinationArray: salt,destinationIndex: 0,length: salt.Length);//提取 encryptedBytesArray.ConstrainedCopy(sourceArray: bytes,sourceIndex: 8 8, //并剔除开头的 saltdestinationArray: encryptedBytes,destinationIndex: 0,length: encryptedBytes.Length);using (var md5 new MD5CryptoServiceProvider()){var preHash Encoding.UTF8.GetBytes(passphase).Concat(salt).ToArray();var bs1 md5.ComputeHash(preHash);var bs2 md5.ComputeHash(bs1.Concat(preHash).ToArray());var bs3 md5.ComputeHash(bs2.Concat(preHash).ToArray());key bs1.Concat(bs2).ToArray();iv bs3;}using (var aes new AesCryptoServiceProvider() { Key key, IV iv })using (var decryptor aes.CreateDecryptor()){byte[] decryptedBytes decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);return Encoding.UTF8.GetString(decryptedBytes);}}/// summary/// 加密 (新的思路)/// /summary/// param namecontent明文/param/// param namepassphase密码(固定32位)/param/// returns密文(base64)/returnsstatic string CryptoJsEncrypt_New(string content, string passphase ){byte[] bytes Encoding.UTF8.GetBytes(content);byte[] key Encoding.UTF8.GetBytes(passphase); //32位的keybyte[] iv new byte[16];using (var rng new RNGCryptoServiceProvider())rng.GetBytes(iv); // 产生16个字节的随机ivusing (var aes new AesCryptoServiceProvider() { Key key, IV iv })using (var encryptor aes.CreateEncryptor()){var encryptedBytes encryptor.TransformFinalBlock(bytes, 0, bytes.Length);var concated iv.Concat(encryptedBytes);return aes256: Convert.ToBase64String(concated.ToArray());}}/// summary/// 解密 (新的思路)/// /summary/// param namecontent密文(base64)/param/// param namepassphase密码(固定32位)/param/// returns明文/returnsstatic string CryptoJsDecrypt_New(string content, string passphase ){byte[] bytes Convert.FromBase64String(content.Substring(7)); //剔除开头的 aes256:byte[] key Encoding.UTF8.GetBytes(passphase); //32位的keybyte[] iv new byte[16];byte[] encryptedBytes new byte[bytes.Length - 16];//提取 ivArray.ConstrainedCopy(sourceArray: bytes,sourceIndex: 0,destinationArray: iv,destinationIndex: 0,length: iv.Length);//提取 加密结果Array.ConstrainedCopy(sourceArray: bytes,sourceIndex: 16, //并剔除开头的 ivdestinationArray: encryptedBytes,destinationIndex: 0,length: encryptedBytes.Length);using (var aes new AesCryptoServiceProvider() { Key key, IV iv })using (var decryptor aes.CreateDecryptor()){byte[] decryptedBytes decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);return Encoding.UTF8.GetString(decryptedBytes);}}}
http://www.dnsts.com.cn/news/226328.html

相关文章:

  • 怎么建公司网站账号网站翻译建设
  • 深圳做网站jm3q如何制作网页教程
  • 河南网站建设wordpress查询收录
  • 常熟专业网站建设企业的网站建设策划书
  • 南昌网站建设有限公司制作视频模板的软件
  • 定制型网站建设渠道珠海发布最新通告
  • 微网站app制作天津广告设计公司排名
  • 深圳做专业网站vue做直播网站
  • 宁波自适应网站建设优化建站wordpress评论 ajax
  • 厚街做网站公司凡科建站是不是关闭企业网站
  • 泉州最专业微信网站建设公司360如何做网站优化
  • 连云港网站关键词优化服务wordpress 主题小工具
  • 国内大型电子网站建设h5页面制作软件手机版
  • 公司网站建设费放什么科目建设网站哪些好
  • 河北邯郸怎么读青岛百度推广优化
  • 旅游商务网站建设广告联盟看广告赚钱
  • 柳州网站建设哪家公司好gta5网站显示建设中
  • 淘宝客一定要建立网站资阳房产网站建设
  • 顺德网站制作案例市场中国最好的建设网站
  • 灵山招聘网灵山英才网做灵山专业的招聘网站淮北论坛招聘最新消息
  • 宜昌网站制作公司排名亚马逊网站建设的目的
  • 东台网站制作公司怎么做可以看外国视频网站
  • 网站 利润wordpress你没有权限设置
  • 艾睿网站建设静安区网站建设
  • 济南做网站的高端品牌英语不行如何编程做网站
  • 机加工如何用网站开发客户粤嵌培训4个月收费
  • 企业电器网站建设方案河南城乡建设厅网站
  • 美乐乐网站首页如何修改洛阳做网站优化
  • 制作小程序的软件seo加wordpress工程师
  • iis怎么做ip网站吗加油站建设专业网站