我们经常在谍战片里看到,我军传递情报用电报发送,但敌人也可以截取电报,这就需要对电报发送的内容进行加密,当时常用的加密方式是通过一段密文,对情报进行加密,比如说是当天的日报。这种属于对称加密,差不多是DES加密算法。这里简单介绍几种。
主要介绍这几种
需要注意的是,不可逆的不代表真的不可逆。
(1)MD5
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。
MD5为不可逆的加密方式一般用作密码验证,当密码加密结果一致时则认为登陆成功;
public class MD5
{
public string MD5Encrypt(string normalTxt)
{
var bytes = Encoding.Default.GetBytes(normalTxt);//求Byte[]数组
var Md5 = new MD5CryptoServiceProvider().ComputeHash(bytes);//求哈希值
return Convert.ToBase64String(Md5);//将Byte[]数组转为净荷明文(其实就是字符串)
}
}
(2)SHA
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
public class SHA//SHA为不可逆加密方式
{
public string SHA1Encrypt(string normalTxt)
{
var bytes = Encoding.Default.GetBytes(normalTxt);
var SHA = new SHA1CryptoServiceProvider();
var encryptbytes = SHA.ComputeHash(bytes);
return Convert.ToBase64String(encryptbytes);
}
public string SHA256Encrypt(string normalTxt)
{
var bytes = Encoding.Default.GetBytes(normalTxt);
var SHA256 = new SHA256CryptoServiceProvider();
var encryptbytes = SHA256.ComputeHash(bytes);
return Convert.ToBase64String(encryptbytes);
}
public string SHA384Encrypt(string normalTxt)
{
var bytes = Encoding.Default.GetBytes(normalTxt);
var SHA384 = new SHA384CryptoServiceProvider();
var encryptbytes = SHA384.ComputeHash(bytes);
return Convert.ToBase64String(encryptbytes);
}
public string SHA512Encrypt(string normalTxt)
{
var bytes = Encoding.Default.GetBytes(normalTxt);
var SHA512 = new SHA512CryptoServiceProvider();
var encryptbytes = SHA512.ComputeHash(bytes);
return Convert.ToBase64String(encryptbytes);
}
}
(3)DES
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。
public class DES
{
public DES(byte[] keyvi)//密钥向量,8位就好了例如new byte[]{0x01,0x02,0x03,0x04,0x05,0x05,0x07}
{
this.keyvi = keyvi;
}
private byte[] keyvi;
public string DesEncrypt(string normalTxt,string EncryptKey)
{
var bytes= Encoding.Default.GetBytes(normalTxt);
var key = Encoding.UTF8.GetBytes(EncryptKey.PadLeft(8, '0').Substring(0, 8));
using (MemoryStream ms=new MemoryStream())
{
var encry = new DESCryptoServiceProvider();
CryptoStream cs = new CryptoStream(ms,encry.CreateEncryptor(key, keyvi),CryptoStreamMode.Write);
cs.Write(bytes,0,bytes.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
}
public string DesDecrypt(string securityTxt, string EncryptKey)//解密
{
try
{
var bytes= Convert.FromBase64String(securityTxt);
var key = Encoding.UTF8.GetBytes(EncryptKey.PadLeft(8, '0').Substring(0, 8));
using (MemoryStream ms = new MemoryStream())
{
var descrypt = new DESCryptoServiceProvider();
CryptoStream cs = new CryptoStream(ms, descrypt.CreateDecryptor (key, keyvi), CryptoStreamMode.Write);
cs.Write(bytes,0,bytes.Length);
cs.FlushFinalBlock();
return Encoding.UTF8.GetString(ms.ToArray());
}
}
catch (Exception)
{
return string.Empty;
}
}
}
(4)AES
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
public class AES
{
public AES(byte[] iv)
{
this.iv = iv;
}
byte[] iv;
public string AESEncrypt(string normalTxt,string key)
{
var bytes = Encoding.Default.GetBytes(normalTxt);
SymmetricAlgorithm des =Rijndael.Create();
des.Key = Encoding.Default.GetBytes(key);
des.IV = iv;
using (MemoryStream ms=new MemoryStream())
{
CryptoStream cs = new CryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write);
cs.Write(bytes, 0, bytes.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
}
public string AESDecrypt(string securityTxt, string key)
{
try
{
var bytes = Convert.FromBase64String(securityTxt);
SymmetricAlgorithm des = Rijndael.Create();
des.Key = Encoding.Default.GetBytes(key);
des.IV = iv;
using (MemoryStream ms = new MemoryStream())
{
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(bytes, 0, bytes.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
}
catch (Exception)
{
return string.Empty;
}
}
}
(5)RSA
RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997年才被发表。
对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
1983年麻省理工学院在美国为RSA算法申请了专利。这个专利2000年9月21日失效。由于该算法在申请专利前就已经被发表了,在世界上大多数其它地区这个专利权不被承认。
RSA需要两把密钥,一个public key进行加密,一个private key用来解密。也可称为公钥,私钥。
加密:
public string RSAEncrypt(string normaltxt)
{
var bytes = Encoding.Default.GetBytes(normaltxt);
var encryptBytes= new RSACryptoServiceProvider(new CspParameters()).Encrypt(bytes,false);
return Convert.ToBase64String(encryptBytes);
}
解密:
public string RSADecrypt(string securityTxt)
{
try//必须使用Try catch,不然输入的字符串不是净荷明文程序就Gameover了
{
var bytes= Convert.FromBase64String(securityTxt);
var DecryptBytes =new RSACryptoServiceProvider(new CspParameters()).Decrypt(bytes,false);
return Encoding.Default.GetString(DecryptBytes);
}
catch (Exception)
{
return string.Empty;
}
}