using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Security.Cryptography;
|
using System.Text;
|
using Org.BouncyCastle.Crypto.Parameters;
|
using Org.BouncyCastle.Security;
|
|
namespace ZigBee.Common
|
{
|
/// <summary>
|
/// 安全类
|
/// </summary>
|
public static class SecuritySet
|
{
|
/// <summary>
|
/// Aes加密数据
|
/// 采用128位(16字节)分组加密和解密数据,加密模式为CBC,偏移量(iv)和密钥一致,填充模式采用pkcs5或pkcs7,加密结果输出base64编码。
|
/// </summary>
|
/// <returns>The encrypt.</returns>
|
/// <param name="bytes">P to encrypt.</param>
|
/// <param name="key">Key.</param>
|
public static string AesEncrypt(byte []bytes, string key)
|
{
|
if (bytes==null)
|
return null;
|
|
//配置AES加密Key(密钥、向量、模式、填充)
|
var rm = new RijndaelManaged
|
{
|
Key = Encoding.UTF8.GetBytes(key),
|
IV = Encoding.UTF8.GetBytes(key),
|
Mode = CipherMode.CBC,
|
Padding = PaddingMode.PKCS7
|
};
|
|
//创建AES加密器对象
|
var cTransform = rm.CreateEncryptor();
|
|
//使用AES将明文流转成密文字节数组
|
var resultArray = cTransform.TransformFinalBlock(bytes, 0, bytes.Length);
|
|
//将AES生成的密文字节数组转成Base64字符串
|
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
|
}
|
|
// <summary>
|
/// Aes加密数据
|
/// 采用128位(16字节)分组加密和解密数据,加密模式为CBC,偏移量(iv)和密钥一致,填充模式采用pkcs5或pkcs7,加密结果输出base64编码。
|
/// </summary>
|
/// <returns>The encrypt.</returns>
|
/// <param name="bytes">P to encrypt.</param>
|
/// <param name="key">Key.</param>
|
public static byte []AesEncryptBytes(byte[] bytes, string key)
|
{
|
if (bytes == null)
|
return null;
|
|
//配置AES加密Key(密钥、向量、模式、填充)
|
var rm = new RijndaelManaged
|
{
|
Key = Encoding.UTF8.GetBytes(key),
|
IV = Encoding.UTF8.GetBytes(key),
|
Mode = CipherMode.CBC,
|
Padding = PaddingMode.PKCS7
|
};
|
|
//创建AES加密器对象
|
var cTransform = rm.CreateEncryptor();
|
|
//使用AES将明文流转成密文字节数组
|
return cTransform.TransformFinalBlock(bytes, 0, bytes.Length);
|
|
//将AES生成的密文字节数组转成Base64字符串
|
//return Convert.ToBase64String(resultArray, 0, resultArray.Length);
|
}
|
|
/// <summary>
|
/// Aes 解密数据
|
/// </summary>
|
/// <returns>The decrypt.</returns>
|
/// <param name="pToDecrypt">P to decrypt.</param>
|
/// <param name="key">Key.</param>
|
public static byte []AesDecryptBytes(byte[] bytes, string key)
|
{
|
//AES密文Base64转成字符串
|
var toEncryptArray = bytes;// Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(bytes));
|
|
//配置AES加密Key(密钥、向量、模式、填充)
|
var rm = new RijndaelManaged
|
{
|
Key = Encoding.UTF8.GetBytes(key),
|
IV = Encoding.UTF8.GetBytes(key),
|
//Mode = CipherMode.ECB,
|
Mode = CipherMode.CBC,
|
Padding = PaddingMode.PKCS7
|
};
|
|
//创建AES解密器对象
|
var cTransform = rm.CreateDecryptor();
|
|
//使用AES将密文流转成明文的字节数组
|
return cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
|
//转成字符串
|
//return Encoding.UTF8.GetString(resultArray);
|
}
|
|
/// <summary>
|
/// Aes 解密数据
|
/// </summary>
|
/// <returns>The decrypt.</returns>
|
/// <param name="pToDecrypt">P to decrypt.</param>
|
/// <param name="key">Key.</param>
|
public static string AesDecrypt(byte []bytes, string key)
|
{
|
//AES密文Base64转成字符串
|
var toEncryptArray = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(bytes));
|
|
//配置AES加密Key(密钥、向量、模式、填充)
|
var rm = new RijndaelManaged
|
{
|
Key = Encoding.UTF8.GetBytes(key),
|
IV = Encoding.UTF8.GetBytes(key),
|
//Mode = CipherMode.ECB,
|
Mode = CipherMode.CBC,
|
Padding = PaddingMode.PKCS7
|
};
|
|
//创建AES解密器对象
|
var cTransform = rm.CreateDecryptor();
|
|
//使用AES将密文流转成明文的字节数组
|
var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
|
//转成字符串
|
return Encoding.UTF8.GetString(resultArray);
|
}
|
|
/// <summary>
|
/// DES进行加密
|
/// </summary>
|
/// <param name="passwordToEncrypt"></param>
|
/// <param name="key"></param>
|
/// <returns></returns>
|
public static string DESEncrypt(string passwordToEncrypt, string key)
|
{
|
try
|
{
|
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
|
{
|
byte[] inputByteArray = Encoding.UTF8.GetBytes(passwordToEncrypt);
|
des.Key = ASCIIEncoding.ASCII.GetBytes(key);
|
des.IV = ASCIIEncoding.ASCII.GetBytes(key);
|
|
MemoryStream ms = new MemoryStream();
|
|
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
|
{
|
cs.Write(inputByteArray, 0, inputByteArray.Length);
|
cs.FlushFinalBlock();
|
cs.Close();
|
}
|
string str = Convert.ToBase64String(ms.ToArray());
|
ms.Close();
|
return str;
|
}
|
}
|
catch
|
{
|
return "error:加密失败!";
|
}
|
}
|
|
/// <summary>
|
/// DES进行解密
|
/// </summary>
|
/// <param name="pToDecrypt"></param>
|
/// <param name="key"></param>
|
/// <returns></returns>
|
public static string DESDecrypt(string pToDecrypt, string key)
|
{
|
try
|
{
|
byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
|
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
|
{
|
des.Key = ASCIIEncoding.ASCII.GetBytes(key);
|
des.IV = ASCIIEncoding.ASCII.GetBytes(key);
|
|
MemoryStream ms = new MemoryStream();
|
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
|
{
|
cs.Write(inputByteArray, 0, inputByteArray.Length);
|
cs.FlushFinalBlock();
|
cs.Close();
|
}
|
string str = Encoding.UTF8.GetString(ms.ToArray());
|
ms.Close();
|
return str;
|
}
|
}
|
catch
|
{
|
return "error:解密失败!";
|
}
|
}
|
|
/// <summary>
|
///获取pem公钥正文内容
|
/// </summary>
|
/// <param name="filePath">私钥证书路径</param>
|
/// <returns></returns>
|
public static string publicKeyContent(string content)
|
{
|
try
|
{
|
string publickeyConent = content.Replace("-----BEGIN PUBLIC KEY-----", "").Replace("-----END PUBLIC KEY-----", "").Replace("\n", "").Replace("\r", "");//去掉证书的头部和尾部
|
return publickeyConent;
|
}
|
catch (Exception ex)
|
{
|
var msg = $"获取pem公钥正文内容抛出异常,{ex.Message}";
|
System.Console.WriteLine(msg);
|
return msg;
|
}
|
}
|
|
/// <summary>
|
/// 把公钥转换成.net的xml格式
|
/// </summary>
|
/// <param name="privateKey">java提供的第三方公钥</param>
|
/// <returns></returns>
|
public static string ConvertToXmlPublicJavaKey(this RSA rsa, string publicJavaKey)
|
{
|
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicJavaKey));
|
string xmlpublicKey = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
|
Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
|
Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
|
return xmlpublicKey;
|
}
|
|
/// <summary>
|
/// RSA加密
|
/// </summary>
|
/// <param name="sSource" >Source string</param>
|
/// <param name="sPublicKey" >public key</param>
|
/// <returns></returns>
|
public static string RSAEncrypt(string publickey, string content)
|
{
|
try
|
{
|
var pk = publicKeyContent(publickey);
|
var rsa = new RSACryptoServiceProvider();
|
var publickeyTemp = ConvertToXmlPublicJavaKey(rsa, pk);
|
|
byte[] cipherbytes;
|
rsa.FromXmlString(publickeyTemp);
|
cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
|
return Convert.ToBase64String(cipherbytes);
|
}
|
catch(Exception ex)
|
{
|
var msg = $"RSA加密失败_{ex.Message}";
|
System.Console.WriteLine(msg);
|
return msg;
|
}
|
|
}
|
}
|
}
|