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
{
///
/// 安全类
///
public static class SecuritySet
{
///
/// Aes加密数据
/// 采用128位(16字节)分组加密和解密数据,加密模式为CBC,偏移量(iv)和密钥一致,填充模式采用pkcs5或pkcs7,加密结果输出base64编码。
///
/// The encrypt.
/// P to encrypt.
/// Key.
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);
}
//
/// Aes加密数据
/// 采用128位(16字节)分组加密和解密数据,加密模式为CBC,偏移量(iv)和密钥一致,填充模式采用pkcs5或pkcs7,加密结果输出base64编码。
///
/// The encrypt.
/// P to encrypt.
/// Key.
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);
}
///
/// Aes 解密数据
///
/// The decrypt.
/// P to decrypt.
/// Key.
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);
}
///
/// Aes 解密数据
///
/// The decrypt.
/// P to decrypt.
/// Key.
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);
}
///
/// DES进行加密
///
///
///
///
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:加密失败!";
}
}
///
/// DES进行解密
///
///
///
///
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:解密失败!";
}
}
///
///获取pem公钥正文内容
///
/// 私钥证书路径
///
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;
}
}
///
/// 把公钥转换成.net的xml格式
///
/// java提供的第三方公钥
///
public static string ConvertToXmlPublicJavaKey(this RSA rsa, string publicJavaKey)
{
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicJavaKey));
string xmlpublicKey = string.Format("{0}{1}",
Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
return xmlpublicKey;
}
///
/// RSA加密
///
/// Source string
/// public key
///
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;
}
}
}
}