HDL Home App 第二版本 旧平台金堂用 正在使用
xm
2020-12-14 d6fb0646531172f23648441c224cdcccd721b894
ZigbeeApp/Shared/Phone/ZigBee/Common/SecuritySet.cs
New file
@@ -0,0 +1,271 @@
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;
            }
        }
    }
}