当前位置:   article > 正文

【区块链】(四)之常见的加密算法_区块链使用加密算法

区块链使用加密算法

我们经常在谍战片里看到,我军传递情报用电报发送,但敌人也可以截取电报,这就需要对电报发送的内容进行加密,当时常用的加密方式是通过一段密文,对情报进行加密,比如说是当天的日报。这种属于对称加密,差不多是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为不可逆的加密方式一般用作密码验证,当密码加密结果一致时则认为登陆成功;

  1. public class MD5
  2. {
  3. public string MD5Encrypt(string normalTxt)
  4. {
  5. var bytes = Encoding.Default.GetBytes(normalTxt);//求Byte[]数组
  6. var Md5 = new MD5CryptoServiceProvider().ComputeHash(bytes);//求哈希值
  7. return Convert.ToBase64String(Md5);//将Byte[]数组转为净荷明文(其实就是字符串)
  8. }
  9. }

(2)SHA

安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

  1. public class SHA//SHA为不可逆加密方式
  2. {
  3. public string SHA1Encrypt(string normalTxt)
  4. {
  5. var bytes = Encoding.Default.GetBytes(normalTxt);
  6. var SHA = new SHA1CryptoServiceProvider();
  7. var encryptbytes = SHA.ComputeHash(bytes);
  8. return Convert.ToBase64String(encryptbytes);
  9. }
  10. public string SHA256Encrypt(string normalTxt)
  11. {
  12. var bytes = Encoding.Default.GetBytes(normalTxt);
  13. var SHA256 = new SHA256CryptoServiceProvider();
  14. var encryptbytes = SHA256.ComputeHash(bytes);
  15. return Convert.ToBase64String(encryptbytes);
  16. }
  17. public string SHA384Encrypt(string normalTxt)
  18. {
  19. var bytes = Encoding.Default.GetBytes(normalTxt);
  20. var SHA384 = new SHA384CryptoServiceProvider();
  21. var encryptbytes = SHA384.ComputeHash(bytes);
  22. return Convert.ToBase64String(encryptbytes);
  23. }
  24. public string SHA512Encrypt(string normalTxt)
  25. {
  26. var bytes = Encoding.Default.GetBytes(normalTxt);
  27. var SHA512 = new SHA512CryptoServiceProvider();
  28. var encryptbytes = SHA512.ComputeHash(bytes);
  29. return Convert.ToBase64String(encryptbytes);
  30. }
  31. }

(3)DES

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。

  1. public class DES
  2. {
  3. public DES(byte[] keyvi)//密钥向量,8位就好了例如new byte[]{0x01,0x02,0x03,0x04,0x05,0x05,0x07}
  4. {
  5. this.keyvi = keyvi;
  6. }
  7. private byte[] keyvi;
  8. public string DesEncrypt(string normalTxt,string EncryptKey)
  9. {
  10. var bytes= Encoding.Default.GetBytes(normalTxt);
  11. var key = Encoding.UTF8.GetBytes(EncryptKey.PadLeft(8, '0').Substring(0, 8));
  12. using (MemoryStream ms=new MemoryStream())
  13. {
  14. var encry = new DESCryptoServiceProvider();
  15. CryptoStream cs = new CryptoStream(ms,encry.CreateEncryptor(key, keyvi),CryptoStreamMode.Write);
  16. cs.Write(bytes,0,bytes.Length);
  17. cs.FlushFinalBlock();
  18. return Convert.ToBase64String(ms.ToArray());
  19. }
  20. }
  21. public string DesDecrypt(string securityTxt, string EncryptKey)//解密
  22. {
  23. try
  24. {
  25. var bytes= Convert.FromBase64String(securityTxt);
  26. var key = Encoding.UTF8.GetBytes(EncryptKey.PadLeft(8, '0').Substring(0, 8));
  27. using (MemoryStream ms = new MemoryStream())
  28. {
  29. var descrypt = new DESCryptoServiceProvider();
  30. CryptoStream cs = new CryptoStream(ms, descrypt.CreateDecryptor (key, keyvi), CryptoStreamMode.Write);
  31. cs.Write(bytes,0,bytes.Length);
  32. cs.FlushFinalBlock();
  33. return Encoding.UTF8.GetString(ms.ToArray());
  34. }
  35. }
  36. catch (Exception)
  37. {
  38. return string.Empty;
  39. }
  40. }
  41. }

(4)AES

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

  1. public class AES
  2. {
  3. public AES(byte[] iv)
  4. {
  5. this.iv = iv;
  6. }
  7. byte[] iv;
  8. public string AESEncrypt(string normalTxt,string key)
  9. {
  10. var bytes = Encoding.Default.GetBytes(normalTxt);
  11. SymmetricAlgorithm des =Rijndael.Create();
  12. des.Key = Encoding.Default.GetBytes(key);
  13. des.IV = iv;
  14. using (MemoryStream ms=new MemoryStream())
  15. {
  16. CryptoStream cs = new CryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write);
  17. cs.Write(bytes, 0, bytes.Length);
  18. cs.FlushFinalBlock();
  19. return Convert.ToBase64String(ms.ToArray());
  20. }
  21. }
  22. public string AESDecrypt(string securityTxt, string key)
  23. {
  24. try
  25. {
  26. var bytes = Convert.FromBase64String(securityTxt);
  27. SymmetricAlgorithm des = Rijndael.Create();
  28. des.Key = Encoding.Default.GetBytes(key);
  29. des.IV = iv;
  30. using (MemoryStream ms = new MemoryStream())
  31. {
  32. CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
  33. cs.Write(bytes, 0, bytes.Length);
  34. cs.FlushFinalBlock();
  35. return Convert.ToBase64String(ms.ToArray());
  36. }
  37. }
  38. catch (Exception)
  39. {
  40. return string.Empty;
  41. }
  42. }
  43. }

(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用来解密。也可称为公钥,私钥。 

加密:

  1. public string RSAEncrypt(string normaltxt)
  2. {
  3. var bytes = Encoding.Default.GetBytes(normaltxt);
  4. var encryptBytes= new RSACryptoServiceProvider(new CspParameters()).Encrypt(bytes,false);
  5. return Convert.ToBase64String(encryptBytes);
  6. }

解密:

  1. public string RSADecrypt(string securityTxt)
  2. {
  3. try//必须使用Try catch,不然输入的字符串不是净荷明文程序就Gameover了
  4. {
  5. var bytes= Convert.FromBase64String(securityTxt);
  6. var DecryptBytes =new RSACryptoServiceProvider(new CspParameters()).Decrypt(bytes,false);
  7. return Encoding.Default.GetString(DecryptBytes);
  8. }
  9. catch (Exception)
  10. {
  11. return string.Empty;
  12. }
  13. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/867116
推荐阅读
相关标签
  

闽ICP备14008679号