RSA加密和AES加密

自己做了个RSA和AES加密的,JAVA,C#,C++可以做交互。算法用的是BouncyCastle的。感兴趣的可以去http://www.bouncycastle.org/

下面是源码,就是那个用证书验证的我没用,就没做,需要的可以自己看下,网上很多例子。

里面的注释应该比较明白了,有问题的可以在后面评论

using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Encoders;
using Org.BouncyCastle.Asn1;

using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using System.IO;


namespace Encryption_and_Decryption
{
    public class AESRSAED
    {
        private AsymmetricKeyParameter publickey;
        private AsymmetricKeyParameter privatekey;

        /// <summary>
        /// 创建公钥私钥对
        /// </summary>
        public void GetRsaKey()
        {
            IAsymmetricCipherKeyPairGenerator keyPairGen = GeneratorUtilities.GetKeyPairGenerator("RSA");
            keyPairGen.Init(new RsaKeyGenerationParameters(
                       BigInteger.ValueOf(0x10001),
                       new SecureRandom(),
                       1024,
                       25));
            AsymmetricCipherKeyPair kp = keyPairGen.GenerateKeyPair();

            publickey = kp.Public;

            privatekey = kp.Private;

        }
        /// <summary>
        /// 公钥
        /// </summary>
        public AsymmetricKeyParameter s_publickey
        {
            get
            {
                return this.publickey;
            }
        }

        /// <summary>
        /// 私钥
        /// </summary>
        public AsymmetricKeyParameter s_private
        {
            get
            {
                return this.privatekey;
            }
        }

        #region 公钥加密方法
        /// <summary>
        /// RSA公钥加密
        /// </summary>
        /// <param name="pubKey">RSA公钥</param>
        /// <param name="data">需要加密的数据</param>
        /// <returns>加密后的数据</returns>
         byte[] RSAEncrypt(AsymmetricKeyParameter pubKey, string data)
        {
            byte[] inBytes = Encoding.GetEncoding("GB2312").GetBytes(data);
            IBufferedCipher c = CipherUtilities.GetCipher("RSA");
            c.Init(true, pubKey);
            byte[] outBytes = c.DoFinal(inBytes, 0, inBytes.Length);
          
            return outBytes;
        }
  
        /// <summary>
        /// 使用本地公钥加密信息
        /// </summary>
        /// <param name="filename">公钥文件路径</param>
        /// <param name="data">需要加密的数据</param>
        /// <returns>加密后的数据</returns>
        public static byte[] LocalRSAEncrypt(string PublicKeyfilename, string data)
        {
            AESRSAED ASD = new AESRSAED();
            string pubMould = ASD.readPubM(PublicKeyfilename);
            string pubEX = ASD.readPubEX(PublicKeyfilename);
            RsaKeyParameters rsapubk = ASD.Certpubkey(pubMould, pubEX);
            byte[] data1 = ASD.RSAEncrypt(rsapubk, data);
       
            return data1;
        }
        /// <summary>
        /// 使用本地公钥加密信息
        /// </summary>
        /// <param name="filename">公钥文件路径</param>
        /// <param name="data">需要加密的数据</param>
        /// <param name="dataLength">加密后数据的长度</param>
        /// <returns>加密后的数据</returns>
        public static byte[] LocalRSAEncrypt(string PublicKeyfilename, string data, out int dataLength)
        {
            AESRSAED ASD = new AESRSAED();
            string pubMould = ASD.readPubM(PublicKeyfilename);
            string pubEX = ASD.readPubEX(PublicKeyfilename);
            RsaKeyParameters rsapubk = ASD.Certpubkey(pubMould, pubEX);
            byte[] data1 = ASD.RSAEncrypt(rsapubk, data);
            dataLength = data1.Length;
            return data1;
        }
        /// <summary>
        /// 使用本地公钥加密信息取得加密后信息的长度
        /// </summary>
        /// <param name="filename">公钥文件路径</param>
        /// <param name="data">需要加密的数据</param>
        /// <returns>加密后数据的长度</returns>
        public static int LocalRSAEncryptLength(string PublicKeyfilename, string data)
        {
            AESRSAED ASD = new AESRSAED();
            string pubMould = ASD.readPubM(PublicKeyfilename);
            string pubEX = ASD.readPubEX(PublicKeyfilename);
            RsaKeyParameters rsapubk = ASD.Certpubkey(pubMould, pubEX);
            byte[] data1 = ASD.RSAEncrypt(rsapubk, data);

            return data1.Length;
        }
    
        #endregion

        #region 私钥解密函数

        /// <summary>
        /// RSA私钥解密
        /// </summary>
        /// <param name="priKey">RSA私钥</param>
        /// <param name="data">需要解密的数据</param>
        /// <returns>解密后的数据</returns>
         byte[] RSADecrypt(AsymmetricKeyParameter priKey, byte[] data)
        {
            IBufferedCipher c = CipherUtilities.GetCipher("RSA");
            c.Init(false, priKey);
            byte[] outBytre = c.DoFinal(data);
     
            return outBytre;
        }

        /// <summary>
        /// 使用本地私钥解密数据
        /// </summary>
        /// <param name="PrivateKeyfilename">私钥路径</param>
        /// <param name="data">需要解密的数据</param>
        /// <returns>解密后的数据</returns>
        public static byte[] LocalRSADecrypt(string PrivateKeyfilename, byte[] data)
        {
            AESRSAED ASD = new AESRSAED();
            string PriM=ASD.readPriM(PrivateKeyfilename);
            string PriEX=ASD.readPriEX(PrivateKeyfilename);
            string PriPUEX = ASD.readPriPUEX(PrivateKeyfilename);
            string PriP = ASD.readPriP(PrivateKeyfilename);
            string PriDP = ASD.readPriDP(PrivateKeyfilename);
            string PriQ = ASD.readPriQ(PrivateKeyfilename);
            string PriDQ = ASD.readPriDQ(PrivateKeyfilename);
            string PriQIV = ASD.readPriQIV(PrivateKeyfilename);
            RsaPrivateCrtKeyParameters rsapkey= ASD.Certprikey(PriM, PriPUEX, PriEX, PriP, PriDP, PriQ, PriDQ, PriQIV);
            byte[] ENdata=ASD.RSADecrypt(rsapkey, data);
            return ENdata;

        }

        /// <summary>
        /// 使用本地私钥解密数据
        /// </summary>
        /// <param name="PrivateKeyfilename">私钥路径</param>
        /// <param name="data">需要解密的数据</param>
        /// <param name="dataLength">解密后的数据长度</param>
        /// <returns>解密后的数据</returns>
        public static byte[] LocalRSADecrypt(string PrivateKeyfilename, byte[] data,out int dataLength)
        {
            AESRSAED ASD = new AESRSAED();
            string PriM = ASD.readPriM(PrivateKeyfilename);
            string PriEX = ASD.readPriEX(PrivateKeyfilename);
            string PriPUEX = ASD.readPriPUEX(PrivateKeyfilename);
            string PriP = ASD.readPriP(PrivateKeyfilename);
            string PriDP = ASD.readPriDP(PrivateKeyfilename);
            string PriQ = ASD.readPriQ(PrivateKeyfilename);
            string PriDQ = ASD.readPriDQ(PrivateKeyfilename);
            string PriQIV = ASD.readPriQIV(PrivateKeyfilename);
            RsaPrivateCrtKeyParameters rsapkey = ASD.Certprikey(PriM, PriPUEX, PriEX, PriP, PriDP, PriQ, PriDQ, PriQIV);
            byte[] ENdata = ASD.RSADecrypt(rsapkey, data);
            dataLength = ENdata.Length;
            return ENdata;

        }

        /// <summary>
        /// 使用本地私钥解密数据得到数据长度
        /// </summary>
        /// <param name="PrivateKeyfilename">私钥路径</param>
        /// <param name="data">需要解密的数据</param>
        /// <returns>解密后的数据长度</returns>
        public static int LocalRSADecryptLength(string PrivateKeyfilename, byte[] data)
        {
            AESRSAED ASD = new AESRSAED();
            string PriM = ASD.readPriM(PrivateKeyfilename);
            string PriEX = ASD.readPriEX(PrivateKeyfilename);
            string PriPUEX = ASD.readPriPUEX(PrivateKeyfilename);
            string PriP = ASD.readPriP(PrivateKeyfilename);
            string PriDP = ASD.readPriDP(PrivateKeyfilename);
            string PriQ = ASD.readPriQ(PrivateKeyfilename);
            string PriDQ = ASD.readPriDQ(PrivateKeyfilename);
            string PriQIV = ASD.readPriQIV(PrivateKeyfilename);
            RsaPrivateCrtKeyParameters rsapkey = ASD.Certprikey(PriM, PriPUEX, PriEX, PriP, PriDP, PriQ, PriDQ, PriQIV);
            byte[] ENdata = ASD.RSADecrypt(rsapkey, data);
       
            return ENdata.Length;

        }
         #endregion

      
        /// <summary>
        /// 保存公钥信息
        /// </summary>
        /// <param name="filename">公钥文件路径</param>
        /// <param name="modulus">公钥的M参数</param>
        /// <param name="exponet">公钥的EX参数</param>
        public static void SavePublicKey(string filename, byte[] modulus, byte[] exponet)
        {
            AESRSAED ASD = new AESRSAED();
            RsaKeyParameters pubkey= ASD.JavaPublickey(modulus, exponet);
            ASD.SavePub(pubkey, filename);
        }

        /// <summary>
        /// 保存私钥信息
        /// </summary>
        /// <param name="filename">私钥文件路径</param>
        /// <param name="privatekey">私钥参数</param>
        public static void SavePrivateKey(string filename, AsymmetricKeyParameter privatekey)
        {
            AESRSAED ASD = new AESRSAED();
            ASD.SavePri(privatekey, filename);
        }


        #region 公钥操作函数
        /// <summary>
        /// 接收JAVA公钥参数
        /// </summary>
        /// <param name="modulus">接收的公钥模数</param>
        /// <param name="exponet">接收的EX</param>
        /// <returns>公钥</returns>
        public RsaKeyParameters JavaPublickey(byte[] modulus, byte[] exponet)
        {
            string Modulus = Encoding.GetEncoding("GB2312").GetString(modulus);
            string Exponet =  Encoding.GetEncoding("GB2312").GetString(exponet);
            RsaKeyParameters rsaPublicKeyStructure1 = new RsaKeyParameters(false,
                new BigInteger(Modulus),
                new BigInteger(Exponet)
                );
            return rsaPublicKeyStructure1;
        }

        /// <summary>
        /// 提取本地公钥的M
        /// </summary>
        /// <param name="parameters">公钥</param>
        /// <returns>公钥M</returns>
         string publickeyM(RsaKeyParameters parameters)
        {
           return  parameters.Modulus.ToString();
        }

        /// <summary>
        /// 提取本地公钥的EX
        /// </summary>
        /// <param name="parameters">公钥</param>
        /// <returns>公钥EX</returns>
         string publickeyEX(RsaKeyParameters parameters)
        {
            return parameters.Exponent.ToString();
        }
        /// <summary>
        /// 将公钥信息保存到本地文件中
        /// </summary>
        /// <param name="publicKey">公钥信息</param>
        /// <param name="filename">公钥文件的物理路径</param>
        void SavePub(AsymmetricKeyParameter publicKey, string filename)
        {
            RsaKeyParameters publicKeyStructure = (RsaKeyParameters)publicKey;

            string Modulus = publicKeyStructure.Modulus.ToString();
            string exponet = publicKeyStructure.Exponent.ToString();
            string pubkey = Modulus + "|" + exponet;

            byte[] pub = Encoding.GetEncoding("GB2312").GetBytes(pubkey);

            FileStream fs = new FileStream(filename, FileMode.Create);
            fs.Write(pub, 0, pub.Length);
            fs.Close();
        }


        /// <summary>
        /// 读取公钥文件M信息
        /// </summary>
        /// <param name="filename">文件路径</param>
        /// <returns>公钥M</returns>
        string readPubM(string filename)
        {
            int bufferlen = 0x8000;
            FileStream fs = new FileStream(filename, FileMode.Open);
            byte[] buff = new byte[bufferlen];
            int read = 0;
            int block;
            while ((block = fs.Read(buff, read, buff.Length - read)) > 0)
            {
                read = block + read;

                if (read == buff.Length)
                {
                    int nextbyte = fs.ReadByte();
                    if (nextbyte == -1)
                    {
                        string a = Encoding.GetEncoding("GB2312").GetString(buff);
                        string[] strInfo = a.Split('|');
                        fs.Close();
                        return strInfo[0];
                    }
                    byte[] newbuf = new byte[buff.Length * 2];
                    Array.Copy(buff, newbuf, buff.Length);
                    newbuf[read] = (byte)nextbyte;
                    buff = newbuf;
                    read++;
                }
            }
            byte[] ret = new byte[read];
            Array.Copy(buff, ret, read);


            string b = Encoding.GetEncoding("GB2312").GetString(ret);
            string[] strInfo1 = b.Split('|');
            fs.Close();
            return strInfo1[0];
        }

        /// <summary>
        /// 读取公钥文件EX信息
        /// </summary>
        /// <param name="filename">文件路径</param>
        /// <returns>公钥EX</returns>
        string readPubEX(string filename)
        {
            int bufferlen = 0x8000;
            FileStream fs = new FileStream(filename, FileMode.Open);
            byte[] buff = new byte[bufferlen];
            int read = 0;
            int block;
            while ((block = fs.Read(buff, read, buff.Length - read)) > 0)
            {
                read = block + read;

                if (read == buff.Length)
                {
                    int nextbyte = fs.ReadByte();
                    if (nextbyte == -1)
                    {
                        string a = Encoding.GetEncoding("GB2312").GetString(buff);
                        string[] strInfo = a.Split('|');
                        fs.Close();
                        return strInfo[1];
                    }
                    byte[] newbuf = new byte[buff.Length * 2];
                    Array.Copy(buff, newbuf, buff.Length);
                    newbuf[read] = (byte)nextbyte;
                    buff = newbuf;
                    read++;
                }
            }
            byte[] ret = new byte[read];
            Array.Copy(buff, ret, read);


            string b = Encoding.GetEncoding("GB2312").GetString(ret);
            string[] strInfo1 = b.Split('|');
            fs.Close();
            return strInfo1[1];
        }

        /// <summary>
        /// 根据公钥参数创建公钥
        /// </summary>
        /// <param name="Modulus">公钥模数</param>
        /// <param name="Ex">公钥EX</param>
        /// <returns>公钥</returns>
        RsaKeyParameters Certpubkey(string Modulus, string Ex)
        {
            RsaKeyParameters rsaKeyParameters = new RsaKeyParameters(false,
                new BigInteger(Modulus),
                new BigInteger(Ex)
                );
            return rsaKeyParameters;
        }

         #endregion


        #region 私钥操作函数
        /// <summary>
        /// 使用参数创建私钥
        /// </summary>
        /// <param name="Modulus">私钥的模数</param>
        /// <param name="pubExponent">私钥中的公钥EX</param>
        /// <param name="PriExponent">私钥中的私钥EX</param>
        /// <param name="P">私钥的P</param>
        /// <param name="DP">私钥的DP</param>
        /// <param name="Q">私钥的Q</param>
        /// <param name="DQ">私钥的DQ</param>
        /// <param name="QInv">私钥的QINV</param>
        /// <returns>私钥</returns>
         RsaPrivateCrtKeyParameters Certprikey(string Modulus, string pubExponent, string PriExponent, string P, string DP, string Q, string DQ, string QInv)
        {
      
            RsaPrivateCrtKeyParameters rsaPrivateKeyStructure = new RsaPrivateCrtKeyParameters(
                new BigInteger(Modulus),
                new BigInteger(pubExponent),
                new BigInteger(PriExponent),
                new BigInteger(P),
                new BigInteger(Q),
                new BigInteger(DP),
                new BigInteger(DQ),
                new BigInteger(QInv)
                );
            return rsaPrivateKeyStructure;

        }
       
      
       

        /// <summary>
        /// 将私钥信息保存到文件中
        /// </summary>
        /// <param name="parameter">私钥</param>
        /// <param name="filename">文件路径</param>
         void SavePri(AsymmetricKeyParameter parameter,string filename)
        {

            RsaPrivateCrtKeyParameters pri = (RsaPrivateCrtKeyParameters)parameter;
           
            string modulus = pri.Modulus.ToString();
            string PubExponent =pri.PublicExponent.ToString();
            string priExponent = pri.Exponent.ToString();
            string p = pri.P.ToString();
            string dp = pri.DP.ToString();
            string q = pri.Q.ToString();
            string dq =pri.DQ.ToString();
            string qiv = pri.QInv.ToString();

            string prikey = modulus + "|" + PubExponent + "|" + priExponent + "|" + p + "|" + dp + "|" + q + "|" + dq +
                            "|" + qiv;
            byte[] prik = Encoding.GetEncoding("GB2312").GetBytes(prikey);
          
                FileStream fs = new FileStream(filename, FileMode.Create);
                fs.Write(prik, 0, prik.Length);

                fs.Close();
        
        }

      
        /// <summary>
        /// 读取私钥信息M
        /// </summary>
        /// <param name="filename">私钥文件路径</param>
        /// <returns>私钥M</returns>
         string readPriM(string filename)
        {
            int bufferlen = 0x8000;
            FileStream fs = new FileStream(filename, FileMode.Open);
            byte[] buff = new byte[bufferlen];
            int read = 0;
            int block;
            while ((block = fs.Read(buff, read, buff.Length - read)) > 0)
            {
                read = block + read;

                if (read == buff.Length)
                {
                    int nextbyte = fs.ReadByte();
                    if (nextbyte == -1)
                    {
                        string prikey = Encoding.GetEncoding("GB2312").GetString(buff);
                        string []priinfo =prikey.Split('|');

                        fs.Close();
                        return priinfo[0];
                    }
                    byte[] newbuf = new byte[buff.Length * 2];
                    Array.Copy(buff, newbuf, buff.Length);
                    newbuf[read] = (byte)nextbyte;
                    buff = newbuf;
                    read++;
                }
            }
            byte[] ret = new byte[read];
            Array.Copy(buff, ret, read);

            string prikey1 = Encoding.GetEncoding("GB2312").GetString(ret);
            string[] priinfo1 = prikey1.Split('|');
            fs.Close();
            return priinfo1[0];
       
        }

        /// <summary>
        /// 读取私钥信息公钥EX
        /// </summary>
        /// <param name="filename">私钥文件路径</param>
        /// <returns>私钥的公钥EX</returns>
         string readPriPUEX(string filename)
        {
            int bufferlen = 0x8000;
            FileStream fs = new FileStream(filename, FileMode.Open);
            byte[] buff = new byte[bufferlen];
            int read = 0;
            int block;
            while ((block = fs.Read(buff, read, buff.Length - read)) > 0)
            {
                read = block + read;

                if (read == buff.Length)
                {
                    int nextbyte = fs.ReadByte();
                    if (nextbyte == -1)
                    {
                        string prikey = Encoding.GetEncoding("GB2312").GetString(buff);
                        string[] priinfo = prikey.Split('|');
                        fs.Close();

                        return priinfo[1];
                    }
                    byte[] newbuf = new byte[buff.Length * 2];
                    Array.Copy(buff, newbuf, buff.Length);
                    newbuf[read] = (byte)nextbyte;
                    buff = newbuf;
                    read++;
                }
            }
            byte[] ret = new byte[read];
            Array.Copy(buff, ret, read);

            string prikey1 = Encoding.GetEncoding("GB2312").GetString(ret);
            string[] priinfo1 = prikey1.Split('|');
            fs.Close();
            return priinfo1[1];

        }
        /// <summary>
        /// 读取私钥的私钥EX
        /// </summary>
        /// <param name="filename">私钥文件路径</param>
        /// <returns>私钥的私钥EX</returns>
         string readPriEX(string filename)
        {
            int bufferlen = 0x8000;
            FileStream fs = new FileStream(filename, FileMode.Open);
            byte[] buff = new byte[bufferlen];
            int read = 0;
            int block;
            while ((block = fs.Read(buff, read, buff.Length - read)) > 0)
            {
                read = block + read;

                if (read == buff.Length)
                {
                    int nextbyte = fs.ReadByte();
                    if (nextbyte == -1)
                    {
                        string prikey = Encoding.GetEncoding("GB2312").GetString(buff);
                        string[] priinfo = prikey.Split('|');
                        fs.Close();

                        return priinfo[2];
                    }
                    byte[] newbuf = new byte[buff.Length * 2];
                    Array.Copy(buff, newbuf, buff.Length);
                    newbuf[read] = (byte)nextbyte;
                    buff = newbuf;
                    read++;
                }
            }
            byte[] ret = new byte[read];
            Array.Copy(buff, ret, read);

            string prikey1 = Encoding.GetEncoding("GB2312").GetString(ret);
            string[] priinfo1 = prikey1.Split('|');
            fs.Close();
            return priinfo1[2];

        }
        /// <summary>
        /// 读取私钥信息P
        /// </summary>
        /// <param name="filename">私钥文件路径</param>
        /// <returns>私钥P</returns>
         string readPriP(string filename)
        {
            int bufferlen = 0x8000;
            FileStream fs = new FileStream(filename, FileMode.Open);
            byte[] buff = new byte[bufferlen];
            int read = 0;
            int block;
            while ((block = fs.Read(buff, read, buff.Length - read)) > 0)
            {
                read = block + read;

                if (read == buff.Length)
                {
                    int nextbyte = fs.ReadByte();
                    if (nextbyte == -1)
                    {
                        string prikey = Encoding.GetEncoding("GB2312").GetString(buff);
                        string[] priinfo = prikey.Split('|');

                        fs.Close();
                        return priinfo[3];
                    }
                    byte[] newbuf = new byte[buff.Length * 2];
                    Array.Copy(buff, newbuf, buff.Length);
                    newbuf[read] = (byte)nextbyte;
                    buff = newbuf;
                    read++;
                }
            }
            byte[] ret = new byte[read];
            Array.Copy(buff, ret, read);

            string prikey1 = Encoding.GetEncoding("GB2312").GetString(ret);
            string[] priinfo1 = prikey1.Split('|');
            fs.Close();
            return priinfo1[3];

        }
        /// <summary>
        /// 读取私钥信息DP
        /// </summary>
        /// <param name="filename">私钥文件路径</param>
        /// <returns>私钥DP</returns>
         string readPriDP(string filename)
        {
            int bufferlen = 0x8000;
            FileStream fs = new FileStream(filename, FileMode.Open);
            byte[] buff = new byte[bufferlen];
            int read = 0;
            int block;
            while ((block = fs.Read(buff, read, buff.Length - read)) > 0)
            {
                read = block + read;

                if (read == buff.Length)
                {
                    int nextbyte = fs.ReadByte();
                    if (nextbyte == -1)
                    {
                        string prikey = Encoding.GetEncoding("GB2312").GetString(buff);
                        string[] priinfo = prikey.Split('|');
                        fs.Close();

                        return priinfo[4];
                    }
                    byte[] newbuf = new byte[buff.Length * 2];
                    Array.Copy(buff, newbuf, buff.Length);
                    newbuf[read] = (byte)nextbyte;
                    buff = newbuf;
                    read++;
                }
            }
            byte[] ret = new byte[read];
            Array.Copy(buff, ret, read);

            string prikey1 = Encoding.GetEncoding("GB2312").GetString(ret);
            string[] priinfo1 = prikey1.Split('|');
            fs.Close();
            return priinfo1[4];

        }
        /// <summary>
        /// 读取私钥信息Q
        /// </summary>
        /// <param name="filename">私钥文件路径</param>
        /// <returns>私钥Q</returns>
         string readPriQ(string filename)
        {
            int bufferlen = 0x8000;
            FileStream fs = new FileStream(filename, FileMode.Open);
            byte[] buff = new byte[bufferlen];
            int read = 0;
            int block;
            while ((block = fs.Read(buff, read, buff.Length - read)) > 0)
            {
                read = block + read;

                if (read == buff.Length)
                {
                    int nextbyte = fs.ReadByte();
                    if (nextbyte == -1)
                    {
                        string prikey = Encoding.GetEncoding("GB2312").GetString(buff);
                        string[] priinfo = prikey.Split('|');
                        fs.Close();

                        return priinfo[5];
                    }
                    byte[] newbuf = new byte[buff.Length * 2];
                    Array.Copy(buff, newbuf, buff.Length);
                    newbuf[read] = (byte)nextbyte;
                    buff = newbuf;
                    read++;
                }
            }
            byte[] ret = new byte[read];
            Array.Copy(buff, ret, read);

            string prikey1 = Encoding.GetEncoding("GB2312").GetString(ret);
            string[] priinfo1 = prikey1.Split('|');
            fs.Close();
            return priinfo1[5];

        }
        /// <summary>
        /// 读取私钥信息DQ
        /// </summary>
        /// <param name="filename">私钥文件路径</param>
        /// <returns>私钥DQ</returns>
         string readPriDQ(string filename)
        {
            int bufferlen = 0x8000;
            FileStream fs = new FileStream(filename, FileMode.Open);
            byte[] buff = new byte[bufferlen];
            int read = 0;
            int block;
            while ((block = fs.Read(buff, read, buff.Length - read)) > 0)
            {
                read = block + read;

                if (read == buff.Length)
                {
                    int nextbyte = fs.ReadByte();
                    if (nextbyte == -1)
                    {
                        string prikey = Encoding.GetEncoding("GB2312").GetString(buff);
                        string[] priinfo = prikey.Split('|');

                        fs.Close();
                        return priinfo[6];
                    }
                    byte[] newbuf = new byte[buff.Length * 2];
                    Array.Copy(buff, newbuf, buff.Length);
                    newbuf[read] = (byte)nextbyte;
                    buff = newbuf;
                    read++;
                }
            }
            byte[] ret = new byte[read];
            Array.Copy(buff, ret, read);

            string prikey1 = Encoding.GetEncoding("GB2312").GetString(ret);
            string[] priinfo1 = prikey1.Split('|');
            fs.Close();
            return priinfo1[6];

        }
        /// <summary>
        /// 读取私钥信息QIVN
        /// </summary>
        /// <param name="filename">私钥文件路径</param>
        /// <returns>私钥QIVN</returns>
         string readPriQIV(string filename)
        {
            int bufferlen = 0x8000;
            FileStream fs = new FileStream(filename, FileMode.Open);
            byte[] buff = new byte[bufferlen];
            int read = 0;
            int block;
            while ((block = fs.Read(buff, read, buff.Length - read)) > 0)
            {
                read = block + read;

                if (read == buff.Length)
                {
                    int nextbyte = fs.ReadByte();
                    if (nextbyte == -1)
                    {
                        string prikey = Encoding.GetEncoding("GB2312").GetString(buff);
                        string[] priinfo = prikey.Split('|');

                        fs.Close();
                        return priinfo[7];
                    }
                    byte[] newbuf = new byte[buff.Length * 2];
                    Array.Copy(buff, newbuf, buff.Length);
                    newbuf[read] = (byte)nextbyte;
                    buff = newbuf;
                    read++;
                }
            }
            byte[] ret = new byte[read];
            Array.Copy(buff, ret, read);

            string prikey1 = Encoding.GetEncoding("GB2312").GetString(ret);
            string[] priinfo1 = prikey1.Split('|');
            fs.Close();
            return priinfo1[7];

        }

        #endregion


        /// <summary>
        /// 创建对称密钥
        /// </summary>
        /// <returns>对称密钥</returns>
        public string CreatKey()
        {
            string str = "1234567890abcdefghijklmnopqrstuvwxyz";

            Random R = new Random();
            int maxIndex = str.Length - 1;
            string recal = "";
            for (int i = 0; i < 16; i++)
            {
                int currentIndex = R.Next(maxIndex);
                string charStr = str[currentIndex].ToString();
                recal = recal + charStr;
            }

            return recal;
        }

        #region AES加密函数


        /// <summary>
        /// AES加密
        /// </summary>
        /// <param name="Data">需要加密的数据</param>
        /// <param name="Key">AES密钥</param>
        /// <returns>秘文</returns>
        public byte[] AESEncrypt(byte[] Data, String Key)
        {
            byte[] bKey = Encoding.GetEncoding("GB2312").GetBytes(Key);

            Rijndael Aes = Rijndael.Create();


            Aes.Key = bKey;
            Aes.Mode = CipherMode.ECB;
            Aes.Padding = PaddingMode.PKCS7;
            byte[] Cryptograph = null; // 加密后的密文

            ICryptoTransform i = Aes.CreateEncryptor();
            Cryptograph = i.TransformFinalBlock(Data, 0, Data.Length);

          
            return Cryptograph;
        }

        /// <summary>
        /// AES加密
        /// </summary>
        /// <param name="Data">需要加密的数据</param>
        /// <param name="Key">AES密钥</param>
        /// <param name="DataLength">加密后的秘文长度</param>
        /// <returns>秘文</returns>
        public byte[] AESEncrypt(byte[] Data, String Key, out int DataLength)
        {
            byte[] bKey = Encoding.GetEncoding("GB2312").GetBytes(Key);

            Rijndael Aes = Rijndael.Create();


            Aes.Key = bKey;
            Aes.Mode = CipherMode.ECB;
            Aes.Padding = PaddingMode.PKCS7;
            byte[] Cryptograph = null; // 加密后的密文

            ICryptoTransform i = Aes.CreateEncryptor();
            Cryptograph = i.TransformFinalBlock(Data, 0, Data.Length);

            DataLength = Cryptograph.Length;
            return Cryptograph;
        }

        /// <summary>
        /// 返回数据加密后的长度信息
        /// </summary>
        /// <param name="Data">需要加密的数据</param>
        /// <param name="Key">AES密钥</param>
        /// <returns>加密后数据的长度</returns>
        public int AESEncryptLength(byte[] Data, String Key)
        {
            byte[] bKey = Encoding.GetEncoding("GB2312").GetBytes(Key);

            Rijndael Aes = Rijndael.Create();


            Aes.Key = bKey;
            Aes.Mode = CipherMode.ECB;
            Aes.Padding = PaddingMode.PKCS7;
            byte[] Cryptograph = null; // 加密后的密文

            ICryptoTransform i = Aes.CreateEncryptor();
            Cryptograph = i.TransformFinalBlock(Data, 0, Data.Length);


            return Cryptograph.Length;

        }

        #endregion

        #region AES解密

        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="Data">需要解密的数据</param>
        /// <param name="Key">AES密钥</param>
        /// <returns>解密后的明文</returns>
        public byte[] AESDecrypt(byte[] Data, String Key)
        {
            byte[] bKey = Encoding.GetEncoding("GB2312").GetBytes(Key);


            Rijndael Aes = Rijndael.Create();
            Aes.Key = bKey;
            Aes.Mode = CipherMode.ECB;
            Aes.Padding = PaddingMode.PKCS7;
            byte[] original = null; // 解密后的明文


            ICryptoTransform i = Aes.CreateDecryptor();
            original = i.TransformFinalBlock(Data, 0, Data.Length);
          
            return original;
        }

        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="Data">需要解密的数据</param>
        /// <param name="Key">AES密钥</param>
        /// <param name="DataLength">解密后的秘文长度</param>
        /// <returns>解密后的明文</returns>
        public byte[] AESDecrypt(byte[] Data, String Key, out int DataLength)
        {
            byte[] bKey = Encoding.GetEncoding("GB2312").GetBytes(Key);


            Rijndael Aes = Rijndael.Create();
            Aes.Key = bKey;
            Aes.Mode = CipherMode.ECB;
            Aes.Padding = PaddingMode.PKCS7;
            byte[] original = null; // 解密后的明文


            ICryptoTransform i = Aes.CreateDecryptor();
            original = i.TransformFinalBlock(Data, 0, Data.Length);
            DataLength = original.Length;
            return original;
        }

        /// <summary>
        /// 返回数据解密后的长度信息
        /// </summary>
        /// <param name="Data">需要解密的数据</param>
        /// <param name="Key">AES密钥</param>
        /// <returns>解密后数据的长度</returns>
        public int AESDecryptLength(byte[] Data, String Key)
        {
            byte[] bKey = Encoding.GetEncoding("GB2312").GetBytes(Key);


            Rijndael Aes = Rijndael.Create();
            Aes.Key = bKey;
            Aes.Mode = CipherMode.ECB;
            Aes.Padding = PaddingMode.PKCS7;
            byte[] original = null; // 解密后的明文


            ICryptoTransform i = Aes.CreateDecryptor();
            original = i.TransformFinalBlock(Data, 0, Data.Length);

            return original.Length;
        }
        #endregion

    }
}

转载于:https://www.cnblogs.com/lucifer890/archive/2011/07/06/2099329.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值