NET实现RSA AES DES 字符串 加密解密以及SHA1 MD5加密
本文列举了 数据加密算法(Data Encryption Algorithm,DEA) 密码学中的高级加密标准(Advanced EncryptionStandard,AES)RSA公钥加密算法 的加密解密 .NET实现以及 安全哈希算法(Secure Hash Algorithm)和MD5的实现。
实现如下
using System;
usingSystem.Security.Cryptography;
usingSystem.IO;
usingSystem.Text;
usingSystem.Globalization;
usingSystem.Xml.Linq;
usingSystem.Collections.Generic;
namespaceEncriptSample
{
/// <summary>
/// 加密、解密
/// </summary>
class Encrypter
{
//DES默认密钥向量
private static byte[] DES_IV = { 0x12,0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
//AES默认密钥向量
public static readonly byte[] AES_IV ={ 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90,0xAB, 0xCD, 0xEF };
#region MD5
/// <summary>
/// MD5加密为32字符长度的16进制字符串
/// </summary>
/// <paramname="input"></param>
/// <returns></returns>
public static stringEncryptByMD5(string input)
{
MD5 md5Hasher = MD5.Create();
byte[] data =md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder sBuilder = newStringBuilder();
//将每个字节转为16进制
for (int i = ; i < data.Length;i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}
#endregion
#region SHA1
/// <summary>
/// SHA1加密
/// </summary>
/// <paramname="input"></param>
/// <returns></returns>
public static stringEncryptBySHA1(string input)
{
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] bytes =Encoding.Unicode.GetBytes(input);
byte[] result =sha.ComputeHash(bytes);
returnBitConverter.ToString(result);
}
#endregion
#region DES
/// <summary>
/// 加密方法
/// </summary>
/// <paramname="input"></param>
/// <paramname="key"></param>
/// <returns></returns>
public static stringEncryptByDES(string input, string key)
{
byte[] inputBytes =Encoding.UTF8.GetBytes(input); //Encoding.UTF8.GetBytes(input);
byte[] keyBytes =ASCIIEncoding.UTF8.GetBytes(key);
byte[] encryptBytes =EncryptByDES(inputBytes, keyBytes, keyBytes);
//string result =Encoding.UTF8.GetString(encryptBytes); //无法解码,其加密结果中文出现乱码:d\"?e????(??uπ?W??-??,_?\nJn7
//原因:如果明文为中文,UTF8编码两个字节标识一个中文字符,但是加密后,两个字节密文,不一定还是中文字符。
using (DES des = newDESCryptoServiceProvider())
{
using (MemoryStream ms = newMemoryStream())
{
using (CryptoStream cs =new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
using (StreamWriterwriter = new StreamWriter(cs))
{
writer.Write(inputBytes);
}
}
}
}
string result =Convert.ToBase64String(encryptBytes);
return result;
}
/// <summary>
/// DES加密
/// </summary>
/// <paramname="inputBytes">输入byte数组</param>
/// <param name="key">密钥,只能是英文字母或数字</param>
/// <param name="IV">偏移向量</param>
/// <returns></returns>
public static byte[]EncryptByDES(byte[] inputBytes, byte[] key, byte[] IV)
{
DES des = newDESCryptoServiceProvider();
//建立加密对象的密钥和偏移量
des.Key = key;
des.IV = IV;
string result = string.Empty;
//1、如果通过CryptoStreamMode.Write方式进行加密,然后CryptoStreamMode.Read方式进行解密,解密成功。
using (MemoryStream ms = newMemoryStream())
{
using (CryptoStream cs = newCryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(inputBytes, ,inputBytes.Length);
}
return ms.ToArray();
}
//2、如果通过CryptoStreamMode.Write方式进行加密,然后再用CryptoStreamMode.Write方式进行解密,可以得到正确结果
//3、如果通过CryptoStreamMode.Read方式进行加密,然后再用CryptoStreamMode.Read方式进行解密,无法解密,Error:要解密的数据的长度无效。
//4、如果通过CryptoStreamMode.Read方式进行加密,然后再用CryptoStreamMode.Write方式进行解密,无法解密,Error:要解密的数据的长度无效。
//using (MemoryStream ms = newMemoryStream(inputBytes))
//{
// using (CryptoStream cs = newCryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Read))
// {
// using (StreamReader reader = newStreamReader(cs))
// {
// result = reader.ReadToEnd();
// returnEncoding.UTF8.GetBytes(result);
// }
// }
//}
}
/// <summary>
/// 解密
/// </summary>
/// <paramname="input"></param>
/// <paramname="key"></param>
/// <returns></returns>
public static stringDecryptByDES(string input, string key)
{
//UTF8无法解密,Error:要解密的数据的长度无效。
//byte[] inputBytes =Encoding.UTF8.GetBytes(input);//UTF8乱码,见加密算法
byte[] inputBytes =Convert.FromBase64String(input);
byte[] keyBytes =ASCIIEncoding.UTF8.GetBytes(key);
byte[] resultBytes = DecryptByDES(inputBytes,keyBytes, keyBytes);
string result =Encoding.UTF8.GetString(resultBytes);
return result;
}
/// <summary>
/// 解密方法
/// </summary>
/// <param name="inputBytes"></param>
/// <paramname="key"></param>
/// <paramname="iv"></param>
/// <returns></returns>
public static byte[]DecryptByDES(byte[] inputBytes, byte[] key, byte[] iv)
{
DESCryptoServiceProvider des = newDESCryptoServiceProvider();
//建立加密对象的密钥和偏移量,此值重要,不能修改
des.Key = key;
des.IV = iv;
//通过write方式解密
//using (MemoryStream ms = newMemoryStream())
//{
// using (CryptoStream cs = newCryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
// {
// cs.Write(inputBytes, 0,inputBytes.Length);
// }
// return ms.ToArray();
//}
//通过read方式解密
using (MemoryStream ms = newMemoryStream(inputBytes))
{
using (CryptoStream cs = newCryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read))
{
using (StreamReader reader = newStreamReader(cs))
{
string result =reader.ReadToEnd();
returnEncoding.UTF8.GetBytes(result);
}
}
}
//错误写法,注意哪个是输出流的位置,如果范围ms,与原文不一致。
//using (MemoryStream ms = newMemoryStream(inputBytes))
//{
// using (CryptoStream cs = newCryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read))
// {
// cs.Read(inputBytes, 0,inputBytes.Length);
// }
// return ms.ToArray();
//}
}
/// <summary>
/// 加密字符串
/// </summary>
/// <param name="input"></param>
/// <paramname="sKey"></param>
/// <returns></returns>
public static stringEncryptString(string input, string sKey)
{
byte[] data =Encoding.UTF8.GetBytes(input);
using (DESCryptoServiceProvider des= new DESCryptoServiceProvider())
{
des.Key =ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV =ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = des.CreateEncryptor();
byte[] result =desencrypt.TransformFinalBlock(data, , data.Length);
returnBitConverter.ToString(result);
}
}
/// <summary>
/// 解密字符串
/// </summary>
/// <paramname="input"></param>
/// <paramname="sKey"></param>
/// <returns></returns>
public static stringDecryptString(string input, string sKey)
{
string[] sInput =input.Split("-".ToCharArray());
byte[] data = new byte[sInput.Length];
for (int i = ; i <sInput.Length; i++)
{
data[i] = byte.Parse(sInput[i],NumberStyles.HexNumber);
}
using (DESCryptoServiceProvider des= new DESCryptoServiceProvider())
{
des.Key =ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV =ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt =des.CreateDecryptor();
byte[] result =desencrypt.TransformFinalBlock(data, , data.Length);
returnEncoding.UTF8.GetString(result);
}
}
#endregion
#region AES
/// <summary>
/// AES加密算法
/// </summary>
/// <paramname="input">明文字符串</param>
/// <param name="key">密钥</param>
/// <returns>字符串</returns>
public static stringEncryptByAES(string input, string key)
{
byte[] keyBytes =Encoding.UTF8.GetBytes(key.Substring(, ));
using (AesCryptoServiceProvideraesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = keyBytes;
aesAlg.IV = AES_IV;
ICryptoTransform encryptor =aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt =new MemoryStream())
{
using (CryptoStreamcsEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriterswEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(input);
}
byte[] bytes =msEncrypt.ToArray();
//returnConvert.ToBase64String(bytes);//此方法不可用
returnBitConverter.ToString(bytes);
}
}
}
}
/// <summary>
/// AES解密
/// </summary>
/// <paramname="input">密文字节数组</param>
/// <param name="key">密钥</param>
/// <returns>返回解密后的字符串</returns>
public static stringDecryptByAES(string input, string key)
{
//byte[] inputBytes =Convert.FromBase64String(input); //Encoding.UTF8.GetBytes(input);
string[] sInput =input.Split("-".ToCharArray());
byte[] inputBytes = newbyte[sInput.Length];
for (int i = ; i <sInput.Length; i++)
{
inputBytes[i] =byte.Parse(sInput[i], NumberStyles.HexNumber);
}
byte[] keyBytes =Encoding.UTF8.GetBytes(key.Substring(, ));
using (AesCryptoServiceProvideraesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = keyBytes;
aesAlg.IV = AES_IV;
ICryptoTransform decryptor =aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt =new MemoryStream(inputBytes))
{
using (CryptoStreamcsEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReadersrEncrypt = new StreamReader(csEncrypt))
{
returnsrEncrypt.ReadToEnd();
}
}
}
}
}
/// <summary>
/// AES加密
/// </summary>
/// <param name="inputdata">输入的数据</param>
/// <param name="iv">向量128位</param>
/// <param name="strKey">加密密钥</param>
/// <returns></returns>
public static byte[]EncryptByAES(byte[] inputdata, byte[] key, byte[] iv)
{
////分组加密算法
//Aes aes = newAesCryptoServiceProvider();
////设置密钥及密钥向量
//aes.Key = key;
//aes.IV = iv;
//using (MemoryStream ms = newMemoryStream())
//{
// using (CryptoStream cs = newCryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
// {
// using (StreamWriter writer = newStreamWriter(cs))
// {
// writer.Write(inputdata);
// }
// return ms.ToArray();
// }
//}
using (AesCryptoServiceProvideraesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = key;
aesAlg.IV = iv;
ICryptoTransform encryptor =aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt =new MemoryStream())
{
using (CryptoStreamcsEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriterswEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(inputdata);
}
byte[] encrypted =msEncrypt.ToArray();
return encrypted;
}
}
}
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="inputdata">输入的数据</param>
/// <param name="key">key</param>
/// <param name="iv">向量128</param>
/// <returns></returns>
public static byte[]DecryptByAES(byte[] inputBytes, byte[] key, byte[] iv)
{
Aes aes = newAesCryptoServiceProvider();
aes.Key = key;
aes.IV = iv;
byte[] decryptBytes;
using (MemoryStream ms = newMemoryStream(inputBytes))
{
using (CryptoStream cs = newCryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read))
{
using (StreamReader reader= new StreamReader(cs))
{
string result =reader.ReadToEnd();
decryptBytes =Encoding.UTF8.GetBytes(result);
}
}
}
return decryptBytes;
}
#endregion
#region DSA
#endregion
#region RSA
/// <summary>
/// RSA加密
/// </summary>
/// <paramname="plaintext">明文</param>
/// <paramname="publicKey">公钥</param>
/// <returns>密文字符串</returns>
public static stringEncryptByRSA(string plaintext, string publicKey)
{
UnicodeEncoding ByteConverter = newUnicodeEncoding();
byte[] dataToEncrypt =ByteConverter.GetBytes(plaintext);
using (RSACryptoServiceProvider RSA= new RSACryptoServiceProvider())
{
RSA.FromXmlString(publicKey);
byte[] encryptedData =RSA.Encrypt(dataToEncrypt, false);
return Convert.ToBase64String(encryptedData);
}
}
/// <summary>
/// RSA解密
/// </summary>
/// <paramname="ciphertext">密文</param>
/// <paramname="privateKey">私钥</param>
/// <returns>明文字符串</returns>
public static stringDecryptByRSA(string ciphertext, string privateKey)
{
UnicodeEncoding byteConverter = newUnicodeEncoding();
using (RSACryptoServiceProvider RSA= new RSACryptoServiceProvider())
{
RSA.FromXmlString(privateKey);
byte[] encryptedData =Convert.FromBase64String(ciphertext);
byte[] decryptedData =RSA.Decrypt(encryptedData, false);
returnbyteConverter.GetString(decryptedData);
}
}
//public static string signByRSA(stringplaintext, string privateKey)
//{
// UnicodeEncoding ByteConverter = new UnicodeEncoding();
// byte[] dataToEncrypt = ByteConverter.GetBytes(plaintext);
// using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
// {
// RSA.FromXmlString(privateKey);
// byte[] encryptedData =RSA.SignData(dataToEncrypt,);
// return Convert.ToBase64String(encryptedData);
// }
//}
/// <summary>
/// 数字签名
/// </summary>
/// <paramname="plaintext">原文</param>
/// <paramname="privateKey">私钥</param>
/// <returns>签名</returns>
public static stringHashAndSignString(string plaintext, string privateKey)
{
UnicodeEncoding ByteConverter = newUnicodeEncoding();
byte[] dataToEncrypt =ByteConverter.GetBytes(plaintext);
using (RSACryptoServiceProviderRSAalg = new RSACryptoServiceProvider())
{
RSAalg.FromXmlString(privateKey);
//使用SHA1进行摘要算法,生成签名
byte[] encryptedData =RSAalg.SignData(dataToEncrypt, new SHA1CryptoServiceProvider());
returnConvert.ToBase64String(encryptedData);
}
}
/// <summary>
/// 验证签名
/// </summary>
/// <paramname="plaintext">原文</param>
/// <paramname="SignedData">签名</param>
/// <paramname="publicKey">公钥</param>
/// <returns></returns>
public static bool VerifySigned(stringplaintext, string SignedData, string publicKey)
{
using (RSACryptoServiceProviderRSAalg = new RSACryptoServiceProvider())
{
RSAalg.FromXmlString(publicKey);
UnicodeEncoding ByteConverter =new UnicodeEncoding();
byte[] dataToVerifyBytes =ByteConverter.GetBytes(plaintext);
byte[] signedDataBytes =Convert.FromBase64String(SignedData);
returnRSAalg.VerifyData(dataToVerifyBytes, new SHA1CryptoServiceProvider(),signedDataBytes);
}
}
/// <summary>
/// 获取Key
/// 键为公钥,值为私钥
/// </summary>
/// <returns></returns>
public static KeyValuePair<string,string> CreateRSAKey()
{
RSACryptoServiceProvider RSA = newRSACryptoServiceProvider();
string privateKey =RSA.ToXmlString(true);
string publicKey =RSA.ToXmlString(false);
return new KeyValuePair<string,string>(publicKey, privateKey);
}
#endregion
#region other
/// <summary>
///
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static byte[] GetBytes(stringinput)
{
string[] sInput =input.Split("-".ToCharArray());
byte[] inputBytes = newbyte[sInput.Length];
for (int i = ; i <sInput.Length; i++)
{
inputBytes[i] =byte.Parse(sInput[i], NumberStyles.HexNumber);
}
return inputBytes;
}
#endregion
}
}
NET实现RSA AES DES 字符串 加密解密以及SHA1 MD5加密的更多相关文章
- Asp.Net Core 2.0 项目实战(7)MD5加密、AES&DES对称加解密
本文目录 1. 摘要 2. MD5加密封装 3. AES的加密.解密 4. DES加密/解密 5. 总结 1. 摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等, ...
- 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)
原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ...
- AES加密解密 助手类 CBC加密模式
"; string result1 = AESHelper.AesEncrypt(str); string result2 = AESHelper.AesDecrypt(result1); ...
- 16位的MD5加密和32位MD5加密的区别
16位的MD5加密和32位MD5加密的区别 MD5加密后所得到的通常是32位的编码,而在不少地方会用到16位的编码它们有什么区别呢?16位加密就是从32位MD5散列中把中间16位提取出来!其实破解16 ...
- 加密 解密 RSA & AES & DES
git: https://github.com/XHTeng/XHCryptorTools rsa RSA加解密中必须考虑到的密钥长度.明文长度和密文长度问题.明文长度需要小于密钥长度,而密文长度则等 ...
- Android DES加密的CBC模式加密解密和ECB模式加密解密
DES加密共有四种模式:电子密码本模式(ECB).加密分组链接模式(CBC).加密反馈模式(CFB)和输出反馈模式(OFB). CBC模式加密: import java.security.Key; i ...
- PHP中使用OpenSSL生成RSA公钥私钥及进行加密解密示例(非对称加密)
php服务端与客户端交互.提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密 先了解一下关于 ...
- Java常用的加密解密类(对称加密类)
Java常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ...
- 加密解密知识 php非对称加密
function test1(){ $config = array( "digest_alg" => "sha1", "private_key_ ...
随机推荐
- css 水平垂直居中的方法总结
在项目中经常会遇到设置元素水平垂直居中的需求.而且具体的场景也不同,所以将个人总结的方法做个汇总,希望对浏览者有用. 以下所举的例子都以一个html为准,这里规定好一些公用样式. body { bac ...
- Android 带清除功能的输入框控件EditTextWithDel
记录下一个非常有用的小控件EditTextWithDel.就是在Android系统的输入框右边增加一个小图标.点击小图标能够清除输入框里面的内容,由于Android原生EditText不具备此功能,所 ...
- php如何实现万年历的开发(每日一课真是非常有效率)
php如何实现万年历的开发(每日一课真是非常有效率) 一.总结 一句话总结: 1.判断每月有多少天: 通过data函数来判断,$days=date('t',$firstday); 2.判断每月的第一天 ...
- .NETCore 实现容器化Docker与私有镜像仓库管理
原文:.NETCore 实现容器化Docker与私有镜像仓库管理 一.Docker介绍 Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技 ...
- JVM源码分析之System.currentTimeMillis及nanoTime原理详解
JDK7和JDK8下的System.nanoTime()输出完全不一样,而且差距还非常大,是不是两个版本里的实现不一样,之前我也没注意过这个细节,觉得非常奇怪,于是自己也在本地mac机器上马上测试了一 ...
- 如何解决-bash: jstack: command not found,Linux安装jstack
不少朋友在刚接触jvm的时候,通常在Linux中经常要使用jstack命令,新手经常会遇到如下问题: -bash: jstack: command not found 不用慌张,该命令位于Java/b ...
- 在navicat上设置定时计划执行存储过程
原文 应用情景: 有一个存储过程,需要每天定时执行一次.所以在navicat上使用事件处理,当然还有其他的方法,这只是一种.作为参考 1.事件定义填写 2.事件计划设置 3.保存 点击上方保存即可 常 ...
- ik_max_word ik_smart
打开 ~/es_root/config/elasticsearch.yml 文件,加入以下配置: index: analysis: analyzer: ik_syno: type: custom to ...
- session_start()的逻辑
//session_start -Start new or resume existing session session_start(); print_r($_SESSION); //看有没有ses ...
- NFS Server搭建实践
NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系统能够彼此分享个 ...