PBE加密 .net 实现

时间:2022-07-24
本文章向大家介绍PBE加密 .net 实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
using System;
using System.Security.Cryptography;
using System.Text;

namespace Demo
{
    internal class PKCSKeyGenerator
    {
        byte[] key = new byte[8], iv = new byte[8];
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        public byte[] Key { get { return key; } }
        public byte[] IV { get { return iv; } }
        public ICryptoTransform Encryptor { get { return des.CreateEncryptor(key, iv); } }
        public ICryptoTransform Decryptor { get { return des.CreateDecryptor(key, iv); } }
        public PKCSKeyGenerator() { }
        public PKCSKeyGenerator(String keystring, byte[] salt, int md5iterations, int segments)
        {
            Generate(keystring, salt, md5iterations, segments);
        }
        public ICryptoTransform Generate(String keystring, byte[] salt, int md5iterations, int segments)
        {
            int HASHLENGTH = 16;
            byte[] keymaterial = new byte[HASHLENGTH * segments];
            byte[] psbytes;
            psbytes = Encoding.UTF8.GetBytes(keystring);
            byte[] data00 = new byte[psbytes.Length + salt.Length];
            Array.Copy(psbytes, data00, psbytes.Length);
            Array.Copy(salt, 0, data00, psbytes.Length, salt.Length);
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] result = null;
            byte[] hashtarget = new byte[HASHLENGTH + data00.Length];

            for (int j = 0; j < segments; j++)
            {
                if (j == 0)
                {
                    result = data00;
                }
                else
                {
                    Array.Copy(result, hashtarget, result.Length);
                    Array.Copy(data00, 0, hashtarget, result.Length, data00.Length);
                    result = hashtarget;
                }
                for (int i = 0; i < md5iterations; i++)
                {
                    result = md5.ComputeHash(result);
                }
                Array.Copy(result, 0, keymaterial, j * HASHLENGTH, result.Length);
            }
            Array.Copy(keymaterial, 0, key, 0, 8);
            Array.Copy(keymaterial, 8, iv, 0, 8);
            return Encryptor;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace Demo
{
    /// <summary>
    /// PBE加密
    /// </summary>
    public class PBE
    {
        /// <summary>
        /// 根据密码密钥和干扰盐值得到加密后的密文
        /// </summary>
        /// <param name="passWord">密码</param>
        /// <param name="passWordKey">加密key</param>
        /// <param name="salt">干扰盐</param>
        /// <returns></returns>
        public static String Encryption(String passWord, String passWordKey, string salt="00000000")
        {
            int count = 1000; 
            PKCSKeyGenerator cipher = new PKCSKeyGenerator(passWordKey, Encoding.UTF8.GetBytes(salt), count, 1);
            byte[] src = Encoding.UTF8.GetBytes(passWord);
            byte[] result = cipher.Encryptor.TransformFinalBlock(src, 0, src.Length);
            string ret = "";
            for (int i = 0; i < result.Length; i++)
            {
                ret += Convert.ToString(result[i], 16).PadLeft(2, '0');
            }
            return ret;
        }
    }
}