日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

【转】C#实现SM3国密加密

發(fā)布時(shí)間:2023/12/10 C# 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】C#实现SM3国密加密 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C#實(shí)現(xiàn)SM3國密加密

本文主要講解“國密加密算法”SM系列之SM3的C#實(shí)現(xiàn)方法,加密規(guī)則請?jiān)旈唶芫职l(fā)布的文檔。

首先需第三方Nuget包:Portable.BouncyCastle?(源碼來自http://www.bouncycastle.org/csharp/)

1.1常規(guī)處理

?

/// <summary>/// General/// </summary>public abstract class GeneralDigest : IDigest{/// <summary>/// 內(nèi)部緩沖區(qū)的大小/// </summary>private const int ByteLength = 64;/// <summary>/// 消息摘要/// </summary>private readonly byte[] XBuf;/// <summary>/// 待更新的消息摘要的索引/// </summary>private int XBufOff;/// <summary>/// 待更新的消息摘要的大小/// </summary>private long ByteCount;/// <summary>/// 構(gòu)造函數(shù)/// </summary>internal GeneralDigest(){XBuf = new byte[4];}/// <summary>/// 復(fù)制構(gòu)造函數(shù)/// </summary>/// <param name="t"></param>internal GeneralDigest(GeneralDigest t){XBuf = new byte[t.XBuf.Length];Array.Copy(t.XBuf, 0, XBuf, 0, t.XBuf.Length);XBufOff = t.XBufOff;ByteCount = t.ByteCount;}/// <summary>/// 用一個(gè)字節(jié)更新消息摘要。/// </summary>/// <param name="input"></param>public void Update(byte input){XBuf[XBufOff++] = input;if (XBufOff == XBuf.Length){ProcessWord(XBuf, 0);XBufOff = 0;}ByteCount++;}/// <summary>/// 用字節(jié)塊更新消息摘要/// </summary>/// <param name="input"></param>/// <param name="inOff"></param>/// <param name="length"></param>public void BlockUpdate(byte[] input, int inOff, int length){//更新當(dāng)前消息摘要while ((XBufOff != 0) && (length > 0)){Update(input[inOff]);inOff++;length--;}//處理完整的消息摘要while (length > XBuf.Length){ProcessWord(input, inOff);inOff += XBuf.Length;length -= XBuf.Length;ByteCount += XBuf.Length;}//填充剩余的消息摘要while (length > 0){Update(input[inOff]);inOff++;length--;}}/// <summary>/// 產(chǎn)生最終的摘要值/// </summary>public void Finish(){long bitLength = (ByteCount << 3);//添加字節(jié)Update(unchecked((byte)128));while (XBufOff != 0) Update(unchecked((byte)0));ProcessLength(bitLength);ProcessBlock();}/// <summary>/// 重啟/// </summary>public virtual void Reset(){ByteCount = 0;XBufOff = 0;Array.Clear(XBuf, 0, XBuf.Length);}/// <summary>/// 摘要應(yīng)用其壓縮功能的內(nèi)部緩沖區(qū)的大小/// </summary>/// <returns></returns>public int GetByteLength(){return ByteLength;}/// <summary>/// 處理消息摘要/// ABCDEFGH 串聯(lián)/// </summary>/// <param name="input"></param>/// <param name="inOff"></param>internal abstract void ProcessWord(byte[] input, int inOff);internal abstract void ProcessLength(long bitLength);/// <summary>/// 迭代壓縮/// </summary>internal abstract void ProcessBlock();/// <summary>/// 算法名稱/// </summary>public abstract string AlgorithmName { get; }/// <summary>/// 消息摘要生成的摘要的大小/// </summary>/// <returns></returns>public abstract int GetDigestSize();/// <summary>/// 關(guān)閉摘要,產(chǎn)生最終的摘要值。doFinal調(diào)用使摘要復(fù)位。/// </summary>/// <param name="output"></param>/// <param name="outOff"></param>/// <returns></returns>public abstract int DoFinal(byte[] output, int outOff);}

1.2?執(zhí)行無符號按位右移

/// <summary>/// 使用指定的數(shù)字執(zhí)行無符號按位右移/// </summary>public class SupportClass{/// <summary>/// 使用指定的數(shù)字執(zhí)行無符號按位右移/// </summary>/// <param name="number">要操作的編號</param>/// <param name="bits">要移位的比特?cái)?shù)</param>/// <returns>移位操作產(chǎn)生的數(shù)字</returns>public static int URShift(int number, int bits){if (number >= 0)return number >> bits;elsereturn (number >> bits) + (2 << ~bits);}/// <summary>/// 使用指定的數(shù)字執(zhí)行無符號按位右移/// </summary>/// <param name="number">要操作的編號</param>/// <param name="bits">要移位的比特?cái)?shù)</param>/// <returns>移位操作產(chǎn)生的數(shù)字</returns>public static int URShift(int number, long bits){return URShift(number, (int)bits);}/// <summary>/// 使用指定的數(shù)字執(zhí)行無符號按位右移/// </summary>/// <param name="number">要操作的編號</param>/// <param name="bits">要移位的比特?cái)?shù)</param>/// <returns>移位操作產(chǎn)生的數(shù)字</returns>public static long URShift(long number, int bits){if (number >= 0)return number >> bits;elsereturn (number >> bits) + (2L << ~bits);}/// <summary>/// 使用指定的數(shù)字執(zhí)行無符號按位右移/// </summary>/// <param name="number">要操作的編號</param>/// <param name="bits">要移位的比特?cái)?shù)</param>/// <returns>移位操作產(chǎn)生的數(shù)字</returns>public static long URShift(long number, long bits){return URShift(number, (int)bits);}}

1.3 SM3處理

/// <summary>/// /// ⊕ 等價(jià)于 ^/// ^ 等價(jià)于 &/// v 等價(jià)于 |/// </summary>public class SM3Digest : GeneralDigest{public override string AlgorithmName{get{return "SM3";}}/// <summary>/// 消息摘要生成的摘要的大小/// </summary>/// <returns></returns>public override int GetDigestSize(){return DigestLength;}/// <summary>/// SM3算法產(chǎn)生的哈希值大小/// </summary>private const int DigestLength = 32;/// <summary>/// 初始值IV/// </summary>private static readonly int[] IV = new int[] {0x7380166f, 0x4914b2b9, 0x172442d7,unchecked((int)0xda8a0600), unchecked((int)0xa96f30bc), 0x163138aa,unchecked((int)0xe38dee4d), unchecked((int)0xb0fb0e4e)};/// <summary>/// 備份的字寄存器/// </summary>private readonly int[] v = new int[8];/// <summary>/// 使用中的字寄存器/// </summary>private readonly int[] v_ = new int[8];private static readonly int[] X0 = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };private readonly int[] X = new int[68];private int xOff;/// <summary>/// 0到15的Tj常量/// </summary>private readonly int TOne = 0x79cc4519;/// <summary>/// 16到63的Tj常量/// </summary>private readonly int TSecond = 0x7a879d8a;public SM3Digest(){Reset();}/// <summary>/// 復(fù)制構(gòu)造函數(shù)/// </summary>/// <param name="t"></param>public SM3Digest(SM3Digest t) : base(t){Array.Copy(t.X, 0, X, 0, t.X.Length);xOff = t.xOff;Array.Copy(t.v, 0, v, 0, t.v.Length);}/// <summary>/// 將復(fù)制的對象狀態(tài)還原到該對象。/// 此方法的實(shí)現(xiàn)應(yīng)嘗試避免或最小化內(nèi)存分配以執(zhí)行重置。/// </summary>public override void Reset(){base.Reset();Array.Copy(IV, 0, v, 0, IV.Length);xOff = 0;Array.Copy(X0, 0, X, 0, X0.Length);}internal override void ProcessBlock(){int j;int[] ww = X;//64位比特串int[] ww_ = new int[64];#region 塊消息擴(kuò)展//消息擴(kuò)展16 TO 67for (j = 16; j < 68; j++){ww[j] = P1(ww[j - 16] ^ ww[j - 9] ^ (Rotate(ww[j - 3], 15))) ^ (Rotate(ww[j - 13], 7)) ^ ww[j - 6];}//消息擴(kuò)展0 TO 63for (j = 0; j < 64; j++){ww_[j] = ww[j] ^ ww[j + 4];}#endregion#region 壓縮函數(shù)int[] vv = v;int[] vv_ = v_;//A,B,C,D,E,F,G,H為字寄存器Array.Copy(vv, 0, vv_, 0, IV.Length);//中間變量SS1,SS2,TT1,TT2int SS1, SS2, TT1, TT2;int aaa;//將消息分組B(i)劃分為16個(gè)字for (j = 0; j < 16; j++){aaa = Rotate(vv_[0], 12);SS1 = aaa + vv_[4] + Rotate(TOne, j);SS1 = Rotate(SS1, 7);SS2 = SS1 ^ aaa;TT1 = FFOne(vv_[0], vv_[1], vv_[2]) + vv_[3] + SS2 + ww_[j];TT2 = GGOne(vv_[4], vv_[5], vv_[6]) + vv_[7] + SS1 + ww[j];#region 更新各個(gè)寄存器vv_[3] = vv_[2];vv_[2] = Rotate(vv_[1], 9);vv_[1] = vv_[0];vv_[0] = TT1;vv_[7] = vv_[6];vv_[6] = Rotate(vv_[5], 19);vv_[5] = vv_[4];vv_[4] = P0(TT2);#endregion}for (j = 16; j < 64; j++){aaa = Rotate(vv_[0], 12);SS1 = aaa + vv_[4] + Rotate(TSecond, j);SS1 = Rotate(SS1, 7);SS2 = SS1 ^ aaa;TT1 = FFSecond(vv_[0], vv_[1], vv_[2]) + vv_[3] + SS2 + ww_[j];TT2 = GGSecond(vv_[4], vv_[5], vv_[6]) + vv_[7] + SS1 + ww[j];#region 更新各個(gè)寄存器vv_[3] = vv_[2];vv_[2] = Rotate(vv_[1], 9);vv_[1] = vv_[0];vv_[0] = TT1;vv_[7] = vv_[6];vv_[6] = Rotate(vv_[5], 19);vv_[5] = vv_[4];vv_[4] = P0(TT2);#endregion}#endregion//256比特的雜湊值y =vv_(j+1) ABCDEFGHfor (j = 0; j < 8; j++){vv[j] ^= vv_[j];}// ResetxOff = 0;Array.Copy(X0, 0, X, 0, X0.Length);}internal override void ProcessWord(byte[] in_Renamed, int inOff){int n = in_Renamed[inOff] << 24;n |= (in_Renamed[++inOff] & 0xff) << 16;n |= (in_Renamed[++inOff] & 0xff) << 8;n |= (in_Renamed[++inOff] & 0xff);X[xOff] = n;if (++xOff == 16){ProcessBlock();}}internal override void ProcessLength(long bitLength){if (xOff > 14){ProcessBlock();}X[14] = (int)(SupportClass.URShift(bitLength, 32));X[15] = (int)(bitLength & unchecked((int)0xffffffff));}/// <summary>/// 寫入到大端/// </summary>/// <param name="n"></param>/// <param name="bs"></param>/// <param name="off"></param>public static void IntToBigEndian(int n, byte[] bs, int off){bs[off] = (byte)(SupportClass.URShift(n, 24));bs[++off] = (byte)(SupportClass.URShift(n, 16));bs[++off] = (byte)(SupportClass.URShift(n, 8));bs[++off] = (byte)(n);}/// <summary>/// 關(guān)閉摘要,產(chǎn)生最終的摘要值。doFinal調(diào)用使摘要復(fù)位。/// </summary>/// <param name="out_Renamed"></param>/// <param name="outOff"></param>/// <returns></returns>public override int DoFinal(byte[] out_Renamed, int outOff){Finish();for (int i = 0; i < 8; i++){IntToBigEndian(v[i], out_Renamed, outOff + i * 4);}Reset();return DigestLength;}/// <summary>/// x循環(huán)左移n比特運(yùn)算/// </summary>/// <param name="x"></param>/// <param name="n"></param>/// <returns></returns>private static int Rotate(int x, int n){return (x << n) | (SupportClass.URShift(x, (32 - n)));}#region 置換函數(shù)/// <summary>/// 置換函數(shù)P0/// </summary>/// <param name="x"></param>/// <returns></returns>private static int P0(int x){return (x) ^ Rotate(x, 9) ^ Rotate(x, 17);}/// <summary>/// 置換函數(shù)P1/// </summary>/// <param name="x"></param>/// <returns></returns>private static int P1(int x){return (x) ^ Rotate(x, 15) ^ Rotate(x, 23);}#endregion#region 布爾函數(shù)/// <summary>/// 0到15的布爾函數(shù)FF (X⊕^Y⊕Z)/// </summary>/// <param name="X"></param>/// <param name="Y"></param>/// <param name="Z"></param>/// <returns></returns>private static int FFOne(int X, int Y, int Z){return (X ^ Y ^ Z);}/// <summary>/// 16到63的布爾函數(shù)FF/// </summary>/// <param name="X"></param>/// <param name="Y"></param>/// <param name="Z"></param>/// <returns></returns>private static int FFSecond(int X, int Y, int Z){return ((X & Y) | (X & Z) | (Y & Z));}/// <summary>/// 0到15的布爾函數(shù)GG/// </summary>/// <param name="X"></param>/// <param name="Y"></param>/// <param name="Z"></param>/// <returns></returns>private static int GGOne(int X, int Y, int Z){return (X ^ Y ^ Z);}/// <summary>/// 16到63的布爾函數(shù)GG/// </summary>/// <param name="X"></param>/// <param name="Y"></param>/// <param name="Z"></param>/// <returns></returns>private static int GGSecond(int X, int Y, int Z){return ((X & Y) | (~X & Z));}#endregion}

1.4調(diào)用

/// <summary>/// Sm3算法(10進(jìn)制的ASCII) /// 在SHA-256基礎(chǔ)上改進(jìn)實(shí)現(xiàn)的一種算法 /// 對標(biāo)國際MD5算法和SHA算法/// </summary>public static class Sm3Crypto{/// <summary>/// sm3加密(使用自定義密鑰)/// </summary>/// <param name="data"></param>/// <returns></returns>public static byte[] ToSM3byte(string data, string key){byte[] msg1 = Encoding.Default.GetBytes(data);byte[] key1 = Encoding.Default.GetBytes(key);KeyParameter keyParameter = new KeyParameter(key1); SM3Digest sm3 = new SM3Digest();HMac mac = new HMac(sm3);//帶密鑰的雜湊算法mac.Init(keyParameter);mac.BlockUpdate(msg1, 0, msg1.Length);byte[] result = new byte[mac.GetMacSize()];mac.DoFinal(result, 0);return Hex.Encode(result);}/// <summary>/// sm3加密/// </summary>/// <param name="data"></param>/// <returns></returns>public static byte[] ToSM3byte(this string data){ var msg = data.ToHexByte();//把字符串轉(zhuǎn)成16進(jìn)制的ASCII碼 SM3Digest sm3 = new SM3Digest();sm3.BlockUpdate(msg, 0, msg.Length);byte[] md = new byte[sm3.GetDigestSize()];//SM3算法產(chǎn)生的哈希值大小sm3.DoFinal(md, 0);return Hex.Encode(md);}}

?

?

總結(jié)

以上是生活随笔為你收集整理的【转】C#实现SM3国密加密的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲三级大片 | 亚洲调教欧美在线 | 少妇毛片一区二区三区 | 性色av一区 | 欧美另类视频 | 国家队动漫免费观看在线观看晨光 | 日本免费成人 | 国产伦精品一区二区三区视频免费 | 精品久久久中文字幕人妻 | 51热门大瓜今日大瓜 | 在线免费av网址 | 午夜视频成人 | 麻豆剧场 | 欧美黑人添添高潮a片www | 日韩精品一区二区电影 | 亚洲va欧美va| 亚洲免费精品视频在线观看 | 国产一级伦理片 | 麻豆出品| 成人h动漫在线 | 欧美xxxx免费虐 | 欧美a级片在线观看 | 中文在线字幕免费观 | 一本久道久久综合 | 日本在线视频一区 | 国产在线无码精品 | 久久人人爽人人爽人人片av免费 | 伊人成年综合网 | 99福利| 蜜桃视频一区二区三区在线观看 | 久青草免费视频 | 亚洲一二三区在线观看 | 精品少妇人妻av一区二区三区 | 久草福利资源 | 亚洲人成网站999久久久综合 | 国产精品成人无码免费 | 久久二 | 一本一本久久a久久精品综合麻豆 | 国产丝袜在线 | 国产亚洲精品久久777777 | 成年人视频网站 | 精品人妻一区二区三 | 免费观看理伦片在线播放视频软件 | 国产免费片 | 激情网久久 | 亚洲婷婷在线视频 | 成 人片 黄 色 大 片 | 国产性精品 | 最近中文字幕免费 | 免费在线观看av网址 | 国产男女无套免费网站 | 成人在线视频一区 | 亚洲精品久久久久久久久久 | 中文字幕无产乱码 | 小泽玛利亚一区二区三区 | 国产精品偷拍 | 免费麻豆国产一区二区三区四区 | 欧美精品一区二 | 免费的三级网站 | 国产无套内射又大又猛又粗又爽 | 五月亚洲婷婷 | 99热香蕉 | 91久久久久一区二区 | 爱情岛论坛亚洲自拍 | 综合在线观看 | 欧美乱码精品一区二区 | 亚洲天堂视频网 | 黄网站在线播放 | 久久国产一区二区三区 | 欧美精品在线视频观看 | 日本精品一二三 | 国产精品天堂 | 老司机午夜福利视频 | 五月婷婷操 | 亚洲aav | 不卡av网 | 亚洲天堂激情 | 香蕉国产精品视频 | av免播放器在线观看 | 国产91视频播放 | 亚洲精品美女视频 | 有声小说 成人专区 | 亚洲国产在 | 国产又黄又猛的视频 | 亚洲欧美在线观看 | 国产在线久久久 | 天天干,天天干 | 亚洲av综合一区二区 | 男人的天堂色偷偷 | 精品影片一区二区入口 | 欧美成在线观看 | 最新中文字幕在线观看 | 精品一区免费观看 | 国产无套粉嫩白浆内谢 | 夜夜精品一区二区无码 | 99精品免费观看 | 国产成人福利 | www.夜夜夜 | 久久精品一二三 |