.NET(C#):灵活运用CryptoStream,加密不是必须用CryptoStreamMode.Write

首先.NET中的ICryptoTransform是单向的,也就是只能从一个状态将数据转化成另一个状态,反之是不可以的。当然手动
操作ICryptoTransform还是比较繁琐的,通过CryptoStream可以更轻松地操作一个ICryptoTransform。由于
ICryptoTransform是单向的,所以加密解密这两个过程就需要两个ICryptoTransform,这个通过
SymmetricAlgorithm类的CreateEncryptor和CreateDecryptor方法来创建。而用CryptoStream操
作这两个ICryptoTransform时,往往加密就是用CryptoStreamMode.Write,解密则用Read,这个从名称上也是合情合
理的,但是其实CryptoStream的操作模式不是局限于这样的。

关于ICryptoTransform和CryptoStream的关系模式,可以看这个图:

其实所谓的Read和Write仅仅是把ICryptoTransform操作的两个数据状态换了个位置,最终操作仍然是将ICryptoTransform的源数据转换成目标数据(单向),只不过不同的模式操作不一样。

比如我们先使用CryptoStreamMode.Write来加密:

//+ using System.IO;
//+ using System.Security.Cryptography;
staticvoid Main()
{
using (var aes =Aes.Create())
{
var data =Encoding.Unicode.GetBytes("Mgen!");
Console.WriteLine(BitConverter.ToString(Encrypt_Write(aes.CreateEncryptor(), data).ToArray()));
}
}

staticMemoryStream Encrypt_Write(ICryptoTransform ict, byte[] data)
{
using (var ms =newMemoryStream())
using (var cstream =newCryptoStream(ms, ict, CryptoStreamMode.Write))
{
cstream.Write(data, 0, data.Length);
return ms;
}
}

用CryptoStreamMode.Read也可以完成加密:

//+ using System.IO;
//+ using System.Security.Cryptography;
staticvoid Main()
{
using (var aes =Aes.Create())
{
var data =Encoding.Unicode.GetBytes("Mgen!");
Console.WriteLine(BitConverter.ToString(Encrypt_Read(aes.CreateEncryptor(), data).ToArray()));
}
}

staticMemoryStream Encrypt_Read(ICryptoTransform ict, byte[] data)
{
using (var ms =newMemoryStream(data))
using (var cstream =newCryptoStream(ms, ict, CryptoStreamMode.Read))
using (var destMs =newMemoryStream())
{
byte[] buffer =newbyte[100];
int readLen;

while ((readLen = cstream.Read(buffer, 0, 100)) >0)
destMs.Write(buffer, 0, readLen);
return destMs;
}
}

两者都会成功加密数据,并输入:

DB-76-CA-5F-62-2C-59-C1-91-48-79-9F-10-B9-8E-2D

上面只讲了加密,解密也是完全一样的,CryptoStreamMode.Write或Read都可以解密!

转自:http://www.mgenware.com/blog/?p=96

.NET(C#):灵活运用CryptoStream,加密不是必须用CryptoStreamMode.Write,码迷,mamicode.com

时间: 2024-11-05 22:45:38

.NET(C#):灵活运用CryptoStream,加密不是必须用CryptoStreamMode.Write的相关文章

C#DES加密解密字符串

1.添加引用 using System.Security.Cryptography; using System.IO; 2.添加默认密匙向量 //默认密钥向量 private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; 3.添加加密解密类 /// <summary> /// DES加密字符串 /// </summary> /// <param name="encry

C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)

一:异或^简单加解密(数字类型) 1:原理: 异或用于比较两个二进制数的相应位,在执行按位"异或"运算时,如果两个二进制数的相应位都为1或者都为0,则返回0;如果两个二进制数的相应位其中一个为1另一个为0,则返回1. //对数字加密 int P_int_Num, P_int_Key;//定义两个值类型变量 string Encryptstr = (P_int_Num ^ P_int_Key).ToString();//加密数值 //对数字解密 int P_int_Key, P_int_

字符串的加密与解密(二)

二.可逆加密 以下的几种加密和解密均要添加对System.Security.Cryptography命名空间的引用: using System.Security.Cryptography; 1.DES public class DESDemo { /// <summary> /// 向量 /// 向量的长度为8位,也就是DES算法的块大小,经本人亲测,若小于8位程序会抛出异常, /// 若大于8位,则8位以后的不起作用. /// 字节数组里的值可以根据个人需要进行更改 /// 这个参数也可使用

加密解密大汇总

在项目开发中,出于系统安全考虑,我们总会想到使用加密解密进行处理.首先保证的一点就是数据被窃取后,不能使其正常阅读.其次,就是防止接口随意调用. (PS:鄙人目前就想到了这两点好处,如果还有什么优点,欢迎给位补充o(^▽^)o) 接下来就说几个常用的加密算法:DES加密算法,AES加密算法,RSA加密算法,Base64加密算法,MD5加密算法,SHA1加密算法 1.DES加密算法 加密方式---- 使用异或,置换,代换,移位四种基本运算进行16轮循环加密而成. 共分为一般加密和三重加密>> D

转发:C#加密方法汇总

转自:C#加密方法汇总 方法一: 1 //须添加对System.Web的引用 2 using System.Web.Security; 3 ... 4 /// <summary> 5 /// SHA1加密字符串 6 /// </summary> 7 /// <param name="source">源字符串</param> 8 /// <returns>加密后的字符串</returns> 9 public stri

点滴积累【C#】---对上传文件的路径进行加密,以免将路径暴露在浏览器上,避免一些安全隐患!

效果: 描述: 本事例是为解决在上传或下载文件时避免将路径暴露在外.在上传时将路径进行加密保存到DataTable或数据库中,在下载是再读取DataTable中加密数据进行解密下载. 代码: [前台代码] 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUpload.aspx.cs" Inherits="FilePathEncrypt.FileUplo

加密解密(处理密码)

/*用法 protected void Page_Load(object sender, EventArgs e) { //加密 this.Title = CEncrypt.DesEncrypt("pwd", CEncrypt.Key); this.Title += CEncrypt.DesDecrypt(this.Title, CEncrypt.Key); Response.Write(CEncrypt.DesDecrypt("gAYyhdLQunc=", CEn

asp.net中实现MD5加密、解密的方法

这个MD5加密.解密的方法会使用即可. 使用时的代码备忘:Response.Write(FormsAuthentication.HashPasswordForStoringInConfigFile("要加密的字符串", "MD5")); 以下是加密.解密的代码部分: /*用法 protected void Page_Load(object sender, EventArgs e) { //加密 this.Title = CEncrypt.DesEncrypt(&qu

WebApi实现通讯加密 (转)

http://www.cnblogs.com/jonneydong/p/WebApi_Encryption.html 一. 场景介绍: 如题如何有效的,最少量的现有代码侵入从而实现客户端与服务器之间的数据交换加密呢? 二. 探究: 1.需求分析 webapi服务端 有如下接口: public class ApiTestController : ApiController { // GET api/<controller>/5 public object Get(int id) { return