C# 常用加密处理

AES

using System;
using System.Security.Cryptography;
using System.Text;

namespace Common
{
    public class AESProvider
    {
        public static int KEYSIZE = 128;

        /// <summary>
        /// 获取随机的加密密钥
        /// </summary>
        /// <param name="Key"></param>
        /// <param name="IV"></param>
        /// <returns></returns>
        public static void GenerateKey(out string Key, out string IV)
        {
            Key = GenerateKey();
            IV = GenerateIV();
        }

        /// <summary>
        /// 获取随机的加密密钥
        /// </summary>
        /// <returns></returns>
        public static string GenerateKey()
        {
            int n = KEYSIZE / 8;
            char[] arrChar = new char[]{
           ‘a‘,‘b‘,‘d‘,‘c‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘p‘,‘r‘,‘q‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘z‘,‘y‘,‘x‘,
           ‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,
           ‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘Q‘,‘P‘,‘R‘,‘T‘,‘S‘,‘V‘,‘U‘,‘W‘,‘X‘,‘Y‘,‘Z‘
          };

            StringBuilder num = new StringBuilder();

            Random rnd = new Random();
            for (int i = 0; i < n; i++)
            {
                num.Append(arrChar[rnd.Next(0, arrChar.Length)].ToString());
            }

            return num.ToString();
        }

        /// <summary>
        /// 获取随机的初始化向量
        /// </summary>
        /// <returns></returns>
        public static string GenerateIV()
        {
            int n = KEYSIZE / 8;
            char[] arrChar = new char[]{
           ‘a‘,‘b‘,‘d‘,‘c‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘p‘,‘r‘,‘q‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘z‘,‘y‘,‘x‘,
           ‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,
           ‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘Q‘,‘P‘,‘R‘,‘T‘,‘S‘,‘V‘,‘U‘,‘W‘,‘X‘,‘Y‘,‘Z‘
          };

            StringBuilder num = new StringBuilder();

            Random rnd = new Random(DateTime.Now.Millisecond);
            for (int i = 0; i < n; i++)
            {
                num.Append(arrChar[rnd.Next(0, arrChar.Length)].ToString());
            }

            return num.ToString();
        }

        /// <summary>
        /// AES加密
        /// </summary>
        /// <param name="TextData">待加密字符</param>
        /// <param name="Key">加密密钥</param>
        /// <param name="IV">初始化向量</param>
        /// <param name="CryptText">输出:已加密字符串</param>
        /// <returns>0:成功加密 -1:待加密字符串不为能空 -2:加密密钥不能为空 -3:初始化向量字节长度不为KEYSIZE/8 -4:其他错误</returns>
        public static int EncryptText(string TextData, string Key, string IV, out string CryptText)
        {
            CryptText = "";
            TextData = TextData.Trim();
            if (string.IsNullOrEmpty(TextData)) return -1;
            if (string.IsNullOrEmpty(Key)) return -2;
            if (string.IsNullOrEmpty(IV) || IV.Length != KEYSIZE / 8) return -3;

            try
            {
                RijndaelManaged rijndaelCipher = new RijndaelManaged();

                rijndaelCipher.Mode = CipherMode.CBC;
                rijndaelCipher.Padding = PaddingMode.PKCS7;
                rijndaelCipher.KeySize = KEYSIZE;
                rijndaelCipher.BlockSize = KEYSIZE;

                byte[] pwdBytes = Encoding.UTF8.GetBytes(Key);
                byte[] ivBytes = Encoding.UTF8.GetBytes(IV);

                byte[] keyBytes = new byte[KEYSIZE / 8];
                int len = pwdBytes.Length;
                if (len > keyBytes.Length) len = keyBytes.Length;
                System.Array.Copy(pwdBytes, keyBytes, len);

                rijndaelCipher.Key = keyBytes;
                rijndaelCipher.IV = ivBytes;

                ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
                byte[] plainText = Encoding.UTF8.GetBytes(TextData);
                byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);

                CryptText = Convert.ToBase64String(cipherBytes);

                return 0;
            }
            catch
            {
                return -4;
            }
        }

        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="CryptText">待解密字符串</param>
        /// <param name="Key">加密密钥</param>
        /// <param name="IV">初始化向量</param>
        /// <param name="TextData">输出:已解密的字符串</param>
        /// <returns>0:成功解密 -1:待解密字符串不为能空 -2:加密密钥不能为空 -3:初始化向量字节长度不为KEYSIZE/8 -4:其他错误</returns>
        public static int DecryptText(string CryptText, string Key, string IV, out string TextData)
        {
            TextData = "";
            if (string.IsNullOrEmpty(CryptText)) return -1;
            if (string.IsNullOrEmpty(Key)) return -2;
            if (string.IsNullOrEmpty(IV) || IV.Length != KEYSIZE / 8) return -3;

            try
            {
                RijndaelManaged rijndaelCipher = new RijndaelManaged();

                rijndaelCipher.Mode = CipherMode.CBC;
                rijndaelCipher.Padding = PaddingMode.PKCS7;
                rijndaelCipher.KeySize = KEYSIZE;
                rijndaelCipher.BlockSize = KEYSIZE;

                byte[] encryptedData = Convert.FromBase64String(CryptText);
                byte[] pwdBytes = Encoding.UTF8.GetBytes(Key);
                byte[] ivBytes = Encoding.UTF8.GetBytes(IV);

                byte[] keyBytes = new byte[KEYSIZE / 8];
                int len = pwdBytes.Length;
                if (len > keyBytes.Length) len = keyBytes.Length;
                System.Array.Copy(pwdBytes, keyBytes, len);

                rijndaelCipher.Key = keyBytes;
                rijndaelCipher.IV = ivBytes;

                ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
                byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);

                TextData = Encoding.UTF8.GetString(plainText).Trim();
                return 0;
            }
            catch
            {
                return -4;
            }
        }
    }
}

RSA

using System;
using System.Security.Cryptography;
using System.Text;

namespace Common
{
    public class RSAProvider
    {
        public static int KEYSIZE = 1024;
        /// <summary>
        /// 自动生成公私密钥
        /// </summary>
        /// <param name="Modulus">输出:加密公钥</param>
        /// <param name="Exponent">输入:公钥指数</param>
        /// <param name="PrivateKey">输出:私钥</param>
        public static void GenerateKey(out string Modulus, out string Exponent, out string PrivateKey)
        {
            RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(KEYSIZE);

            RSAParameters pubparam = rsaProvider.ExportParameters(false);
            byte[] mod = pubparam.Modulus;
            byte[] exp = pubparam.Exponent;

            byte[] prikey = rsaProvider.ExportCspBlob(true);

            Modulus = Convert.ToBase64String(mod);
            Exponent = Convert.ToBase64String(exp);
            PrivateKey = Convert.ToBase64String(prikey);
        }

        /// <summary>
        /// RSA加密
        /// </summary>
        /// <param name="TextData">待加密字符</param>
        /// <param name="Modulus">加密公钥</param>
        /// <param name="Exponent">加密指数</param>
        /// <param name="CryptText">输出:已加密字符串</param>
        /// <returns>0:成功加密 -1:待加密字符串不为能空 -2:加密公钥不能为空 -3:待加密字符串超长  -4:其他错误</returns>
        public static int EncryptText(string TextData, string Modulus, string Exponent, out string CryptText)
        {
            CryptText = "";
            if (string.IsNullOrEmpty(TextData)) return -1;
            if (string.IsNullOrEmpty(Modulus)) return -2;
            if (TextData.Length > KEYSIZE / 8 - 11) return -3;
            try
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(KEYSIZE);
                byte[] modBytes = Convert.FromBase64String(Modulus);
                byte[] expBytes = Convert.FromBase64String(Exponent);

                RSAParameters p = new RSAParameters();
                p.Modulus = modBytes;
                p.Exponent = expBytes;

                rsa.ImportParameters(p);
                byte[] plainText = Encoding.UTF8.GetBytes(TextData);
                byte[] cipherBytes = rsa.Encrypt(plainText, false);

                CryptText = Convert.ToBase64String(cipherBytes);

                return 0;
            }
            catch { return -4; }
        }

        /// <summary>
        /// RSA解密
        /// </summary>
        /// <param name="CryptText">待解密字符串</param>
        /// <param name="Key">解密私钥</param>
        /// <param name="TextData">输出:已解密的字符串</param>
        /// <returns>0:成功解密 -1:待解密字符串不为能空 -2:解密私钥不能为空 -4:其他错误</returns>
        public static int DecryptText(string CryptText, string PrivateKey, out string TextData)
        {
            TextData = "";

            if (string.IsNullOrEmpty(CryptText)) return -1;
            if (string.IsNullOrEmpty(PrivateKey)) return -2;

            try
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(KEYSIZE);

                byte[] prikey = Convert.FromBase64String(PrivateKey); ;
                rsa.ImportCspBlob(prikey);

                byte[] cipherBytes = Convert.FromBase64String(CryptText);
                byte[] plainText = rsa.Decrypt(cipherBytes, false);

                TextData = Encoding.UTF8.GetString(plainText);

                return 0;
            }
            catch { return -4; }
        }
    }
}

MD5

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Common
{
  public  class EncryptMD5
    {

        public static string GetMd5(string s, Encoding encoding)
        {
            System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();//实例化一个MD5
            byte[] t = md5.ComputeHash(encoding.GetBytes(s));//生成MD5哈希值
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < t.Length; i++)
            {
                sb.Append(t[i].ToString("x").PadLeft(2, ‘0‘));//将哈希值转换为字符串
            }
            return sb.ToString().ToUpper();
        }
    }
}
时间: 2024-10-23 17:10:43

C# 常用加密处理的相关文章

iOS代码加密常用加密方式

在今天的面试中,被问到了iOS是采用什么进行加密解密操作的,我的回答是这样的:AES,MD5,Base 64,然后是对这几种加密算法进行了一下简单的介绍和概述和几种算法之间的不同点和优缺点.然而,收到的回答是:这些都不是iOS的加密!我顿时就无语了,这不就是iOS加密所用到的方法么?然后向面试官请教了一下:MD5是一种摘要....什么叫加密呢?加密是客户端对数据加密和服务器端采用秘钥对数据进行解密处理,为了数据的安全考虑.要说加密应该是RSA.幸亏之前有了解过RSA,只是了解的不是很彻底和清楚.

iOS——常用加密方式

iOS代码加密常用加密方式,常见的iOS代码加密算法包括MD5加密.AES加密.BASE64加密. 三大算法iOS代码加密是如何进行加密的: /////////////////////////////////////////////////////////////////// MD5 iOS代码加密使用方法 /////////////////////////////////////////////////////////////////// //创建MD5类,代码如下 #import <Foun

常用加密方法

常用加密方法: 1> base64  2> MD5  3> MD5加盐  4> HMAC  5> 时间戳密码(用户密码动态变化) { 1> base64 { base64 编码是现代密码学的基础. 原本是 8个bit 一组表示数据,改为 6个bit一组表示数据,不足的部分补零,每 两个0 用 一个 = 表示. 用base64 编码之后,数据长度会变大,增加了大约 1/3 左右. base64 基本能够达到安全要求,但是,base64能够逆运算,非常不安全! base64

iOS常用加密方式

示例项目下载地址  https://github.com/cerastes/Encryption 1MD5 创建MD5类 #import <Foundation/Foundation.h> @interface CJMD5 : NSObject +(NSString *)md5HexDigest:(NSString *)input; @end #import "CJMD5.h" #import <CommonCrypto/CommonDigest.h> @imp

PHP的几个常用加密函数(转载 https://jellybool.com/post/php-encrypt-functions)

PHP的几个常用加密函数 在网站的开发过程中,常常需要对部分数据(如用户密码)进行加密,本文主要介绍PHP的几个常见的加密函数 MD5加密: string md5 ( string $str [, bool $raw_output = false ] ) 1.md5()默认情况下以 32 字符十六进制数字形式返回散列值,它接受两个参数,第一个为要加密的字符串,第二个为raw_output的布尔值,默认为false,如果设置为true,md5()则会返回原始的 16 位二进制格式报文摘要 2.md

iOS常用加密方法(aes、md5、base64)

1.代码 iOS常用加密方法(aes.md5.base64) 1.AES加密 NSData+AES.h文件 // // NSData-AES.h // Smile // // Created by 周 敏 on 12-11-24. // Copyright (c) 2012年 BOX. All rights reserved. // #import <Foundation/Foundation.h> @class NSString; @interface NSData (Encryption)

php实现的三个常用加密解密功能函数示例

目录 算法一: 算法二: 算法三(改进第一个加密之后的算法) 本文实例讲述了php实现的三个常用加密解密功能函数.分享给大家供大家参考,具体如下: 算法一: //加密函数 function lock_url($txt,$key='www.jb51.net') { $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+"; $nh = rand(0,64); $ch = $chars[$nh]

常用加密方式

加密将防止数据被查看或修改,并在原本不安全的信道上提供安全的通信信道,它达到以下目的: ? 保密性:防止用户的标识或数据被读取. ? 数据完整性:防止数据被更改. ? 身份验证:确保数据发自特定的一方. 一.数据加密/编码算法列表 常见用于保证安全的加密或编码算法如下: 1.常用密钥算法 密钥算法用来对敏感数据.摘要.签名等信息进行加密,常用的密钥算法包括: ? DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合: ? 3DES(Trip

Java常用加密技术和代码总结

总结类文章,把一些常用的Java加密技术和核心代码写在这边,供参考. 首先大家要记住现代密码学最重要的原则柯克霍夫原则: 数据的安全基于密钥而不是算法的保密.也就是说即使密码系统的任何细节已为人悉知,只要密匙未洩漏,它也应是安全的. 具体来说: 系统必须可用,非数学上不可译码. 系统不一定要保密,可以轻易落入敌人手中. 密匙必须可以不经书写的资料交换和记忆,且双方可以改变密匙. 系统可以用于电讯. 系统可以转移位置,它的功能必须不用经过几个人之手才可达到. 系统容易使用,不要求使用者的脑力过份操

iOS常用加密之RSA加密解密

前言: iOS常用的加密有很多种,前两天在工作中遇到了RSA加密,现在把代吗分享出来. RSA基本原理 RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key). 公钥(public key): 用于加密数据. 用于公开, 一般存放在数据提供方, 例如iOS客户端. 私钥(private key): 用于解密数据. 必须保密, 私钥泄露会造成安全问题 第一步:公钥.私钥的生成 iOS开发者可直接在Mac终端生成,命