原文地址: http://www.cnblogs.com/chnking/archive/2007/08/14/855600.html

一、  对称加密

对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。

单钥密码系统的安全性依赖于以下两个因素:

第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。

第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。

DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。

DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

DES使用的密钥key为8字节,初始向量IV也是8字节。

TripleDES使用24字节的key,初始向量IV也是8字节。

两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。

本文测试源代码:/Files/chnking/TripleDESTest.rar

二、  加密解密过程

Figure 1. DES加密解密过程

上图是整个DES和TripleDES算法的加密解密过程,下面以TripleDES为例,结合dotnet分析加密解密的各个步骤,并给出相关实现代码。

1、 生成key和IV

System.Security.Cryptography. TripleDESCryptoServiceProvider类是dotnet中实现TripleDES算法的主要的类。

TripleDESCryptoServiceProvider类只有一个构造方法TripleDESCryptoServiceProvider(),这个方法把一些属性初始化:

KeySize(加密密钥长度,以位为单位)= 192(24字节)

BlockSize(加密处理的数据块大小,以位为单位)= 64(8字节)

FeedbackSize(加密数据块后返回的数据大小,以位为单位)= 64(8字节)

TripleDESCryptoServiceProvider构造方法同时会初始化一组随机的key和IV。

默认的TripleDESCryptoServiceProvider的key为24字节,IV为8字节,加密数据块为8字节。

生成key和IV的代码很简单:

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();

byte[] keyArray = tDESalg.Key;

byte[] IVArray = tDESalg.IV;

生成的key和IV在加密过程和解密过程都要使用。

2、 字符串明文转成某一代码页对应的编码字节流

待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。

// 待加密的字符串

string plainTextString = "Here is some data to encrypt. 这里是一些要加密的数据。";

// 使用utf-8编码(也可以使用其它的编码)

Encoding sEncoding = Encoding.GetEncoding("utf-8");

// 把字符串明文转换成utf-8编码的字节流

byte[] plainTextArray = sEncoding.GetBytes(plainTextString);

3、 加密操作

加密的原料是明文字节流,TripleDES算法对字节流进行加密,返回的是加密后的字节流。同时要给定加密使用的key和IV。

// 把字符串明文转换成utf-8编码的字节流

byte[] plainTextArray = sEncoding.GetBytes(plainTextString);

public static byte[] EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV)

{

// 建立一个MemoryStream,这里面存放加密后的数据流

MemoryStream mStream = new MemoryStream();

// 使用MemoryStream 和key、IV新建一个CryptoStream 对象

CryptoStream cStream = new CryptoStream(mStream,

new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),

CryptoStreamMode.Write);

// 将加密后的字节流写入到MemoryStream

cStream.Write(plainTextArray, 0, plainTextArray.Length);

//把缓冲区中的最后状态更新到MemoryStream,并清除cStream的缓存区

cStream.FlushFinalBlock();

// 把解密后的数据流转成字节流

byte[] ret = mStream.ToArray();

// 关闭两个streams.

cStream.Close();

mStream.Close();

return ret;

}

4、 解密操作

解密操作解密上面步骤生成的密文byte[],需要使用到加密步骤使用的同一组Key和IV。

// 调用解密方法,返回已解密数据的byte[]

byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray);

public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV)

{

// 建立一个MemoryStream,这里面存放加密后的数据流

MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray);

// 使用MemoryStream 和key、IV新建一个CryptoStream 对象

CryptoStream csDecrypt = new CryptoStream(msDecrypt,

new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV),

CryptoStreamMode.Read);

// 根据密文byte[]的长度(可能比加密前的明文长),新建一个存放解密后明文的byte[]

byte[] DecryptDataArray = new byte[EncryptedDataArray.Length];

// 把解密后的数据读入到DecryptDataArray

csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length);

msDecrypt.Close();

csDecrypt.Close();

return DecryptDataArray;

}

有一点需要注意,DES加密是以数据块为单位加密的,8个字节一个数据块,如果待加密明byte[]的长度不是8字节的整数倍,算法先用值为“0”的byte补足8个字节,然后进行加密。所以加密后的密文长度一定是8的整数倍。这样的密文解密后如果补了0值的byte,则解密后这些0值的byte依然存在。比如上例中要加密的明文是:

“Here is some data to encrypt. 这里是一些要加密的数据。”

转成明文byte[]后是66个字节,DES算法就会补上6个0值的byte,补到72个字节。这样加密后再解密回来的密文byte[]解码后的字符串就是这样的:

"Here is some data to encrypt. 这里是一些要加密的数据。\0\0\0\0\0\0"

5、 从编码字节流转成字符串明文

// 使用前面定义的Encoding,utf-8的编码把byte[]转成字符串

plainTextString = sEncoding.GetString(finalPlainTextArray);

对称加密DES和TripleDES相关推荐

  1. [转载]对称加密DES和TripleDES

    一. 对称加密  对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码).因此,通信双方都必 ...

  2. 【加密】对称加密DES和非对称加密AES、数字签名|非对称加密--公钥和私钥的区别

    目录 对称加密DES和非对称加密AES.数字签名 对称加密 1.1 定义 1.2 优缺点 1.3 常用对称加密算法 非对称加密( Asymmetric Cryptography ) 非对称加密(现代加 ...

  3. 对称加密DES、3DES、AES的计算过程

    目录 一.流密码与分组密码 二.DES计算过程 密钥操作 明文操作 1)明文编排 2)16轮迭代 三.3DES 四.AES(也叫RIJNDAEL算法) State 密钥编排 循环4​​​​​​​轮  ...

  4. Java加密算法—对称加密(DES、AES)

    目录 1.概述 2.加密模式 2.1 ECB 2.2 CBC 3.填充模式 4.对称加密.解密实现 1.概述 对称加密就是采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,也称为单密 ...

  5. 密码篇——对称加密—DES

    目录 一.DES介绍 二.Feistel网络 1)一轮的具体步骤 2)三轮加密与解密 Feistel网络总结: 一.DES介绍 DES以64比特为一分组进行加解密(一般来说DES的密钥长度为64比特, ...

  6. 对称加密-DES解密

    使用 ctrl + alt + m 快捷键抽取代码 package com.leon.desaes;import com.sun.org.apache.xml.internal.security.ut ...

  7. 对称加密-DES加密

    示例代码 des加密算法 Cipher :文档 https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html#getInstan ...

  8. java对称加密(DES/DESESE/AES)的简单使用

    主类: /*** Created by cuboo on 2016/10/14.*/ public class Main {public static void main(String agrs[]) ...

  9. 古典密码学、DES对称加密、3DES对称加密知识总结和实验

    实验三.古典密码学.DES对称加密.3DES对称加密 一.古典密码学:当铺密码.培根密码.摩斯密码.键盘密码.与佛论禅 1.当铺密码: 解密"由人俱一口中"和"大中口由人 ...

最新文章

  1. Beta阶段总结博客(麻瓜制造者)
  2. 【Java】枚举(enum)机制 详解
  3. python怎么开发软件_怎么使用python进行软件开发
  4. 西北农林科技大学计算机老师 癌症,西北农林科大攻克苹果树“癌症”
  5. MySQL_数据库表结构的操作
  6. Python稳基修炼的经典案例3(计算机二级、初学者必须掌握的例题)
  7. Laravel 生态圈
  8. 医院药品管理系统丨医药商城系统(Java+Web+MySQL)
  9. 手把手带你玩转Spark机器学习-Spark的安装及使用
  10. 远程高效办公指南,每天都是能量满满的workaholism!
  11. OPC与三菱Q系列PLC通信
  12. 牛客网——athletes 表包含运动员姓名,年纪和代表国家。下面哪个查询可以找出代表每个国家最年轻的运动员情况?
  13. PhaserTape:把智能手机变成测距仪
  14. python爬取网易云音乐飙升榜音乐_Python爬虫实战,30行代码轻松爬取网易云音乐热歌榜...
  15. AQS与CLH相关论文学习系列(四)- AQS的设计思路
  16. 4 int、str类型(数据类型1)、type()
  17. Ubuntu18.04 安装QQ、Tim、微信与win无差异
  18. 最新-安装Windows与Ubuntu双系统
  19. 三相电网的共模与差模
  20. PHP使用PHPExcel读取excel表格

热门文章

  1. 脱胎于BTC的BCH,适合你的道路在哪里?
  2. MongoDB报表实例 -- 标签成员方案
  3. Android教你打造独一无二的刷新加载框架
  4. javascript var变量删除
  5. CCF201612-1 中间数(100分)
  6. 4.Ext JS Ext.data.Store本地过滤
  7. LVS负载均衡之ipvsadm部署安装(安装篇)
  8. DNS转发器引起的CDN访问缓慢
  9. 新概念英语第一册1-34课单词
  10. 微信分享,二次分享(移动web端)