mirror of
https://github.com/anjoy8/Blog.Core.git
synced 2024-09-20 23:48:27 +08:00
commit
622fb24de6
|
@ -185,11 +185,11 @@ namespace Blog.Core
|
|||
app.UseAuthentication();
|
||||
// 然后是授权中间件
|
||||
app.UseAuthorization();
|
||||
|
||||
//开启性能分析
|
||||
app.UseMiniProfilerMildd();
|
||||
// 开启异常中间件,要放到最后
|
||||
//app.UseExceptionHandlerMidd();
|
||||
// 性能分析
|
||||
app.UseMiniProfiler();
|
||||
|
||||
|
||||
app.UseEndpoints(endpoints =>
|
||||
{
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"urls": "http://*:8081",//web服务端口
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information", //加入Default否则log4net本地写入不了日志
|
||||
|
@ -149,6 +150,9 @@
|
|||
},
|
||||
"RedisMq": {
|
||||
"Enabled": false //redis 消息队列
|
||||
},
|
||||
"MiniProfiler": {
|
||||
"Enabled": false //性能分析开启
|
||||
}
|
||||
},
|
||||
"Middleware": {
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="5.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" />
|
||||
<PackageReference Include="RestSharp" Version="106.11.7" />
|
||||
<PackageReference Include="RSAExtensions" Version="1.0.3" />
|
||||
<PackageReference Include="StackExchange.Redis" Version="2.1.58" />
|
||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.8.0" />
|
||||
|
||||
|
|
527
Blog.Core.Common/Helper/CCBPayUtil.cs
Normal file
527
Blog.Core.Common/Helper/CCBPayUtil.cs
Normal file
|
@ -0,0 +1,527 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
|
||||
namespace Blog.Core.Common
|
||||
{
|
||||
/// <summary>
|
||||
/// 建行支付助手(根据官方提供的dll反编译过来的)
|
||||
/// </summary>
|
||||
public class CCBPayUtil
|
||||
{
|
||||
// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
|
||||
public string makeCCBParam(string param, string pubkey)
|
||||
{
|
||||
string text = this.dicSort(param);
|
||||
text += this.MD5KEY;
|
||||
string str = new MessageDigest_MD5().Md5_32(text);
|
||||
param = param + "&SIGN=" + str;
|
||||
if (pubkey.Length >= 30)
|
||||
{
|
||||
pubkey = pubkey.Substring(pubkey.Length - 30);
|
||||
}
|
||||
if (pubkey.Length >= 8)
|
||||
{
|
||||
pubkey = pubkey.Substring(0, 8);
|
||||
}
|
||||
string text2 = new DES_ENCRY_DECRY().doEncrypt(param, pubkey);
|
||||
text2 = text2.Replace("+", ",");
|
||||
return HttpUtility.UrlEncode(text2, Encoding.GetEncoding("ISO-8859-1"));
|
||||
}
|
||||
|
||||
// Token: 0x06000002 RID: 2 RVA: 0x00002104 File Offset: 0x00000304
|
||||
public bool verifyNotifySign(string src, string sign, string pubKey)
|
||||
{
|
||||
return new RSASign().verifySigature(src, sign, pubKey);
|
||||
}
|
||||
|
||||
// Token: 0x06000003 RID: 3 RVA: 0x00002124 File Offset: 0x00000324
|
||||
private string dicSort(string param)
|
||||
{
|
||||
return this.GetSignContent(this.strToMap(param));
|
||||
}
|
||||
|
||||
// Token: 0x06000004 RID: 4 RVA: 0x00002144 File Offset: 0x00000344
|
||||
private IDictionary<string, string> strToMap(string param)
|
||||
{
|
||||
IDictionary<string, string> dictionary = new Dictionary<string, string>();
|
||||
string[] array = param.Split(new char[]
|
||||
{
|
||||
'&'
|
||||
});
|
||||
for (int i = 0; i < array.Length; i++)
|
||||
{
|
||||
if (!"".Equals(array[i]))
|
||||
{
|
||||
string[] array2 = array[i].Split(new char[]
|
||||
{
|
||||
'='
|
||||
});
|
||||
if (array2.Length == 1)
|
||||
{
|
||||
dictionary.Add(array2[0], "");
|
||||
}
|
||||
else
|
||||
{
|
||||
dictionary.Add(array2[0], array2[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
|
||||
// Token: 0x06000005 RID: 5 RVA: 0x000021F0 File Offset: 0x000003F0
|
||||
private string GetSignContent(IDictionary<string, string> parameters)
|
||||
{
|
||||
IDictionary<string, string> dictionary = new SortedDictionary<string, string>(parameters);
|
||||
IEnumerator<KeyValuePair<string, string>> enumerator = dictionary.GetEnumerator();
|
||||
StringBuilder stringBuilder = new StringBuilder("");
|
||||
while (enumerator.MoveNext())
|
||||
{
|
||||
KeyValuePair<string, string> keyValuePair = enumerator.Current;
|
||||
string key = keyValuePair.Key;
|
||||
keyValuePair = enumerator.Current;
|
||||
string value = keyValuePair.Value;
|
||||
if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
|
||||
{
|
||||
stringBuilder.Append(key).Append("=").Append(value).Append("&");
|
||||
}
|
||||
}
|
||||
return stringBuilder.ToString().Substring(0, stringBuilder.Length - 1);
|
||||
}
|
||||
|
||||
// Token: 0x04000001 RID: 1
|
||||
private string VERSION = "1.0.0";
|
||||
|
||||
// Token: 0x04000002 RID: 2
|
||||
private string MD5KEY = "20120315201809041004";
|
||||
}
|
||||
internal class RSASign
|
||||
{
|
||||
// Token: 0x06000007 RID: 7 RVA: 0x000022C4 File Offset: 0x000004C4
|
||||
protected internal bool verifySigature(string signContent, string sign, string pubKey)
|
||||
{
|
||||
byte[] inArray = this.hexStrToBytes(pubKey);
|
||||
pubKey = Convert.ToBase64String(inArray);
|
||||
string text = "-----BEGIN PUBLIC KEY-----\r\n";
|
||||
text += pubKey;
|
||||
text += "-----END PUBLIC KEY-----\r\n\r\n";
|
||||
byte[] sign2 = this.hexStrToBytes(sign);
|
||||
byte[] bytes = Encoding.GetEncoding(RSASign.DEFAULT_CHARSET).GetBytes(signContent);
|
||||
return this.RSACheckContent(bytes, sign2, text, "MD5");
|
||||
}
|
||||
|
||||
// Token: 0x06000008 RID: 8 RVA: 0x00002330 File Offset: 0x00000530
|
||||
private bool RSACheckContent(byte[] signContent, byte[] sign, string publicKeyPem, string signType)
|
||||
{
|
||||
bool result;
|
||||
try
|
||||
{
|
||||
RSACryptoServiceProvider rsacryptoServiceProvider = new RSACryptoServiceProvider();
|
||||
rsacryptoServiceProvider.PersistKeyInCsp = false;
|
||||
RSACryptoServiceProviderExtension.LoadPublicKeyPEM(rsacryptoServiceProvider, publicKeyPem);
|
||||
bool flag = rsacryptoServiceProvider.VerifyData(signContent, signType, sign);
|
||||
result = flag;
|
||||
}
|
||||
catch
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Token: 0x06000009 RID: 9 RVA: 0x0000237C File Offset: 0x0000057C
|
||||
private byte[] hexStrToBytes(string s)
|
||||
{
|
||||
s = s.Replace(" ", "");
|
||||
if (s.Length % 2 != 0)
|
||||
{
|
||||
s += " ";
|
||||
}
|
||||
byte[] array = new byte[s.Length / 2];
|
||||
for (int i = 0; i < array.Length; i++)
|
||||
{
|
||||
array[i] = Convert.ToByte(s.Substring(i * 2, 2), 16);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
// Token: 0x04000003 RID: 3
|
||||
private static string DEFAULT_CHARSET = "GBK";
|
||||
}
|
||||
public class DES_ENCRY_DECRY
|
||||
{
|
||||
protected internal string doEncrypt(string param, string pubkey)
|
||||
{
|
||||
this.tdesKey = ((pubkey.Length > 8) ? pubkey.Substring(0, 8) : pubkey);
|
||||
byte[] bytes = this.DESEncrypt(this.UTF_16BE, param, this.ISO_8859_1, this.tdesKey);
|
||||
return this.Base64Encode(bytes);
|
||||
}
|
||||
|
||||
// Token: 0x0600001A RID: 26 RVA: 0x00002684 File Offset: 0x00000884
|
||||
protected internal string doDecrypt(string param, string pubkey)
|
||||
{
|
||||
this.tdesKey = ((pubkey.Length > 8) ? pubkey.Substring(0, 8) : pubkey);
|
||||
return this.DESDecrypt(this.UTF_16BE, param, this.ISO_8859_1, this.tdesKey);
|
||||
}
|
||||
|
||||
// Token: 0x0600001B RID: 27 RVA: 0x000026CC File Offset: 0x000008CC
|
||||
private byte[] DESEncrypt(string dataCharset, string data, string keyCharset, string key)
|
||||
{
|
||||
byte[] result;
|
||||
try
|
||||
{
|
||||
byte[] bytes = Encoding.GetEncoding(keyCharset).GetBytes(key);
|
||||
byte[] rgbIV = bytes;
|
||||
byte[] bytes2 = Encoding.GetEncoding(dataCharset).GetBytes(data);
|
||||
DESCryptoServiceProvider descryptoServiceProvider = new DESCryptoServiceProvider();
|
||||
descryptoServiceProvider.Mode = CipherMode.ECB;
|
||||
descryptoServiceProvider.Padding = PaddingMode.PKCS7;
|
||||
MemoryStream memoryStream = new MemoryStream();
|
||||
CryptoStream cryptoStream = new CryptoStream(memoryStream, descryptoServiceProvider.CreateEncryptor(bytes, rgbIV), CryptoStreamMode.Write);
|
||||
cryptoStream.Write(bytes2, 0, bytes2.Length);
|
||||
cryptoStream.FlushFinalBlock();
|
||||
result = memoryStream.ToArray();
|
||||
}
|
||||
catch
|
||||
{
|
||||
result = null;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Token: 0x0600001C RID: 28 RVA: 0x00002764 File Offset: 0x00000964
|
||||
private string DESDecrypt(string dataCharset, string data, string keyCoding, string key)
|
||||
{
|
||||
string result;
|
||||
try
|
||||
{
|
||||
byte[] bytes = Encoding.GetEncoding(keyCoding).GetBytes(key);
|
||||
byte[] rgbIV = bytes;
|
||||
byte[] array = this.Base64Decode(data);
|
||||
DESCryptoServiceProvider descryptoServiceProvider = new DESCryptoServiceProvider();
|
||||
descryptoServiceProvider.Mode = CipherMode.ECB;
|
||||
descryptoServiceProvider.Padding = PaddingMode.PKCS7;
|
||||
MemoryStream memoryStream = new MemoryStream();
|
||||
CryptoStream cryptoStream = new CryptoStream(memoryStream, descryptoServiceProvider.CreateDecryptor(bytes, rgbIV), CryptoStreamMode.Write);
|
||||
cryptoStream.Write(array, 0, array.Length);
|
||||
cryptoStream.FlushFinalBlock();
|
||||
result = Encoding.GetEncoding(dataCharset).GetString(memoryStream.ToArray());
|
||||
}
|
||||
catch
|
||||
{
|
||||
result = null;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Token: 0x0600001D RID: 29 RVA: 0x00002800 File Offset: 0x00000A00
|
||||
private string Base64Encode(byte[] bytes)
|
||||
{
|
||||
string result = string.Empty;
|
||||
try
|
||||
{
|
||||
result = Convert.ToBase64String(bytes);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Token: 0x0600001E RID: 30 RVA: 0x0000283C File Offset: 0x00000A3C
|
||||
private byte[] Base64Decode(string source)
|
||||
{
|
||||
byte[] result = null;
|
||||
try
|
||||
{
|
||||
result = Convert.FromBase64String(source);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Token: 0x04000031 RID: 49
|
||||
private string tdesKey = "12345678";
|
||||
|
||||
// Token: 0x04000032 RID: 50
|
||||
private string UTF_16BE = "utf-16BE";
|
||||
|
||||
// Token: 0x04000033 RID: 51
|
||||
private string ISO_8859_1 = "ISO-8859-1";
|
||||
}
|
||||
internal class MessageDigest_MD5
|
||||
{
|
||||
// Token: 0x06000020 RID: 32 RVA: 0x000028A0 File Offset: 0x00000AA0
|
||||
protected internal string Md5_32(string src)
|
||||
{
|
||||
MD5 md = new MD5CryptoServiceProvider();
|
||||
byte[] bytes = Encoding.UTF8.GetBytes(src);
|
||||
byte[] array = md.ComputeHash(bytes);
|
||||
string text = "";
|
||||
for (int i = 0; i < array.Length; i++)
|
||||
{
|
||||
text += array[i].ToString("x2");
|
||||
}
|
||||
return text;
|
||||
}
|
||||
}
|
||||
internal class RSACryptoServiceProviderExtension
|
||||
{
|
||||
// Token: 0x0600000C RID: 12 RVA: 0x00002408 File Offset: 0x00000608
|
||||
private static void LoadPublicKeyDER(RSACryptoServiceProvider provider, byte[] DERData)
|
||||
{
|
||||
byte[] rsafromDER = RSACryptoServiceProviderExtension.GetRSAFromDER(DERData);
|
||||
byte[] publicKeyBlobFromRSA = RSACryptoServiceProviderExtension.GetPublicKeyBlobFromRSA(rsafromDER);
|
||||
provider.ImportCspBlob(publicKeyBlobFromRSA);
|
||||
}
|
||||
|
||||
// Token: 0x0600000D RID: 13 RVA: 0x0000242C File Offset: 0x0000062C
|
||||
internal static void LoadPublicKeyPEM(RSACryptoServiceProvider provider, string sPEM)
|
||||
{
|
||||
byte[] derfromPEM = RSACryptoServiceProviderExtension.GetDERFromPEM(sPEM);
|
||||
RSACryptoServiceProviderExtension.LoadPublicKeyDER(provider, derfromPEM);
|
||||
}
|
||||
|
||||
// Token: 0x0600000E RID: 14 RVA: 0x0000244C File Offset: 0x0000064C
|
||||
private static byte[] GetPublicKeyBlobFromRSA(byte[] RSAData)
|
||||
{
|
||||
byte[] array = null;
|
||||
uint num = 0U;
|
||||
if (!RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(19), RSAData, (uint)RSAData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
|
||||
{
|
||||
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||
}
|
||||
array = new byte[num];
|
||||
if (!RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(19), RSAData, (uint)RSAData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
|
||||
{
|
||||
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
// Token: 0x0600000F RID: 15 RVA: 0x000024C4 File Offset: 0x000006C4
|
||||
internal static byte[] GetRSAFromDER(byte[] DERData)
|
||||
{
|
||||
byte[] array = null;
|
||||
byte[] array2 = null;
|
||||
uint num = 0U;
|
||||
IntPtr zero = IntPtr.Zero;
|
||||
if (!RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(8), DERData, (uint)DERData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
|
||||
{
|
||||
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||
}
|
||||
array = new byte[num];
|
||||
if (RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(8), DERData, (uint)DERData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
|
||||
{
|
||||
GCHandle gchandle = GCHandle.Alloc(array, GCHandleType.Pinned);
|
||||
try
|
||||
{
|
||||
RSACryptoServiceProviderExtension.CERT_PUBLIC_KEY_INFO cert_PUBLIC_KEY_INFO = (RSACryptoServiceProviderExtension.CERT_PUBLIC_KEY_INFO)Marshal.PtrToStructure(gchandle.AddrOfPinnedObject(), typeof(RSACryptoServiceProviderExtension.CERT_PUBLIC_KEY_INFO));
|
||||
array2 = new byte[cert_PUBLIC_KEY_INFO.PublicKey.cbData];
|
||||
Marshal.Copy(cert_PUBLIC_KEY_INFO.PublicKey.pbData, array2, 0, array2.Length);
|
||||
}
|
||||
finally
|
||||
{
|
||||
gchandle.Free();
|
||||
}
|
||||
return array2;
|
||||
}
|
||||
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||
}
|
||||
|
||||
// Token: 0x06000010 RID: 16 RVA: 0x000025C0 File Offset: 0x000007C0
|
||||
internal static byte[] GetDERFromPEM(string sPEM)
|
||||
{
|
||||
uint num = 0U;
|
||||
uint num2;
|
||||
uint num3;
|
||||
if (!RSACryptoServiceProviderExtension.CryptStringToBinary(sPEM, (uint)sPEM.Length, RSACryptoServiceProviderExtension.CRYPT_STRING_FLAGS.CRYPT_STRING_BASE64HEADER, null, ref num, out num2, out num3))
|
||||
{
|
||||
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||
}
|
||||
byte[] array = new byte[num];
|
||||
if (!RSACryptoServiceProviderExtension.CryptStringToBinary(sPEM, (uint)sPEM.Length, RSACryptoServiceProviderExtension.CRYPT_STRING_FLAGS.CRYPT_STRING_BASE64HEADER, array, ref num, out num2, out num3))
|
||||
{
|
||||
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
// Token: 0x06000011 RID: 17
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
internal static extern bool CryptDestroyKey(IntPtr hKey);
|
||||
|
||||
// Token: 0x06000012 RID: 18
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
internal static extern bool CryptImportKey(IntPtr hProv, byte[] pbKeyData, uint dwDataLen, IntPtr hPubKey, uint dwFlags, ref IntPtr hKey);
|
||||
|
||||
// Token: 0x06000013 RID: 19
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
internal static extern bool CryptReleaseContext(IntPtr hProv, int dwFlags);
|
||||
|
||||
// Token: 0x06000014 RID: 20
|
||||
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
internal static extern bool CryptAcquireContext(ref IntPtr hProv, string pszContainer, string pszProvider, RSACryptoServiceProviderExtension.CRYPT_PROVIDER_TYPE dwProvType, RSACryptoServiceProviderExtension.CRYPT_ACQUIRE_CONTEXT_FLAGS dwFlags);
|
||||
|
||||
// Token: 0x06000015 RID: 21
|
||||
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
internal static extern bool CryptStringToBinary(string sPEM, uint sPEMLength, RSACryptoServiceProviderExtension.CRYPT_STRING_FLAGS dwFlags, [Out] byte[] pbBinary, ref uint pcbBinary, out uint pdwSkip, out uint pdwFlags);
|
||||
|
||||
// Token: 0x06000016 RID: 22
|
||||
[DllImport("crypt32.dll", SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
internal static extern bool CryptDecodeObjectEx(RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS dwCertEncodingType, IntPtr lpszStructType, byte[] pbEncoded, uint cbEncoded, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS dwFlags, IntPtr pDecodePara, ref byte[] pvStructInfo, ref uint pcbStructInfo);
|
||||
|
||||
// Token: 0x06000017 RID: 23
|
||||
[DllImport("crypt32.dll", SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
internal static extern bool CryptDecodeObject(RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS dwCertEncodingType, IntPtr lpszStructType, byte[] pbEncoded, uint cbEncoded, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS flags, [In][Out] byte[] pvStructInfo, ref uint cbStructInfo);
|
||||
|
||||
// Token: 0x02000005 RID: 5
|
||||
internal enum CRYPT_ACQUIRE_CONTEXT_FLAGS : uint
|
||||
{
|
||||
// Token: 0x04000005 RID: 5
|
||||
CRYPT_NEWKEYSET = 8U,
|
||||
// Token: 0x04000006 RID: 6
|
||||
CRYPT_DELETEKEYSET = 16U,
|
||||
// Token: 0x04000007 RID: 7
|
||||
CRYPT_MACHINE_KEYSET = 32U,
|
||||
// Token: 0x04000008 RID: 8
|
||||
CRYPT_SILENT = 64U,
|
||||
// Token: 0x04000009 RID: 9
|
||||
CRYPT_DEFAULT_CONTAINER_OPTIONAL = 128U,
|
||||
// Token: 0x0400000A RID: 10
|
||||
CRYPT_VERIFYCONTEXT = 4026531840U
|
||||
}
|
||||
|
||||
// Token: 0x02000006 RID: 6
|
||||
internal enum CRYPT_PROVIDER_TYPE : uint
|
||||
{
|
||||
// Token: 0x0400000C RID: 12
|
||||
PROV_RSA_FULL = 1U
|
||||
}
|
||||
|
||||
// Token: 0x02000007 RID: 7
|
||||
internal enum CRYPT_DECODE_FLAGS : uint
|
||||
{
|
||||
// Token: 0x0400000E RID: 14
|
||||
NONE,
|
||||
// Token: 0x0400000F RID: 15
|
||||
CRYPT_DECODE_ALLOC_FLAG = 32768U
|
||||
}
|
||||
|
||||
// Token: 0x02000008 RID: 8
|
||||
internal enum CRYPT_ENCODING_FLAGS : uint
|
||||
{
|
||||
// Token: 0x04000011 RID: 17
|
||||
PKCS_7_ASN_ENCODING = 65536U,
|
||||
// Token: 0x04000012 RID: 18
|
||||
X509_ASN_ENCODING = 1U
|
||||
}
|
||||
|
||||
// Token: 0x02000009 RID: 9
|
||||
internal enum CRYPT_OUTPUT_TYPES
|
||||
{
|
||||
// Token: 0x04000014 RID: 20
|
||||
X509_PUBLIC_KEY_INFO = 8,
|
||||
// Token: 0x04000015 RID: 21
|
||||
RSA_CSP_PUBLICKEYBLOB = 19,
|
||||
// Token: 0x04000016 RID: 22
|
||||
PKCS_RSA_PRIVATE_KEY = 43,
|
||||
// Token: 0x04000017 RID: 23
|
||||
PKCS_PRIVATE_KEY_INFO
|
||||
}
|
||||
|
||||
// Token: 0x0200000A RID: 10
|
||||
internal enum CRYPT_STRING_FLAGS : uint
|
||||
{
|
||||
// Token: 0x04000019 RID: 25
|
||||
CRYPT_STRING_BASE64HEADER,
|
||||
// Token: 0x0400001A RID: 26
|
||||
CRYPT_STRING_BASE64,
|
||||
// Token: 0x0400001B RID: 27
|
||||
CRYPT_STRING_BINARY,
|
||||
// Token: 0x0400001C RID: 28
|
||||
CRYPT_STRING_BASE64REQUESTHEADER,
|
||||
// Token: 0x0400001D RID: 29
|
||||
CRYPT_STRING_HEX,
|
||||
// Token: 0x0400001E RID: 30
|
||||
CRYPT_STRING_HEXASCII,
|
||||
// Token: 0x0400001F RID: 31
|
||||
CRYPT_STRING_BASE64_ANY,
|
||||
// Token: 0x04000020 RID: 32
|
||||
CRYPT_STRING_ANY,
|
||||
// Token: 0x04000021 RID: 33
|
||||
CRYPT_STRING_HEX_ANY,
|
||||
// Token: 0x04000022 RID: 34
|
||||
CRYPT_STRING_BASE64X509CRLHEADER,
|
||||
// Token: 0x04000023 RID: 35
|
||||
CRYPT_STRING_HEXADDR,
|
||||
// Token: 0x04000024 RID: 36
|
||||
CRYPT_STRING_HEXASCIIADDR,
|
||||
// Token: 0x04000025 RID: 37
|
||||
CRYPT_STRING_HEXRAW,
|
||||
// Token: 0x04000026 RID: 38
|
||||
CRYPT_STRING_NOCRLF = 1073741824U,
|
||||
// Token: 0x04000027 RID: 39
|
||||
CRYPT_STRING_NOCR = 2147483648U
|
||||
}
|
||||
|
||||
// Token: 0x0200000B RID: 11
|
||||
internal struct CRYPT_OBJID_BLOB
|
||||
{
|
||||
// Token: 0x04000028 RID: 40
|
||||
internal uint cbData;
|
||||
|
||||
// Token: 0x04000029 RID: 41
|
||||
internal IntPtr pbData;
|
||||
}
|
||||
|
||||
// Token: 0x0200000C RID: 12
|
||||
internal struct CRYPT_ALGORITHM_IDENTIFIER
|
||||
{
|
||||
// Token: 0x0400002A RID: 42
|
||||
internal IntPtr pszObjId;
|
||||
|
||||
// Token: 0x0400002B RID: 43
|
||||
internal RSACryptoServiceProviderExtension.CRYPT_OBJID_BLOB Parameters;
|
||||
}
|
||||
|
||||
// Token: 0x0200000D RID: 13
|
||||
private struct CRYPT_BIT_BLOB
|
||||
{
|
||||
// Token: 0x0400002C RID: 44
|
||||
internal uint cbData;
|
||||
|
||||
// Token: 0x0400002D RID: 45
|
||||
internal IntPtr pbData;
|
||||
|
||||
// Token: 0x0400002E RID: 46
|
||||
internal uint cUnusedBits;
|
||||
}
|
||||
|
||||
// Token: 0x0200000E RID: 14
|
||||
private struct CERT_PUBLIC_KEY_INFO
|
||||
{
|
||||
// Token: 0x0400002F RID: 47
|
||||
internal RSACryptoServiceProviderExtension.CRYPT_ALGORITHM_IDENTIFIER Algorithm;
|
||||
|
||||
// Token: 0x04000030 RID: 48
|
||||
internal RSACryptoServiceProviderExtension.CRYPT_BIT_BLOB PublicKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,20 +1,18 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Blog.Core.Common.Helper
|
||||
{
|
||||
/// <summary>
|
||||
/// RSA加解密 使用OpenSSL的公钥加密/私钥解密
|
||||
/// RSA加解密 使用OpenSSL的公钥加密/私钥解密
|
||||
/// 公私钥请使用openssl生成
|
||||
/// </summary>
|
||||
public class RSAHelper
|
||||
{
|
||||
private readonly RSA _privateKeyRsaProvider;
|
||||
private readonly RSA _publicKeyRsaProvider;
|
||||
public readonly RSA _privateKeyRsaProvider;
|
||||
public readonly RSA _publicKeyRsaProvider;
|
||||
private readonly HashAlgorithmName _hashAlgorithmName;
|
||||
private readonly Encoding _encoding;
|
||||
|
||||
|
@ -59,10 +57,10 @@ namespace Blog.Core.Common.Helper
|
|||
|
||||
#endregion
|
||||
|
||||
#region 使用公钥验证签名
|
||||
#region 使用公钥验签
|
||||
|
||||
/// <summary>
|
||||
/// 使用公钥验证签名
|
||||
/// 使用公钥验签
|
||||
/// </summary>
|
||||
/// <param name="data">原始数据</param>
|
||||
/// <param name="sign">签名</param>
|
||||
|
@ -80,34 +78,105 @@ namespace Blog.Core.Common.Helper
|
|||
#endregion
|
||||
|
||||
#region 解密
|
||||
/// <summary>
|
||||
/// 私钥解密(原)
|
||||
/// </summary>
|
||||
/// <param name="cipherText">解密字符串(base64)</param>
|
||||
/// <returns></returns>
|
||||
|
||||
//public string Decrypt(string cipherText)
|
||||
//{
|
||||
// if (_privateKeyRsaProvider == null)
|
||||
// {
|
||||
// throw new Exception("_privateKeyRsaProvider is null");
|
||||
// }
|
||||
// return _encoding.GetString(_privateKeyRsaProvider.Decrypt(Convert.FromBase64String(cipherText), RSAEncryptionPadding.Pkcs1));
|
||||
//}
|
||||
/// <summary>
|
||||
/// 私钥解密(支持大量数据)
|
||||
/// </summary>
|
||||
/// <param name="cipherText"></param>
|
||||
/// <returns></returns>
|
||||
public string Decrypt(string cipherText)
|
||||
{
|
||||
if (_privateKeyRsaProvider == null)
|
||||
{
|
||||
throw new Exception("_privateKeyRsaProvider is null");
|
||||
}
|
||||
var bufferSize = (_privateKeyRsaProvider.KeySize / 8);
|
||||
byte[] buffer = new byte[bufferSize];//待解密块
|
||||
using (MemoryStream msInput = new MemoryStream(Convert.FromBase64String(cipherText)))
|
||||
{
|
||||
using (MemoryStream msOutput = new MemoryStream())
|
||||
{
|
||||
int readLen; while ((readLen = msInput.Read(buffer, 0, bufferSize)) > 0)
|
||||
{
|
||||
byte[] dataToEnc = new byte[readLen];
|
||||
Array.Copy(buffer, 0, dataToEnc, 0, readLen); byte[] encData = _privateKeyRsaProvider.Decrypt(dataToEnc, RSAEncryptionPadding.Pkcs1);
|
||||
msOutput.Write(encData, 0, encData.Length);
|
||||
}
|
||||
byte[] result = msOutput.ToArray();
|
||||
return _encoding.GetString(result);
|
||||
}
|
||||
}
|
||||
return Encoding.UTF8.GetString(_privateKeyRsaProvider.Decrypt(Convert.FromBase64String(cipherText), RSAEncryptionPadding.Pkcs1));
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 加密
|
||||
|
||||
/// <summary>
|
||||
/// 公钥加密(原)
|
||||
/// </summary>
|
||||
/// <param name="text"></param>
|
||||
/// <returns></returns>
|
||||
//public string Encrypt(string text)
|
||||
//{
|
||||
// if (_publicKeyRsaProvider == null)
|
||||
// {
|
||||
// throw new Exception("_publicKeyRsaProvider is null");
|
||||
// }
|
||||
// return Convert.ToBase64String(_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.Pkcs1));
|
||||
//}
|
||||
/// <summary>
|
||||
/// 公钥加密(支持大量数据)
|
||||
/// </summary>
|
||||
/// <param name="text"></param>
|
||||
/// <returns></returns>
|
||||
public string Encrypt(string text)
|
||||
{
|
||||
if (_publicKeyRsaProvider == null)
|
||||
{
|
||||
throw new Exception("_publicKeyRsaProvider is null");
|
||||
}
|
||||
var bufferSize = (_publicKeyRsaProvider.KeySize / 8 - 11);
|
||||
byte[] buffer = new byte[bufferSize];//待加密块
|
||||
|
||||
using (MemoryStream msInput = new MemoryStream(_encoding.GetBytes(text)))
|
||||
{
|
||||
using (MemoryStream msOutput = new MemoryStream())
|
||||
{
|
||||
int readLen; while ((readLen = msInput.Read(buffer, 0, bufferSize)) > 0)
|
||||
{
|
||||
byte[] dataToEnc = new byte[readLen];
|
||||
Array.Copy(buffer, 0, dataToEnc, 0, readLen); byte[] encData = _publicKeyRsaProvider.Encrypt(dataToEnc, RSAEncryptionPadding.Pkcs1);
|
||||
msOutput.Write(encData, 0, encData.Length);
|
||||
}
|
||||
byte[] result = msOutput.ToArray();
|
||||
return Convert.ToBase64String(result);
|
||||
}
|
||||
}
|
||||
return Convert.ToBase64String(_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.Pkcs1));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 使用私钥创建RSA实例
|
||||
|
||||
public RSA CreateRsaProviderFromPrivateKey(string privateKey)
|
||||
/// <summary>
|
||||
/// 使用私钥创建RSA实例
|
||||
/// </summary>
|
||||
/// <param name="privateKey"></param>
|
||||
/// <returns></returns>
|
||||
private RSA CreateRsaProviderFromPrivateKey(string privateKey)
|
||||
{
|
||||
var privateKeyBits = Convert.FromBase64String(privateKey);
|
||||
|
||||
|
@ -151,7 +220,11 @@ namespace Blog.Core.Common.Helper
|
|||
#endregion
|
||||
|
||||
#region 使用公钥创建RSA实例
|
||||
|
||||
/// <summary>
|
||||
/// 使用公钥创建RSA实例
|
||||
/// </summary>
|
||||
/// <param name="publicKeyString"></param>
|
||||
/// <returns></returns>
|
||||
public RSA CreateRsaProviderFromPublicKey(string publicKeyString)
|
||||
{
|
||||
// encoded OID sequence for PKCS #1 rsaEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1"
|
||||
|
@ -296,48 +369,13 @@ namespace Blog.Core.Common.Helper
|
|||
}
|
||||
|
||||
#endregion
|
||||
#region 测试
|
||||
public void test() {
|
||||
//2048 公钥
|
||||
string publicKey =
|
||||
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoQh0wEqx/R2H1v00IU12Oc30fosRC/frhH89L6G+fzeaqI19MYQhEPMU13wpeqRONCUta+2iC1sgCNQ9qGGf19yGdZUfueaB1Nu9rdueQKXgVurGHJ+5N71UFm+OP1XcnFUCK4wT5d7ZIifXxuqLehP9Ts6sNjhVfa+yU+VjF5HoIe69OJEPo7OxRZcRTe17khc93Ic+PfyqswQJJlY/bgpcLJQnM+QuHmxNtF7/FpAx9YEQsShsGpVo7JaKgLo+s6AFoJ4QldQKir2vbN9vcKRbG3piElPilWDpjXQkOJZhUloh/jd7QrKFimZFldJ1r6Q59QYUyGKZARUe0KZpMQIDAQAB";
|
||||
//2048 私钥
|
||||
string privateKey =
|
||||
"MIIEpAIBAAKCAQEAoQh0wEqx/R2H1v00IU12Oc30fosRC/frhH89L6G+fzeaqI19MYQhEPMU13wpeqRONCUta+2iC1sgCNQ9qGGf19yGdZUfueaB1Nu9rdueQKXgVurGHJ+5N71UFm+OP1XcnFUCK4wT5d7ZIifXxuqLehP9Ts6sNjhVfa+yU+VjF5HoIe69OJEPo7OxRZcRTe17khc93Ic+PfyqswQJJlY/bgpcLJQnM+QuHmxNtF7/FpAx9YEQsShsGpVo7JaKgLo+s6AFoJ4QldQKir2vbN9vcKRbG3piElPilWDpjXQkOJZhUloh/jd7QrKFimZFldJ1r6Q59QYUyGKZARUe0KZpMQIDAQABAoIBAQCRZLUlOUvjIVqYvhznRK1OG6p45s8JY1r+UnPIId2Bt46oSLeUkZvZVeCnfq9k0Bzb8AVGwVPhtPEDh73z3dEYcT/lwjLXAkyPB6gG5ZfI/vvC/k7JYV01+neFmktw2/FIJWjEMMF2dvLNZ/Pm4bX1Dz9SfD/45Hwr8wqrvRzvFZsj5qqOxv9RPAudOYwCwZskKp/GF+L+3Ycod1Wu98imzMZUH+L5dQuDGg3kvf3ljIAegTPoqYBg0imNPYY/EGoFKnbxlK5S5/5uAFb16dGJqAz3XQCz9Is/IWrOTu0etteqV2Ncs8uqPdjed+b0j8CMsr4U1xjwPQ8WwdaJtTkRAoGBANAndgiGZkCVcc9975/AYdgFp35W6D+hGQAZlL6DmnucUFdXbWa/x2rTSEXlkvgk9X/PxOptUYsLJkzysTgfDywZwuIXLm9B3oNmv3bVgPXsgDsvDfaHYCgz0nHK6NSrX2AeX3yO/dFuoZsuk+J+UyRigMqYj0wjmxUlqj183hinAoGBAMYMOBgF77OXRII7GAuEut/nBeh2sBrgyzR7FmJMs5kvRh6Ck8wp3ysgMvX4lxh1ep8iCw1R2cguqNATr1klOdsCTOE9RrhuvOp3JrYzuIAK6MpH/uBICy4w1rW2+gQySsHcH40r+tNaTFQ7dQ1tef//iy/IW8v8i0t+csztE1JnAoGABdtWYt8FOYP688+jUmdjWWSvVcq0NjYeMfaGTOX/DsNTL2HyXhW/Uq4nNnBDNmAz2CjMbZwt0y+5ICkj+2REVQVUinAEinTcAe5+LKXNPx4sbX3hcrJUbk0m+rSu4G0B/f5cyXBsi9wFCAzDdHgBduCepxSr04Sc9Hde1uQQi7kCgYB0U20HP0Vh+TG2RLuE2HtjVDD2L/CUeQEiXEHzjxXWnhvTg+MIAnggvpLwQwmMxkQ2ACr5sd/3YuCpB0bxV5o594nsqq9FWVYBaecFEjAGlWHSnqMoXWijwu/6X/VOTbP3VjH6G6ECT4GR4DKKpokIQrMgZ9DzaezvdOA9WesFdQKBgQCWfeOQTitRJ0NZACFUn3Fs3Rvgc9eN9YSWj4RtqkmGPMPvguWo+SKhlk3IbYjrRBc5WVOdoX8JXb2/+nAGhPCuUZckWVmZe5pMSr4EkNQdYeY8kOXGSjoTOUH34ZdKeS+e399BkBWIiXUejX/Srln0H4KoHnTWgxwNpTsBCgXu8Q==";
|
||||
|
||||
var rsa = new RSAHelper(RSAType.RSA2, Encoding.UTF8, privateKey, publicKey);
|
||||
}
|
||||
|
||||
string str = "博客园 http://www.cnblogs.com/";
|
||||
|
||||
Console.WriteLine("原始字符串:" + str);
|
||||
|
||||
//加密
|
||||
string enStr = rsa.Encrypt(str);
|
||||
|
||||
Console.WriteLine("加密字符串:" + enStr);
|
||||
|
||||
//解密
|
||||
string deStr = rsa.Decrypt(enStr);
|
||||
|
||||
Console.WriteLine("解密字符串:" + deStr);
|
||||
|
||||
//私钥签名
|
||||
string signStr = rsa.Sign(str);
|
||||
|
||||
Console.WriteLine("字符串签名:" + signStr);
|
||||
|
||||
//公钥验证签名
|
||||
bool signVerify = rsa.Verify(str, signStr);
|
||||
|
||||
Console.WriteLine("验证签名:" + signVerify);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// RSA算法类型
|
||||
/// </summary>
|
||||
public enum RSAType
|
||||
/// <summary>
|
||||
/// RSA算法类型
|
||||
/// </summary>
|
||||
public enum RSAType
|
||||
{
|
||||
/// <summary>
|
||||
/// SHA1
|
||||
|
|
385
Blog.Core.Common/Helper/RSAHelperExtend.cs
Normal file
385
Blog.Core.Common/Helper/RSAHelperExtend.cs
Normal file
|
@ -0,0 +1,385 @@
|
|||
using Org.BouncyCastle.Asn1.Pkcs;
|
||||
using Org.BouncyCastle.Asn1.X509;
|
||||
using Org.BouncyCastle.Crypto;
|
||||
using Org.BouncyCastle.Crypto.Parameters;
|
||||
using Org.BouncyCastle.Math;
|
||||
using Org.BouncyCastle.Pkcs;
|
||||
using Org.BouncyCastle.Security;
|
||||
using Org.BouncyCastle.X509;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
namespace Blog.Core.Common.Helper
|
||||
{
|
||||
/// <summary>
|
||||
/// RSA加解密 使用OpenSSL的私钥加密/公钥解密 (一般不用)
|
||||
/// 公私钥请使用openssl生成
|
||||
/// </summary>
|
||||
public class RSAHelperExtend
|
||||
{
|
||||
/// <summary>
|
||||
/// 生成公钥与私钥方法
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string[] CreateKey(KeyType keyType)
|
||||
{
|
||||
string[] sKeys = new String[2];
|
||||
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
|
||||
switch (keyType)
|
||||
{
|
||||
case KeyType.XML:
|
||||
{
|
||||
//私钥
|
||||
sKeys[0] = rsa.ToXmlString(true);
|
||||
//公钥
|
||||
sKeys[1] = rsa.ToXmlString(false);
|
||||
}
|
||||
break;
|
||||
case KeyType.PKS8:
|
||||
{
|
||||
//JAVA私钥
|
||||
sKeys[0] = RSAPrivateKeyDotNet2Java(sKeys[0]);
|
||||
//JAVA公钥
|
||||
sKeys[1] = RSAPublicKeyDotNet2Java(sKeys[1]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return sKeys;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 密钥类型
|
||||
/// </summary>
|
||||
public enum KeyType
|
||||
{
|
||||
/// <summary>
|
||||
/// xml类型
|
||||
/// </summary>
|
||||
XML,
|
||||
|
||||
/// <summary>
|
||||
/// pks8类型
|
||||
/// </summary>
|
||||
PKS8
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// RSA私钥格式转换,.net->java
|
||||
/// </summary>
|
||||
/// <param name="privateKey">.net生成的私钥</param>
|
||||
/// <returns></returns>
|
||||
public static string RSAPrivateKeyDotNet2Java(string privateKey)
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
doc.LoadXml(privateKey);
|
||||
BigInteger m = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
|
||||
BigInteger exp = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
|
||||
BigInteger d = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));
|
||||
BigInteger p = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));
|
||||
BigInteger q = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));
|
||||
BigInteger dp = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));
|
||||
BigInteger dq = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));
|
||||
BigInteger qinv = new BigInteger(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公钥格式转换,.net->java
|
||||
/// </summary>
|
||||
/// <param name="publicKey">.net生成的公钥</param>
|
||||
/// <returns></returns>
|
||||
public static string RSAPublicKeyDotNet2Java(string publicKey)
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
doc.LoadXml(publicKey);
|
||||
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>
|
||||
/// RSA私钥格式转换,java->.net
|
||||
/// </summary>
|
||||
/// <param name="privateKey">java生成的RSA私钥</param>
|
||||
/// <returns></returns>
|
||||
public static string RSAPrivateKeyJavaToDotNet(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 RSAPublicKeyJavaToDotNet(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>
|
||||
/// 最大加密长度
|
||||
/// </summary>
|
||||
private static int MAX_ENCRYPT_BLOCK = 245;
|
||||
|
||||
/// <summary>
|
||||
/// 最大解密长度
|
||||
/// </summary>
|
||||
private static int MAX_DECRYPT_BLOCK = 256;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 用私钥给数据进行RSA加密
|
||||
/// </summary>
|
||||
/// <param name="xmlPrivateKey"></param>
|
||||
/// <param name="strEncryptString"></param>
|
||||
/// <returns></returns>
|
||||
public static string PrivateKeyEncrypt(string xmlPrivateKey, string strEncryptString)
|
||||
{
|
||||
|
||||
RSAHelper rs = new RSAHelper(RSAType.RSA, Encoding.UTF8, xmlPrivateKey);
|
||||
var xml = rs._privateKeyRsaProvider.ToXmlString(true);
|
||||
MAX_ENCRYPT_BLOCK = rs._privateKeyRsaProvider.KeySize / 8 - 11;
|
||||
//加载私钥
|
||||
RSACryptoServiceProvider privateRsa = new RSACryptoServiceProvider();
|
||||
privateRsa.FromXmlString(xml);
|
||||
|
||||
//转换密钥
|
||||
AsymmetricCipherKeyPair keyPair = DotNetUtilities.GetKeyPair(privateRsa);
|
||||
IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding"); //使用RSA/ECB/PKCS1Padding格式
|
||||
|
||||
c.Init(true, keyPair.Private);//第一个参数为true表示加密,为false表示解密;第二个参数表示密钥
|
||||
byte[] DataToEncrypt = Encoding.UTF8.GetBytes(strEncryptString);//获取字节
|
||||
|
||||
byte[] cache;
|
||||
int time = 0;//次数
|
||||
int inputLen = DataToEncrypt.Length;
|
||||
int offSet = 0;
|
||||
using (MemoryStream outStream = new MemoryStream())
|
||||
{
|
||||
while (inputLen - offSet > 0)
|
||||
{
|
||||
if (inputLen - offSet > MAX_ENCRYPT_BLOCK)
|
||||
{
|
||||
cache = c.DoFinal(DataToEncrypt, offSet, MAX_ENCRYPT_BLOCK);
|
||||
}
|
||||
else
|
||||
{
|
||||
cache = c.DoFinal(DataToEncrypt, offSet, inputLen - offSet);
|
||||
}
|
||||
//写入
|
||||
outStream.Write(cache, 0, cache.Length);
|
||||
|
||||
time++;
|
||||
offSet = time * MAX_ENCRYPT_BLOCK;
|
||||
}
|
||||
byte[] resData = outStream.ToArray();
|
||||
|
||||
string strBase64 = Convert.ToBase64String(resData);
|
||||
return strBase64;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用公钥给数据进行RSA解密
|
||||
/// </summary>
|
||||
/// <param name="xmlPublicKey"> 公钥(XML格式字符串) </param>
|
||||
/// <param name="strDecryptString"> 要解密数据 </param>
|
||||
/// <returns> 解密后的数据 </returns>
|
||||
public static string PublicKeyDecrypt(string xmlPublicKey, string strDecryptString)
|
||||
{
|
||||
RSAHelper rs = new RSAHelper(RSAType.RSA, Encoding.UTF8, "", xmlPublicKey);
|
||||
var xml = rs._publicKeyRsaProvider.ToXmlString(false);
|
||||
MAX_DECRYPT_BLOCK = rs._publicKeyRsaProvider.KeySize / 8;
|
||||
|
||||
//加载公钥
|
||||
RSACryptoServiceProvider publicRsa = new RSACryptoServiceProvider();
|
||||
publicRsa.FromXmlString(xml);
|
||||
RSAParameters rp = publicRsa.ExportParameters(false);
|
||||
|
||||
//转换密钥
|
||||
AsymmetricKeyParameter pbk = DotNetUtilities.GetRsaPublicKey(rp);
|
||||
|
||||
IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");
|
||||
//第一个参数为true表示加密,为false表示解密;第二个参数表示密钥
|
||||
c.Init(false, pbk);
|
||||
|
||||
byte[] DataToDecrypt = Convert.FromBase64String(strDecryptString);
|
||||
//byte[] outBytes = c.DoFinal(DataToDecrypt);//解密
|
||||
|
||||
//string strDec = Encoding.UTF8.GetString(outBytes);
|
||||
|
||||
byte[] cache;
|
||||
int time = 0;//次数
|
||||
int inputLen = DataToDecrypt.Length;
|
||||
int offSet = 0;
|
||||
using (MemoryStream outStream = new MemoryStream())
|
||||
{
|
||||
while (inputLen - offSet > 0)
|
||||
{
|
||||
if (inputLen - offSet > MAX_DECRYPT_BLOCK)
|
||||
{
|
||||
cache = c.DoFinal(DataToDecrypt, offSet, MAX_DECRYPT_BLOCK);
|
||||
}
|
||||
else
|
||||
{
|
||||
cache = c.DoFinal(DataToDecrypt, offSet, inputLen - offSet);
|
||||
}
|
||||
//写入
|
||||
outStream.Write(cache, 0, cache.Length);
|
||||
|
||||
time++;
|
||||
offSet = time * MAX_DECRYPT_BLOCK;
|
||||
}
|
||||
byte[] resData = outStream.ToArray();
|
||||
|
||||
string strDec = Encoding.UTF8.GetString(resData);
|
||||
return strDec;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 私钥签名
|
||||
/// </summary>
|
||||
/// <param name="str">需签名的数据</param>
|
||||
/// <param name="privateKey">私钥</param>
|
||||
/// <param name="signAlgType">hash算法</param>
|
||||
/// <returns>签名后的值</returns>
|
||||
public static string Sign(string str, string privateKey, SignAlgType signAlgType)
|
||||
{
|
||||
//根据需要加签时的哈希算法转化成对应的hash字符节
|
||||
byte[] bt = Encoding.UTF8.GetBytes(str);
|
||||
byte[] rgbHash = null;
|
||||
switch (signAlgType)
|
||||
{
|
||||
case SignAlgType.SHA1:
|
||||
{
|
||||
var csp = new SHA1CryptoServiceProvider();
|
||||
rgbHash = csp.ComputeHash(bt);
|
||||
}
|
||||
break;
|
||||
case SignAlgType.SHA256:
|
||||
{
|
||||
var csp = new SHA256CryptoServiceProvider();
|
||||
rgbHash = csp.ComputeHash(bt);
|
||||
}
|
||||
break;
|
||||
case SignAlgType.MD5:
|
||||
{
|
||||
var csp = new MD5CryptoServiceProvider();
|
||||
rgbHash = csp.ComputeHash(bt);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
RSACryptoServiceProvider key = new RSACryptoServiceProvider();
|
||||
|
||||
RSAHelper rs = new RSAHelper(RSAType.RSA, Encoding.UTF8, privateKey);
|
||||
var xml = rs._privateKeyRsaProvider.ToXmlString(true);
|
||||
key.FromXmlString(xml);
|
||||
RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);
|
||||
formatter.SetHashAlgorithm(signAlgType.ToString());//此处是你需要加签的hash算法,需要和上边你计算的hash值的算法一致,不然会报错。
|
||||
byte[] inArray = formatter.CreateSignature(rgbHash);
|
||||
return Convert.ToBase64String(inArray);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 公钥验签
|
||||
/// </summary>
|
||||
/// <param name="str">待验证的字符串</param>
|
||||
/// <param name="sign">加签之后的字符串</param>
|
||||
/// <param name="publicKey">公钥</param>
|
||||
/// <param name="signAlgType">hash算法</param>
|
||||
/// <returns>签名是否符合</returns>
|
||||
public static bool Verify(string str, string sign, string publicKey, SignAlgType signAlgType)
|
||||
{
|
||||
|
||||
byte[] bt = Encoding.UTF8.GetBytes(str);
|
||||
byte[] rgbHash = null;
|
||||
switch (signAlgType)
|
||||
{
|
||||
case SignAlgType.SHA1:
|
||||
{
|
||||
var csp = new SHA1CryptoServiceProvider();
|
||||
rgbHash = csp.ComputeHash(bt);
|
||||
}
|
||||
break;
|
||||
case SignAlgType.SHA256:
|
||||
{
|
||||
var csp = new SHA256CryptoServiceProvider();
|
||||
rgbHash = csp.ComputeHash(bt);
|
||||
}
|
||||
break;
|
||||
case SignAlgType.MD5:
|
||||
{
|
||||
var csp = new MD5CryptoServiceProvider();
|
||||
rgbHash = csp.ComputeHash(bt);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
RSACryptoServiceProvider key = new RSACryptoServiceProvider();
|
||||
RSAHelper rs = new RSAHelper(RSAType.RSA, Encoding.UTF8, "", publicKey);
|
||||
var xml = rs._publicKeyRsaProvider.ToXmlString(false);
|
||||
key.FromXmlString(xml);
|
||||
RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(key);
|
||||
deformatter.SetHashAlgorithm(signAlgType.ToString());
|
||||
byte[] rgbSignature = Convert.FromBase64String(sign);
|
||||
if (deformatter.VerifySignature(rgbHash, rgbSignature))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 签名算法类型
|
||||
/// </summary>
|
||||
public enum SignAlgType
|
||||
{
|
||||
/// <summary>
|
||||
/// sha1
|
||||
/// </summary>
|
||||
SHA1,
|
||||
/// <summary>
|
||||
/// sha256
|
||||
/// </summary>
|
||||
SHA256,
|
||||
|
||||
/// <summary>
|
||||
/// md5
|
||||
/// </summary>
|
||||
MD5
|
||||
}
|
||||
}
|
||||
}
|
34
Blog.Core.Extensions/Middlewares/MiniProfilerMildd.cs
Normal file
34
Blog.Core.Extensions/Middlewares/MiniProfilerMildd.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using Blog.Core.Common;
|
||||
using log4net;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using System;
|
||||
|
||||
namespace Blog.Core.Extensions
|
||||
{
|
||||
/// <summary>
|
||||
/// MiniProfiler性能分析
|
||||
/// </summary>
|
||||
public static class MiniProfilerMildd
|
||||
{
|
||||
private static readonly ILog log = LogManager.GetLogger(typeof(MiniProfilerMildd));
|
||||
public static void UseMiniProfilerMildd(this IApplicationBuilder app)
|
||||
{
|
||||
if (app == null) throw new ArgumentNullException(nameof(app));
|
||||
|
||||
try
|
||||
{
|
||||
if (Appsettings.app("Startup", "MiniProfiler", "Enabled").ObjToBool())
|
||||
{
|
||||
// 性能分析
|
||||
app.UseMiniProfiler();
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
log.Error($"An error was reported when starting the MiniProfilerMildd.\n{e.Message}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -109,6 +109,16 @@ namespace Blog.Core.Extensions
|
|||
ConsoleHelper.WriteSuccessLine($"IpRateLimiting: True");
|
||||
}
|
||||
|
||||
// 性能分析
|
||||
if (!Appsettings.app("Startup", "MiniProfiler", "Enabled").ObjToBool())
|
||||
{
|
||||
Console.WriteLine($"MiniProfiler: False");
|
||||
}
|
||||
else
|
||||
{
|
||||
ConsoleHelper.WriteSuccessLine($"MiniProfiler: True");
|
||||
}
|
||||
|
||||
// CORS跨域
|
||||
if (!Appsettings.app("Startup", "Cors", "EnableAllIPs").ObjToBool())
|
||||
{
|
||||
|
@ -116,7 +126,7 @@ namespace Blog.Core.Extensions
|
|||
}
|
||||
else
|
||||
{
|
||||
ConsoleHelper.WriteSuccessLine($"EnableAllIPs For EnableAllIPs: True");
|
||||
ConsoleHelper.WriteSuccessLine($"EnableAllIPs For CORS: True");
|
||||
}
|
||||
|
||||
// redis消息队列
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Blog.Core.Common;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using System;
|
||||
|
||||
namespace Blog.Core.Extensions
|
||||
|
@ -11,9 +12,10 @@ namespace Blog.Core.Extensions
|
|||
public static void AddMiniProfilerSetup(this IServiceCollection services)
|
||||
{
|
||||
if (services == null) throw new ArgumentNullException(nameof(services));
|
||||
|
||||
services.AddMiniProfiler();
|
||||
|
||||
if(Appsettings.app(new string[] { "Startup", "MiniProfiler", "Enabled" }).ObjToBool())
|
||||
{
|
||||
services.AddMiniProfiler();
|
||||
}
|
||||
// 3.x使用MiniProfiler,必须要注册MemoryCache服务
|
||||
// services.AddMiniProfiler(options =>
|
||||
// {
|
||||
|
|
|
@ -17,12 +17,5 @@
|
|||
<ProjectReference Include="..\Blog.Core.IServices\Blog.Core.IServices.csproj" />
|
||||
<ProjectReference Include="..\Blog.Core.Repository\Blog.Core.Repository.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="CCB_B2CPay_Util">
|
||||
<HintPath>File\CCB_B2CPay_Util.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.Common;
|
||||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.Common.StaticHelper;
|
||||
using Blog.Core.IRepository.Base;
|
||||
using Blog.Core.IServices;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.ViewModels;
|
||||
using Blog.Core.Services.BASE;
|
||||
using CCB_B2CPay_Util;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
|
@ -277,6 +277,7 @@ namespace Blog.Core.Services
|
|||
public async Task<MessageModel<PayReturnResultModel>> PayCheck(PayNeedModel payModel, int times)
|
||||
{
|
||||
_logger.LogInformation("轮询开始");
|
||||
|
||||
MessageModel<PayReturnResultModel> messageModel = new MessageModel<PayReturnResultModel>();
|
||||
messageModel.response = new PayReturnResultModel();
|
||||
string url = string.Empty;
|
||||
|
@ -284,11 +285,9 @@ namespace Blog.Core.Services
|
|||
string returnData = string.Empty;
|
||||
try
|
||||
{
|
||||
//设置最大轮询次数,跟建行保持一致
|
||||
int theLastTime = 6;
|
||||
if (times > theLastTime)
|
||||
{
|
||||
throw new Exception($"轮询次数超过最大次数{theLastTime}");
|
||||
}
|
||||
if (times > theLastTime) throw new Exception($"轮询次数超过最大次数{theLastTime}");
|
||||
|
||||
string host = "https://ibsbjstar.ccb.com.cn/CCBIS/B2CMainPlat_00_BEPAY?";
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user