MD5 加密、解密、数字签名及验证
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 using System.Security.Cryptography; 7 using System.ComponentModel; 8 9 10 namespace ConsoleApplication2 11 { 12 13 class Class1 14 { 15 16 //创建了密钥对 17 static RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 18 private string privateKey = RSA.ToXmlString(true); 19 private string publicKey = RSA.ToXmlString(false); 20 static byte[] AOutput; 21 22 public static string GetKeyFromContainer(string ContainerName, bool privatekey) 23 { 24 CspParameters cp = new CspParameters(); 25 cp.KeyContainerName = ContainerName; 26 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); 27 return rsa.ToXmlString(privatekey); 28 } 29 30 //加密 31 public static string RSAEncrypt(string publicKey, string content) 32 { 33 RSACryptoServiceProvider Rsa = new RSACryptoServiceProvider(); 34 35 Rsa.FromXmlString(publicKey); 36 byte[] cipherbytes = Rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); 37 AOutput = Rsa.Encrypt(cipherbytes, false); 38 return Convert.ToBase64String(AOutput); 39 } 40 41 //解密 42 public static string RSADecrypt(string privateKey, string content) 43 { 44 RSACryptoServiceProvider Rsa2 = new RSACryptoServiceProvider(); 45 Rsa2.FromXmlString(privateKey); 46 byte[] cipherbytes = Rsa2.Decrypt(Convert.FromBase64String(content), false); 47 return Encoding.UTF8.GetString(cipherbytes); 48 } 49 50 //获取hash值 51 private byte[] GetHash(string content) 52 { 53 try 54 { 55 //FileStream objFile = File.OpenRead(filePath); 56 byte[] data_Bytes = Encoding.ASCII.GetBytes(content); 57 HashAlgorithm MD5 = HashAlgorithm.Create("MD5"); 58 byte[] Hashbyte = MD5.ComputeHash(data_Bytes); 59 //objFile.Close(); 60 return Hashbyte; 61 } 62 catch 63 { 64 return null; 65 } 66 throw new NotImplementedException(); 67 } 68 69 //获取文件hash 70 public static byte[] GetFileHash(string filePath) 71 { 72 try 73 { 74 FileStream objFile = File.OpenRead(filePath); 75 HashAlgorithm MD5 = HashAlgorithm.Create("MD5"); 76 byte[] Hashbyte = MD5.ComputeHash(objFile); 77 objFile.Close(); 78 return Hashbyte; 79 } 80 catch 81 { 82 return null; 83 } 84 } 85 86 //创建数字签名 87 byte[] EncryptHash(string privateKey, byte[] hash_Bytes) 88 { 89 RSACryptoServiceProvider Rsa3 = new RSACryptoServiceProvider(); 90 Rsa3.FromXmlString(privateKey); 91 92 RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(Rsa3); 93 RSAFormatter.SetHashAlgorithm("MD5"); 94 95 96 97 //AOutput = Rsa3.SignData(data_Bytes, "SHA1"); 98 99 return RSAFormatter.CreateSignature(hash_Bytes); ; 100 } 101 102 //验证数字签名 103 public bool DecryptHash(string publicKey, byte[] hash_byte, byte[] eSignature) 104 { 105 try 106 { 107 RSACryptoServiceProvider Rsa4 = new RSACryptoServiceProvider(); 108 Rsa4.FromXmlString(publicKey); 109 110 //bool bVerify = Rsa4.VerifyData(strData, "SHA1", AOutput); 111 RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(Rsa4); 112 RSADeformatter.SetHashAlgorithm("MD5"); 113 114 bool bVerify = RSADeformatter.VerifySignature(hash_byte,eSignature); 115 116 if (bVerify) 117 { 118 return true; 119 } 120 return false; 121 } 122 catch (CryptographicException e) 123 { 124 return false; 125 } 126 } 127 128 // 将Byte[]转换成十六进制字符串 129 public static string ConvertBytesToString(byte[] bytes) 130 { 131 string bytestring = string.Empty; 132 if (bytes != null && bytes.Length > 0) 133 { 134 for (int i = 0; i < bytes.Length; i++) 135 { 136 bytestring += bytes[i].ToString("X") + " "; 137 } 138 } 139 return bytestring; 140 } 141 142 static void Main(string[] args) 143 { 144 //打开文件,或者是获取网页数据 145 Console.WriteLine("接收方收到电子文件。"); 146 string strMsg = "dadfdfgdgdgagdgadg"; //test data 147 Console.WriteLine(strMsg); 148 Class1 cls = new Class1(); 149 150 151 //对电子文件进行哈希 152 Console.WriteLine("哈希值:"); 153 byte[] hash_data = cls.GetHash(strMsg); 154 Console.WriteLine(ConvertBytesToString(hash_data)); 155 156 //创建数据签名 157 158 Console.WriteLine("私钥:"); 159 Console.WriteLine(cls.privateKey); 160 161 Console.WriteLine("用私钥进行数字签名"); 162 byte[] eSingnature = cls.EncryptHash(cls.privateKey,hash_data); 163 Console.WriteLine(ConvertBytesToString(eSingnature)); 164 165 //测试数据 166 string strMsgCopy = string.Copy(strMsg); 167 Console.WriteLine("被验证的哈希值:"); 168 byte[] hash_dataCopy = cls.GetHash(strMsgCopy); 169 Console.WriteLine(ConvertBytesToString(hash_dataCopy)); 170 171 Console.WriteLine("公钥:"); 172 Console.WriteLine(cls.publicKey); 173 174 175 if (cls.DecryptHash(cls.publicKey, hash_dataCopy, eSingnature)) 176 { 177 Console.WriteLine("通过验证,电子文件合法有效。"); 178 } 179 180 else 181 { 182 Console.WriteLine("未通过验证,电子文件非法或被人篡改过。"); 183 184 } 185 186 Console.ReadLine(); 187 //Class1 cls = new Class1(); 188 //string filePath = "D://公文.txt"; 189 //StreamWriter sw = File.CreateText(filePath); 190 //sw.Write("测试公文"); 191 //sw.Close(); 192 193 194 //byte[] fileHash = GetFileHash(filePath); 195 //string publicKey = GetKeyFromContainer("公文", false); 196 //string privateKey = GetKeyFromContainer("公文", true); 197 198 //byte[] ElectronicSignature = cls.EncryptHash(privateKey, fileHash); 199 200 //string fileCopyPath = "D://公文接收.txt"; 201 //File.Copy(filePath, fileCopyPath, true); 202 //byte[] fileCopyHash = GetFileHash(fileCopyPath); 203 //if (cls.DecryptHash(publicKey, fileCopyHash, ElectronicSignature)) 204 //{ 205 // Console.WriteLine("通过验证,电子文件合法有效。"); 206 //} 207 //else 208 //{ 209 // Console.WriteLine("未通过验证,电子文件非法或被人篡改过。"); 210 //} 211 212 //Console.Read(); 213 } 214 215 } 216 }
Standing on the shoulders of giants