zoukankan
html css js c++ java
数据加密标准(DES)的C#实现(3)(将BitConverter.ToString的结果转回byte[])
/**/
/*
* 数据加密标准(DES)的C#实现(3)
* 将BitConverter.ToString的结果转回byte[]
*
* 采用随机的密钥Key和初始化向量IV加密
* 使用随机密码的好处:系统不会产生弱密钥
* 备注:本例与《数据加密标准(DES)的C#实现(2)》本质相同,只是采用BitConverter.ToString
* 输出密文、密钥和初始化向量,而不是采用Base64编码格式
*
*
* 夏春涛 Email:xChuntao@163.com
* Blog:
http://bluesky521.cnblogs.com
* 运行环境:.net2.0 framework
*/
/**/
/*
* 关于DES加密中的初始化向量IV:
* 对于给定的密钥 k,不使用初始化向量的简单块密码将同一个纯文本输入块加密为
* 同一个密码文本输出块。如果您的纯文本流中有重复块,则您的密码文本流中也会
* 有重复块。如果未经授权的用户知道了您的纯文本块结构的任何信息,他们就可以
* 利用该信息来解密已知的密码文本块,并有可能重新获得您的密钥。为了防止这个
* 问题,前一个块中的信息被混合到下一个块的加密过程中。这样一来,两个相同的
* 纯文本块的输出就变得不一样了。由于此技术使用前一个块加密下一个块,因此需
* 要初始化向量来加密数据的第一个块。
*/
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Security.Cryptography;
using
System.IO;
namespace
DES_App3
{
class
Program
{
static
void
Main(
string
[] args)
{
string
str_plain_text
=
"
How are you?
"
;
Console.WriteLine(
"
原文:
"
+
str_plain_text);
string
KEY_64
=
""
;
string
IV_64
=
""
;
string
str_cypher_text
=
DES_Encrypt(str_plain_text,
out
KEY_64,
out
IV_64);
Console.WriteLine(
"
密文:
"
+
str_cypher_text);
Console.WriteLine(
"
解密:
"
+
DES_Decrypt(str_cypher_text, KEY_64, IV_64));
Console.WriteLine(
"
本次密钥:
"
+
KEY_64);
Console.WriteLine(
"
本次初始化向量:
"
+
IV_64);
Console.WriteLine();
//
-------------------------------
str_cypher_text
=
DES_Encrypt(str_plain_text,
out
KEY_64,
out
IV_64,
false
);
Console.WriteLine(
"
密文:
"
+
str_cypher_text);
Console.WriteLine(
"
解密:
"
+
DES_Decrypt(str_cypher_text, KEY_64, IV_64));
Console.WriteLine(
"
本次密钥:
"
+
KEY_64);
Console.WriteLine(
"
本次初始化向量:
"
+
IV_64);
Console.WriteLine();
}
//
将BitConverter.ToString字符串,如"98-ED-0S-9A",还原转换为byte[]
static
public
byte
[] BitStr_ToBytes(
string
bit_str)
{
string
[] arrSplit
=
bit_str.Split(
'
-
'
);
byte
[] byteTemp
=
new
byte
[arrSplit.Length];
for
(
int
i
=
0
; i
<
byteTemp.Length; i
++
)
{
byteTemp[i]
=
byte
.Parse(arrSplit[i], System.Globalization.NumberStyles.AllowHexSpecifier);
}
return
byteTemp;
}
//
将BitConverter.ToString字符串(不含'-'),如"98ED0S9A",还原转换为byte[]
static
public
byte
[] BitStr_ToBytes2(
string
bit_str)
{
int
n
=
bit_str.Length
/
2
-
1
;
for
(
int
i
=
n; i
>
0
; i
--
)
{
bit_str
=
bit_str.Insert(i
*
2
,
"
-
"
);
}
return
BitStr_ToBytes(bit_str);
}
//
----
DES加密/解密
#region
DES加密/解密
/**/
///
<summary>
///
DES加密
///
</summary>
///
<param name="str_plain_text">
明文
</param>
///
<param name="str_des_key">
密钥,8个字符(64bit)
</param>
///
<param name="str_des_iv">
初始向量,8个字符(64bit)
</param>
///
<param name="hasSubSign">
输出密文、str_des_key和str_des_iv时,是否保留BitConvert.ToString中的减号
</param>
///
<returns>
密文
</returns>
static
public
string
DES_Encrypt(
string
str_plain_text,
out
string
str_des_key,
out
string
str_des_iv,
bool
hasSubSign)
{
string
str_cypher_text
=
""
;
DESCryptoServiceProvider cryptoProvider
=
new
DESCryptoServiceProvider();
MemoryStream ms
=
new
MemoryStream();
CryptoStream cst
=
new
CryptoStream(ms, cryptoProvider.CreateEncryptor(), CryptoStreamMode.Write);
StreamWriter sw
=
new
StreamWriter(cst);
sw.Write(str_plain_text);
sw.Flush();
cst.FlushFinalBlock();
sw.Flush();
//
-----
str_cypher_text
=
BitConverter.ToString(ms.GetBuffer(),
0
,(
int
)ms.Length);
//
**
str_des_key
=
BitConverter.ToString(cryptoProvider.Key);
//
**
str_des_iv
=
BitConverter.ToString(cryptoProvider.IV);
//
**
if
(
!
hasSubSign)
{
str_cypher_text
=
str_cypher_text.Replace(
"
-
"
,
""
);
str_des_key
=
str_des_key.Replace(
"
-
"
,
""
);
str_des_iv
=
str_des_iv.Replace(
"
-
"
,
""
);
}
return
str_cypher_text;
}
static
public
string
DES_Encrypt(
string
str_plain_text,
out
string
str_des_key,
out
string
str_des_iv)
{
return
DES_Encrypt(str_plain_text,
out
str_des_key,
out
str_des_iv,
true
);
}
/**/
///
<summary>
///
DES解密
///
</summary>
///
<param name="str_cypher_text">
密文
</param>
///
<param name="str_des_key">
密钥,8个字符(64bit)
</param>
///
<param name="str_des_iv">
初始向量,8个字符(64bit)
</param>
///
<returns>
明文
</returns>
static
public
string
DES_Decrypt(
string
str_cypher_text,
string
str_des_key,
string
str_des_iv)
{
byte
[] byKey;
byte
[] byIV;
byte
[] byEnc;
try
{
if
(str_cypher_text.IndexOf(
'
-
'
)
>
0
&&
str_des_key.IndexOf(
'
-
'
)
>
0
&&
str_des_iv.IndexOf(
'
-
'
)
>
0
)
//
有"-"号
{
byKey
=
BitStr_ToBytes(str_des_key);
byIV
=
BitStr_ToBytes(str_des_iv);
byEnc
=
BitStr_ToBytes(str_cypher_text);
}
else
//
无"-"号
{
byKey
=
BitStr_ToBytes2(str_des_key);
byIV
=
BitStr_ToBytes2(str_des_iv);
byEnc
=
BitStr_ToBytes2(str_cypher_text);
}
}
catch
{
return
null
;
}
DESCryptoServiceProvider cryptoProvider
=
new
DESCryptoServiceProvider();
MemoryStream ms
=
new
MemoryStream(byEnc);
CryptoStream cst
=
new
CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
StreamReader sr
=
new
StreamReader(cst);
string
str_plain_text
=
sr.ReadToEnd();
return
str_plain_text;
}
#endregion
}
}
源码附件:
/Files/bluesky521/DES_Hash_Demo.rar
查看全文
相关阅读:
兼容多浏览器的网页复制插件(ZeroClipboard)
兼容主流浏览器的css渐变色
如何让字体随窗口缩放自动调整大小
使用javascript实现html页面直接下载网盘文件
360随身wifi隐藏ssid方法
javascript特效——烟花燃放的效果[xyytit]
JavaScript数组定义
常用特殊符号的HTML代码(HTML字符实体)
9.JAVA之GUI编程列出指定目录内容
8.JAVA之GUI编程键盘码查询器
原文地址:https://www.cnblogs.com/SummerRain/p/1005578.html
最新文章
JAVA利用Zip4j解压缩【转】
Centos6.4 yum安装MariaDB5.5
JAVA 获取jdbc.properties配置信息
JAVA计算文件大小
JAVA7遍历文件夹
JAVA获取两个List<String>中不同的数据
This function has none of DETERMINISTIC, NO SQL 解决办法
让ORACLE LIKE 时不区分大小写
生产环境下一定要开启mysqlbinlog
JavaScript 网页链接调用Android程序
热门文章
Android 中Java和JavaScript交互入门
Android 图片处理效果集
Android 利用摄像头指尖测试心率
Android 实现GIF播放(解码)
Android 逆向工程之步骤
ExpandableListView 箭头样式
Android 开发之Matrix图片处理类的使用
Android 内部存储安装apk文件实现
Android 汉字转拼音之工具篇
兼容多浏览器的html圆角特效
Copyright © 2011-2022 走看看