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
查看全文
相关阅读:
error C2955: “std::xx”: 使用 类 模板 需要 模板 参数列表
打印windows环境变量
自动化测试覆盖率要到多少才算足够
每个离谱的bug背后总有一个精彩绝伦的幕后故事
测试是整个开发过程的瓶颈吗
如何用指标去度量bug本身的质量情况
python : 将txt文件中的数据读为numpy数组或列表
Baxter+Kinect: Robot Teleoperation via Skeleton Tracking and Inverse Kinematics
安卓环境和配置
Qt开发经验小技巧181-185
原文地址:https://www.cnblogs.com/SummerRain/p/1005578.html
最新文章
[译]Pycharm文件不可编辑 read-only status?
[译] Invalid control character with Python json.loads 错误原因及解决方式?
prometheus监控之自动发现(转)
判断json中是否包含某个值(转)
linux 普通用户sudo 免密码 以及sudoers 配置详解
SecureCRT通过密钥进行SSH登录
elasticsearch启动成功后,本地可访问,远程不可访问
CentOS 7 将普通用户进行提升权限(转)
prometheus系列
Linux基础教程
热门文章
SqlServer 另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。
SpringBoot线程池,@Async 注解。实现主线程等待所有子线程执行完毕再结束。(转)
VS+Qt里QQuickWidget加载QML失败
Notepad将空格显示成点号
GRPC问题合集
boost单例模式
对象含有与成员函数不兼容的类型限定符
warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
fatal error C1071: 在注释中遇到意外的文件结束
VS + QT 出现 LNK2001 无法解析的外部符号 QMetaObject 的问题
Copyright © 2011-2022 走看看