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;
}
}
}
- linux永久修改dns
- windows10安装python和mongodb搭建爬虫环境
- Web服务器的工作原理
- 程序员的未来
- windows2012服务器搭建mongodb并设置远程访问
- 腾讯地图开放H5定位API,率先支持iOS10
- 写让别人能读懂的代码
- 安装serverstatus监控多台服务器状态
- Windows2012搭建我的世界(Minecraft)服务器超简单
- 高效程序员的MacBook工作环境配置
- vsftpd搭建自己的ftp服务器
- Linux一键安装Transmission电影下载到服务器
- centos安装ab工具给网站进行压力测试
- ubuntu16.04安装mongodb教程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 写给自己的Object和Function的3个灵魂拷问
- 48. Vue路由-使用命名视图实现经典布局
- 47. Vue使用children属性实现路由嵌套
- RecyclerView的缓存机制和内存优化
- 使用Anchore Enine来完善DevSecOps工具链
- PyTorch版CenterNet训练自己的数据集
- SpringBoot2 整合FreeMarker模板,完成页面静态化处理
- PHP多文件上传格式化
- NDK开发案例 | C/C++调用java层代码
- 深入理解 SecurityConfigurer 【源码篇】
- Swift 属性
- Swift 类和结构体
- 使用深度学习和OpenCV的早期火灾检测系统
- 【时序预测】一文梳理时间序列预测——ARMA模型
- 三分钟Kubernetes-环境搭建篇