最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中的那些常用加密算法

 更新時(shí)間:2020年11月23日 11:05:10   作者:kiba518  
本文主要講解一下C#常用的那些加密算法,包括MD5加密、SHA1加密、Base64加密、Des加密、RSA加密等,需要的朋友可以參考下

前言

本文主要講解一下C#常用的那些加密算法。

本文源碼

本文所用源碼均以為大家整理完畢,大家使用以下方式獲取

需要的小伙伴,請關(guān)注微信公眾號(hào): 程序員零距離, 或者掃描下方公眾號(hào)二維碼,回復(fù)關(guān)鍵字:加密算法 , 即可獲取本文所用的所有源碼資源。

關(guān)注上方公眾號(hào),回復(fù) 加密算法獲取

MD5加密

MD5加密是最常見的加密方式,因?yàn)镸D5是不可逆的,所以很多系統(tǒng)的密碼都是用MD5加密保存的。

雖然MD5是不可以解碼的,但因?yàn)镸D5加密的字符串是固定的,所以,理論上只需要建立一個(gè)龐大的數(shù)據(jù)庫,把所有的字符串都加密一遍,那就可以解碼所有的MD5密文了。

雖然建立一個(gè)可以解碼全部MD5的數(shù)據(jù)庫不太現(xiàn)實(shí),但一個(gè)五六百億數(shù)據(jù)量的數(shù)據(jù)庫就可以解碼絕大部分字符串了,畢竟大部分情況下,我們的密碼也是有長度限制的。

實(shí)際應(yīng)用中MD5有64位和32位加密之分,代碼如下:

#region MD5加密 32和64 
public static string GetMd532(string ConvertString)
{
  MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
  string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8);
  t2 = t2.Replace("-", "");

  return t2;
} 
public static string Get64Md5(string str)
{
  string cl = str;
  string pwd = "";
  var md5 = MD5.Create();
  byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl)); 
  for (int i = 0; i < s.Length; i++)
  {
    pwd = pwd + s[i].ToString("X2");
  } 
  return pwd;
} 
#endregion

我們運(yùn)行一下,加密函數(shù)。

Console.WriteLine($"MD5-64:{ MD5Helper.Get64Md5("Kiba518")}");
Console.WriteLine($"MD5-32:{ MD5Helper.Get32Md5("Kiba518")}");

結(jié)果如下圖所示:

SHA1加密

SHA1加密算法與MD5加密類似,都是不可逆的,只是算法不同。所以也和MD5一樣,存在容易被大數(shù)據(jù)解碼的問題。

代碼如下:

private static readonly Encoding Encoder = Encoding.UTF8;
public static String Sha1(String content )
{
  try
  {
    SHA1 sha1 = new SHA1CryptoServiceProvider();//創(chuàng)建SHA1對象
    byte[] bytes_in = Encoder.GetBytes(content);//將待加密字符串轉(zhuǎn)為byte類型
    byte[] bytes_out = sha1.ComputeHash(bytes_in);//Hash運(yùn)算
    sha1.Dispose();//釋放當(dāng)前實(shí)例使用的所有資源
    String result = BitConverter.ToString(bytes_out);//將運(yùn)算結(jié)果轉(zhuǎn)為string類型
    result = result.Replace("-", "").ToUpper();
    return result;
  }
  catch (Exception ex)
  {
    return ex.Message;
  }
}

運(yùn)行加密函數(shù),結(jié)果如下圖所示:

Base64加密

準(zhǔn)確的來說,Base64是一種編碼,而不是加密,通常Base64編碼后字符串會(huì)用于傳輸數(shù)據(jù)。不過也因?yàn)锽ase64編碼后字符串具有不可讀性,所以,不少人也把他當(dāng)做加密算法來使用。

代碼如下:

private static readonly Encoding Encoder = Encoding.UTF8;
public static string EncodeBase64(string source)
{
  string target = "";
  byte[] bytes = Encoder.GetBytes(source);
  try
  {
    target = Convert.ToBase64String(bytes);
  }
  catch
  {
    target = source;
  }
  return target;
}
public static string DecodeBase64(string result)
{
  string decode = "";
  byte[] bytes = Convert.FromBase64String(result);
  try
  {
    decode = Encoder.GetString(bytes);
  }
  catch
  {
    decode = result;
  }
  return decode;
}

運(yùn)行Base64編碼函數(shù)。

string base64Str = Base64Helper.EncodeBase64("Kiba518");
Console.WriteLine($"SHA1編碼:{ base64Str}");
Console.WriteLine($"SHA1解碼:{ Base64Helper.DecodeBase64(base64Str)}");

結(jié)果如下圖所示:

Des加密

DES加密算法是對密鑰進(jìn)行保密,而公開算法,即只有擁有相同密鑰的人才能解密。

DES加密算法對密鑰有要求,必須是8個(gè)字符,如abcdefgh這樣的。

代碼如下:

public static string Encrypt(string stringToEncrypt, string shortKey)
{
  DESCryptoServiceProvider des = new DESCryptoServiceProvider();
  byte[] inputByteArray = Encoding.GetEncoding("UTF-8").GetBytes(stringToEncrypt);
  des.Key = ASCIIEncoding.UTF8.GetBytes(shortKey);
  des.IV = ASCIIEncoding.UTF8.GetBytes(shortKey);
  MemoryStream ms = new MemoryStream();
  CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
  cs.Write(inputByteArray, 0, inputByteArray.Length);
  cs.FlushFinalBlock();
  StringBuilder ret = new StringBuilder();
  foreach (byte b in ms.ToArray())
  {
    ret.AppendFormat("{0:X2}", b);
  }
  ret.ToString();
  return ret.ToString();
}
public static string Decrypt(string stringToDecrypt, string sKey)
{
  DESCryptoServiceProvider des = new DESCryptoServiceProvider();

  byte[] inputByteArray = new byte[stringToDecrypt.Length / 2];
  for (int x = 0; x < stringToDecrypt.Length / 2; x++)
  {
    int i = (Convert.ToInt32(stringToDecrypt.Substring(x * 2, 2), 16));
    inputByteArray[x] = (byte)i;
  }
  des.Key = ASCIIEncoding.UTF8.GetBytes(sKey);
  des.IV = ASCIIEncoding.UTF8.GetBytes(sKey);
  MemoryStream ms = new MemoryStream();
  CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
  cs.Write(inputByteArray, 0, inputByteArray.Length);
  cs.FlushFinalBlock();
  StringBuilder ret = new StringBuilder();
  return System.Text.Encoding.Default.GetString(ms.ToArray());
}

如代碼所示,我們使用DESCryptoServiceProvider類來進(jìn)行DES加密。

DESCryptoServiceProvider類的Mode屬性可以指定加密運(yùn)算模式。

加密運(yùn)算模式如下:

  • CBC:密碼塊鏈模式。
  • ECB:電子密碼本模式。
  • OFB:輸出反饋模式。
  • CFB:密碼反饋模式。
  • CTS:密碼文本竊取模式。

在C#中默認(rèn)的加密運(yùn)算模式是CBC—密碼塊鏈模式。

在Java中默認(rèn)的加密運(yùn)算模式是ECB—電子密碼本模式。

即,如果密文是在C#項(xiàng)目和Java項(xiàng)目之間傳遞,那么必須配置相同的加密運(yùn)算模式。

運(yùn)行DES加密函數(shù)代碼如下:

string key_8 = "abcdefgh";
string desShortKeyStr = DESHelper.Encrypt("Kiba518", key_8);
Console.WriteLine($"DES加密:{ desShortKeyStr}");
Console.WriteLine($"DES解密:{ DESHelper.Decrypt(desShortKeyStr, key_8)}");

結(jié)果如下圖所示:

有時(shí)候,我們的密鑰不是正好8個(gè)字符,那我們就截取前8為作為密鑰就可以了。

RSA加密

RSA加密采用公鑰加密,私鑰解密的模式。Https的數(shù)字證書也是使用這種模式加密的。

代碼如下:

 public static string RSADecrypt(string xmlPrivateKey, string enptStr)
 {
   RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
   provider.FromXmlString(xmlPrivateKey);
   byte[] rgb = Convert.FromBase64String(enptStr);
   byte[] bytes = provider.Decrypt(rgb, RSAEncryptionPadding.OaepSHA1);
   return new UnicodeEncoding().GetString(bytes);
 }
 public static string RSAEncrypt(string xmlPublicKey, string enptStr)
 {
   RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
   provider.FromXmlString(xmlPublicKey);
   byte[] bytes = new UnicodeEncoding().GetBytes(enptStr);
   return Convert.ToBase64String(provider.Encrypt(bytes, RSAEncryptionPadding.OaepSHA1));
 }

運(yùn)行DES加密函數(shù)代碼如下:

//加密公鑰 
string publicKey = "18+I2j3HU/fXQasRXOWGegP3dG75I/It2n42rgeIATeftBkoQNH73Rz0IYW++arqd0Yy5hFpNkqzY/dOmD+bDXWUheWA0P/dVZf+qeWwVV+iW3lRAU8SmnPcaD35Ic1jMEPFQVeX1zGI2ofD8aGodeSRA4+JKo+KLgyGVGDI+d0=AQAB";
//解密私鑰 
string privateKey = " 18+I2j3HU/fXQasRXOWGegP3dG75I/It2n42rgeIATeftBkoQNH73Rz0IYW++arqd0Yy5hFpNkqzY/dOmD+bDXWUheWA0P/dVZf+qeWwVV+iW3lRAU8SmnPcaD35Ic1jMEPFQVeX1zGI2ofD8aGodeSRA4+JKo+KLgyGVGDI+d0=AQAB
2EEAI+cO1fyvmGpg3ywMLHHZ1/X3ZrF6xZBNM2AL7bJFVfL8RS8UznUCdsL/R/o1b+lGo1CetlI++n6IvYYwyw==

/3muAXWOU3SMKFWSDpHUgeM9kZev0ekQDefRSayXM8q9ItkaWTOJcIN614A0UGdYE6VX1ztPgveQFzm0qJDy9w==NM/i/eGewOmd5IYONFJogq4nOlOKYNz1E6yC/gn1v83qmuvlaevuk+EFggVrHKPhSvxYUOgOao45bSlbsZVE8w==MKU7w91dh3iWw4tfr1SHUWAytglbGi41t2Af0taBSARftUX/pWKR1hHDD0vDKlgzRjJiooIRps966WE8jChliw==YEIfQArVNP27AJn3WOBswHP/+gJ6Bk434MZ80CJONp4b6e+Ilxd2dwloxGKNbGgCyaNJEFI5J8qYSNNe0KqPkw==ZAscSPesqLtS+WlBMkxgy719AGfVbRl+sjQiSwjIvq+3hDjJVUtCs90RO10SDBF0gfhz7f2SRY3ZnXTu5VtPF9KEQyUaY0F6eXwz4YQNzJTI2c1o5SFXZP8Ynqwltg8gNIhMe8bB6nVgASeADBim22DlSFCzmD3vt1gTI8nxmO0=";
string myname = "my name is Kiba518!my name is Kiba518!!!!43"; //最大長度43
string rsaStr = RSAHelper.RSAEncrypt(publicKey, myname);
Console.WriteLine($"RSA加密:{ rsaStr}");
string dersaStr = RSAHelper.RSADecrypt(privateKey, rsaStr);
Console.WriteLine($"RSA解密:{ dersaStr}");

結(jié)果如下圖所示:

RSA加密有個(gè)特點(diǎn),就是他對被加密的字符串有長度限制。

長度限制規(guī)則:待加密的字節(jié)數(shù)不能超過密鑰的長度值除以 8 再減去 11(即:RSACryptoServiceProvider.KeySize / 8 - 11),而加密后得到密文的字節(jié)數(shù),正好是密鑰的長度值除以 8(即:RSACryptoServiceProvider.KeySize / 8)。注:該長度指的是byte[]數(shù)組的長度,而不是字符串的長度。

簡單來說,就是被加密字符串不能太長。

但是,在真實(shí)的業(yè)務(wù)中,我們需要加密的字符串往往會(huì)很長,那么,RSA又對被加密字符串有長度限制,我們該怎么辦呢?很簡單,把待加密的字符串拆開,每段長度都小于等于限制長度,然后分段加密,這樣,問題就解決了。

分段加密代碼如下:

public static String SubRSAEncrypt(string xmlPublicKey, string enptStr)
{
  RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
  provider.FromXmlString(xmlPublicKey);
  Byte[] bytes = Encoder.GetBytes(enptStr);
  int MaxBlockSize = provider.KeySize / 8 - 11;  //加密塊最大長度限制

  if (bytes.Length <= MaxBlockSize)
    return Convert.ToBase64String(provider.Encrypt(bytes, false));

  using (MemoryStream PlaiStream = new MemoryStream(bytes))
  using (MemoryStream CrypStream = new MemoryStream())
  {
    Byte[] Buffer = new Byte[MaxBlockSize];
    int BlockSize = PlaiStream.Read(Buffer, 0, MaxBlockSize);

    while (BlockSize > 0)
    {
      Byte[] ToEncrypt = new Byte[BlockSize];
      Array.Copy(Buffer, 0, ToEncrypt, 0, BlockSize);

      Byte[] Cryptograph = provider.Encrypt(ToEncrypt, false);
      CrypStream.Write(Cryptograph, 0, Cryptograph.Length);

      BlockSize = PlaiStream.Read(Buffer, 0, MaxBlockSize);
    }

    return Convert.ToBase64String(CrypStream.ToArray(), Base64FormattingOptions.None);
  }

}
/// 

/// 分段解密,應(yīng)對長字符串
/// 
/// 
/// 
/// 
public static String SubRSADecrypt(string xmlPublicKey, string enptStr)
{
  RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
  provider.FromXmlString(xmlPublicKey);
  Byte[] bytes = Convert.FromBase64String(enptStr);
  int MaxBlockSize = provider.KeySize / 8;  //解密塊最大長度限制

  if (bytes.Length <= MaxBlockSize)
    return Encoder.GetString(provider.Decrypt(bytes, false));

  using (MemoryStream CrypStream = new MemoryStream(bytes))
  using (MemoryStream PlaiStream = new MemoryStream())
  {
    Byte[] Buffer = new Byte[MaxBlockSize];
    int BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize);

    while (BlockSize > 0)
    {
      Byte[] ToDecrypt = new Byte[BlockSize];
      Array.Copy(Buffer, 0, ToDecrypt, 0, BlockSize);

      Byte[] Plaintext = provider.Decrypt(ToDecrypt, false);
      PlaiStream.Write(Plaintext, 0, Plaintext.Length);

      BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize);
    }

    return Encoder.GetString(PlaiStream.ToArray());
  }
}

結(jié)果如下圖所示:

結(jié)語

到此C#常用的那些加密算法就介紹完了,下面我們一起看一下,同一字符串,加密后情況。

可以看到,不同加密方式得到的密文長度都不一樣,其中DES加密后在Base64編碼的模式的密文長度最短。RSA加密的密文最長。

 本文源碼

本文所用源碼均以為大家整理完畢,大家使用以下方式獲取

需要的小伙伴,請關(guān)注微信公眾號(hào): 程序員零距離, 或者掃描下方公眾號(hào)二維碼,回復(fù)關(guān)鍵字:加密算法 , 即可獲取本文所用的所有源碼資源。

關(guān)注上方公眾號(hào),回復(fù) 加密算法獲取

到此這篇關(guān)于C#中的那些常用加密算法的文章就介紹到這了,更多相關(guān)C#加密算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺聊一下C#中內(nèi)存映射文件的玩法

    淺聊一下C#中內(nèi)存映射文件的玩法

    內(nèi)存映射文件是怎么玩的,說實(shí)話這東西理論我相信很多朋友都知道,就是將文件映射到進(jìn)程的虛擬地址,說起來很容易,那如何讓大家眼見為實(shí)呢,本文就來和大家簡單聊聊
    2023-06-06
  • C#環(huán)形隊(duì)列的實(shí)現(xiàn)方法詳解

    C#環(huán)形隊(duì)列的實(shí)現(xiàn)方法詳解

    這篇文章先是簡單的給大家介紹了什么是環(huán)形隊(duì)列和環(huán)形隊(duì)列的優(yōu)點(diǎn),然后通過實(shí)例代碼給大家介紹C#如何實(shí)現(xiàn)環(huán)形隊(duì)列,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-09-09
  • C#實(shí)現(xiàn)接收QQ郵件的示例代碼

    C#實(shí)現(xiàn)接收QQ郵件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C#如何使用pop協(xié)議來實(shí)現(xiàn)一下接收QQ郵件的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-08-08
  • C#實(shí)現(xiàn)縮放和剪裁圖片的方法示例

    C#實(shí)現(xiàn)縮放和剪裁圖片的方法示例

    這篇文章主要介紹了C#實(shí)現(xiàn)縮放和剪裁圖片的方法,結(jié)合實(shí)例形式分析了C#針對圖片屬性的縮放、裁剪等相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • winform實(shí)現(xiàn)可拖動(dòng)的自定義Label控件

    winform實(shí)現(xiàn)可拖動(dòng)的自定義Label控件

    這篇文章主要為大家詳細(xì)介紹了winform實(shí)現(xiàn)可拖動(dòng)的自定義Label控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 解析C#中#region與#if的作用

    解析C#中#region與#if的作用

    以下是對C#中#region與#if的作用進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
    2013-09-09
  • Unity實(shí)現(xiàn)手機(jī)搖一搖震動(dòng)

    Unity實(shí)現(xiàn)手機(jī)搖一搖震動(dòng)

    這篇文章主要為大家詳細(xì)介紹了untiy實(shí)現(xiàn)手機(jī)搖一搖震動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C# 刪除數(shù)組內(nèi)的某個(gè)值、一組值方法詳解

    C# 刪除數(shù)組內(nèi)的某個(gè)值、一組值方法詳解

    在本篇文章里小編給大家整理的是關(guān)于C# 如何刪除數(shù)組內(nèi)的某個(gè)值、一組值的相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2020-03-03
  • C#多線程之線程通訊(AutoResetEvent)

    C#多線程之線程通訊(AutoResetEvent)

    這篇文章介紹了C#多線程之線程通訊(AutoResetEvent)的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#實(shí)現(xiàn)快捷鍵的幾種常用方法匯總

    C#實(shí)現(xiàn)快捷鍵的幾種常用方法匯總

    這篇文章主要介紹了C#實(shí)現(xiàn)快捷鍵的幾種常用方法,非常實(shí)用,需要的朋友可以參考下
    2014-08-08

最新評論

青田县| 亚东县| 冀州市| 新竹市| 剑河县| 文成县| 阳谷县| 霸州市| 潞西市| 新津县| 闸北区| 合肥市| 榆中县| 县级市| 安龙县| 正阳县| 石楼县| 喜德县| 上饶县| 玉树县| 康保县| 思茅市| 句容市| 都匀市| 襄垣县| 凤冈县| 洛浦县| 阿拉善右旗| 阿图什市| 西充县| 鄂尔多斯市| 美姑县| 衡水市| 泰兴市| 龙川县| 米易县| 南投县| 云和县| 江门市| 龙州县| 忻城县|