欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線(xiàn)實(shí)戰(zhàn)洞察。

C#國(guó)密算法庫(kù)拆解:SM2/SM3/SM4實(shí)現(xiàn)與聯(lián)調(diào)避坑

C#國(guó)密算法庫(kù)拆解:SM2/SM3/SM4實(shí)現(xiàn)與聯(lián)調(diào)避坑 簡(jiǎn)介面向需要在 C#/.NET 項(xiàng)目中落地國(guó)密算法的開(kāi)發(fā)者與學(xué)習(xí)者這套代碼示例圍繞 SM2、SM3、SM4 三種算法給出可運(yùn)行的 WinForm 演示幫助理解密鑰生成、簽名驗(yàn)簽、摘要計(jì)算及分組加解密的調(diào)用方式。壓縮包共 51 個(gè)文件約 5.33MB主體為 cs 源碼、resx 界面資源、dll 依賴(lài)庫(kù)與 exe 可執(zhí)行程序并附帶解決方案與項(xiàng)目配置便于在 Visual Studio 中打開(kāi)、調(diào)試和二次改造。內(nèi)容涵蓋算法工具類(lèi)、窗體交互邏輯及 BouncyCastle 加密庫(kù)引用讀者可對(duì)照界面操作觀察各算法的輸入輸出與參數(shù)配置快速梳理國(guó)密功能從界面到核心實(shí)現(xiàn)的代碼路徑。已有 1316 人學(xué)習(xí)下載適合作為 C# 國(guó)密入門(mén)、課程實(shí)驗(yàn)或業(yè)務(wù)模塊預(yù)研的參考樣例。1. 一次驗(yàn)簽失敗的聯(lián)調(diào)這套 C# 國(guó)密算法庫(kù)到底補(bǔ)的是哪個(gè)洞對(duì)接一個(gè)內(nèi)部系統(tǒng)的簽名接口對(duì)方說(shuō)只收國(guó)密算法SM2 簽名加 SM3 摘要報(bào)文用 SM4 加密。很多人第一反應(yīng)是在項(xiàng)目里搜一下有沒(méi)有現(xiàn)成的算法包結(jié)果發(fā)現(xiàn)可用的 C# 國(guó)密算法實(shí)現(xiàn)要么只覆蓋其中一兩種要么把密鑰編碼、密文排列這些細(xì)節(jié)隱藏了起來(lái)等到對(duì)方驗(yàn)簽失敗就無(wú)從查起。這套包含 SM2、SM3、SM4 的 C# 實(shí)現(xiàn)價(jià)值在于把曲線(xiàn)參數(shù)、補(bǔ)位規(guī)則、ZA 值計(jì)算、C1C3C2 排列這些容易被第三方庫(kù)隱藏起來(lái)的部分全部展開(kāi)成可讀代碼。適合正在做國(guó)密改造的后端開(kāi)發(fā)也適合想搞清楚算法內(nèi)部機(jī)理、準(zhǔn)備自己動(dòng)手增加支持的工程師。2. 目錄與運(yùn)行SM2/SM3/SM4 三套算法在工程里怎么分家2.1 三層拆分算法內(nèi)核、編碼適配、調(diào)用入口這類(lèi) C# 國(guó)密庫(kù)的目錄結(jié)構(gòu)通常分成三層這個(gè)劃分方式雖然簡(jiǎn)單但基本不會(huì)出錯(cuò)。算法內(nèi)核只關(guān)心數(shù)學(xué)和字節(jié)操作不接觸任何 IO編碼層負(fù)責(zé)十六進(jìn)制、Base64、ASN.1/DER、PEM 之間的轉(zhuǎn)換調(diào)用入口負(fù)責(zé)把參數(shù)整理好丟給內(nèi)核。第一次閱讀源碼時(shí)按這個(gè)順序看比從 Program.cs 往下追要快得多。SmCrypto/ ├── src/ │ ├── SmCrypto.Core/ # 純算法無(wú)外部依賴(lài) │ │ ├── Sm2/ │ │ │ ├── Sm2Curve.cs # 曲線(xiàn)參數(shù)、點(diǎn)運(yùn)算、點(diǎn)乘 │ │ │ ├── Sm2.cs # 簽名驗(yàn)簽、加解密、KDF │ │ │ └── Sm2KeyPair.cs # 密鑰生成與公私鑰解析 │ │ ├── Sm3/ │ │ │ └── Sm3.cs # 常量、填充、壓縮函數(shù) │ │ ├── Sm4/ │ │ │ ├── Sm4.cs # 輪函數(shù)、單分組加解密 │ │ │ ├── Sm4Constants.cs # S 盒、FK、CK │ │ │ └── Sm4Padding.cs # PKCS7 / 無(wú)填充 │ │ ├── Encoding/ │ │ │ ├── Hex.cs # 大小寫(xiě)、帶不帶空格 │ │ │ └── Asn1.cs # DER 序列化給密鑰和簽名用 │ │ └── Utils/ │ │ ├── BigIntegerExtensions.cs# 定長(zhǎng)大端轉(zhuǎn)換、模逆 │ │ └── SecureRandom.cs # 密碼學(xué)安全隨機(jī)數(shù) │ └── SmCrypto.Console/ │ └── Program.cs # 手敲的驗(yàn)證入口 └── tests/ └── SmCrypto.Tests/ # 標(biāo)準(zhǔn)測(cè)試向量 自身往返測(cè)試看這個(gè)結(jié)構(gòu)能發(fā)現(xiàn)一個(gè)細(xì)節(jié)SM2 單獨(dú)占一個(gè)目錄還分了三個(gè)文件。原因很實(shí)在SM2 是橢圓曲線(xiàn)算法點(diǎn)運(yùn)算、曲線(xiàn)參數(shù)、業(yè)務(wù)層的簽名驗(yàn)簽是三件不同的事混在一個(gè)類(lèi)里到后面加密鑰交換或者換曲線(xiàn)就麻煩了。SM3 和 SM4 各自只有一個(gè)主文件是因?yàn)樗鼈兊膶?shí)現(xiàn)相對(duì)獨(dú)立沒(méi)有那么多分支。2.2 目標(biāo)框架與依賴(lài)為什么寧可手寫(xiě)也不用系統(tǒng)接口.NET 生態(tài)里做國(guó)密有個(gè)現(xiàn)實(shí)問(wèn)題系統(tǒng)自帶的加密接口在多數(shù)版本上沒(méi)有覆蓋 SM2、SM3、SM4即使新版本在部分平臺(tái)上補(bǔ)了 SM3/SM4Windows 和 Linux 的行為也不完全一致跨平臺(tái)部署很容易遇到問(wèn)題。所以這套實(shí)現(xiàn)選擇純托管代碼零外部依賴(lài)System.Numerics.BigInteger就是唯一的大數(shù)工具。目標(biāo)框架怎么選看調(diào)用方。要被老項(xiàng)目引用就多目標(biāo)輸出netstandard2.0加net8.0只做新服務(wù)直接上net8.0省事。真正影響代碼寫(xiě)法的是這三處關(guān)注點(diǎn)netstandard2.0net8.0大數(shù)System.Numerics.BigInteger同上另有TryWriteBytes定長(zhǎng)輸出高性能切片需要System.Memory包原生Spanbyte隨機(jī)數(shù)RNGCryptoServiceProviderRandomNumberGenerator.Fill我一般會(huì)統(tǒng)一寫(xiě)RandomNumberGenerator.Create()拿一個(gè)實(shí)例兩個(gè)框架都能編譯不用寫(xiě)#if。這一點(diǎn)看似無(wú)關(guān)緊要但真正到適配各個(gè)框架版本時(shí)這一點(diǎn)會(huì)節(jié)省很多時(shí)間。提示不要把System.Random用在任何密鑰、k 值、IV 上。它產(chǎn)生的序列可預(yù)測(cè)SM2 的 k 一旦可預(yù)測(cè)私鑰就等價(jià)于公開(kāi)了。2.3 第一次運(yùn)行先把 SM3 的哈希值打印出來(lái)SM2 的調(diào)試成本高因?yàn)樗鼱砍峨S機(jī)數(shù)、點(diǎn)乘、編碼三件事所以第一次運(yùn)行不要碰 SM2先驗(yàn)證 SM3。新建一個(gè)控制臺(tái)項(xiàng)目引用 Core寫(xiě)十行代碼using SmCrypto.Core.Sm3; // 標(biāo)準(zhǔn)附錄里的經(jīng)典向量SM3(abc) byte[] digest Sm3.Hash(System.Text.Encoding.ASCII.GetBytes(abc)); System.Console.WriteLine(Hex.ToHex(digest, upper: false));跑起來(lái)dotnet run --project src/SmCrypto.Console正常輸出應(yīng)該是66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0這 64 個(gè)十六進(jìn)制字符對(duì)上了說(shuō)明填充邏輯、字節(jié)序、壓縮函數(shù)這三塊沒(méi)問(wèn)題。再補(bǔ)一個(gè)長(zhǎng)度不是 3 的用例驗(yàn)證填充邊界把a(bǔ)bcd重復(fù) 16 次正好 64 字節(jié)會(huì)觸發(fā)多補(bǔ)一整個(gè)分組期望結(jié)果debe9ff92275b8a138604889c18e5a4d6fdb70e5387e5765293dcba39c0c5732這兩個(gè)值都對(duì)SM3 這塊基本可以放心了。SM4 用標(biāo)準(zhǔn)向量key 0123456789abcdeffedcba9876543210、明文與 key 相同單分組加密結(jié)果是681edf34d206965e86b3e94f536e4246同一個(gè)塊再加密一次得到595298c7c6fd271f0402f804c33d3f66加解密往返能對(duì)回去才能說(shuō)明輪密鑰沒(méi)有寫(xiě)反。SM2 不適合這么驗(yàn)證后面第 4 章講怎么用往返測(cè)試加對(duì)方的公鑰做交叉驗(yàn)證。3. SM3 與 SM4從填充到輪函數(shù)兩段能直接抄的 C# 實(shí)現(xiàn)3.1 SM3 的填充與壓縮64 輪里真正在變的是什么SM3 輸出 256 位分組 512 位結(jié)構(gòu)上和常見(jiàn)的哈希算法相近但消息擴(kuò)展和輪函數(shù)里的置換是自己的一套。先看填充這是新手最容易寫(xiě)錯(cuò)的地方private static byte[] Pad(byte[] msg) { long bitLen (long)msg.Length * 8; // 比特長(zhǎng)度用 long 防止大報(bào)文溢出 int padLen 64 - (int)((msg.Length 9) % 64); // 0x80 一字節(jié) 8 字節(jié)長(zhǎng)度 if (padLen 64) padLen 0; // 剛好對(duì)齊時(shí)不再補(bǔ)整塊 byte[] buf new byte[msg.Length 1 padLen 8]; Buffer.BlockCopy(msg, 0, buf, 0, msg.Length); buf[msg.Length] 0x80; // 先補(bǔ)一個(gè) 1后面全 0 for (int i 0; i 8; i) buf[buf.Length - 1 - i] (byte)(bitLen (8 * i)); // 大端寫(xiě)長(zhǎng)度 return buf; }bitLen必須用 64 位整型長(zhǎng)度字段是大端序這兩點(diǎn)在跨語(yǔ)言對(duì)接時(shí)最常出錯(cuò)。padLen那個(gè)if判斷也不能少當(dāng)(msg.Length 9) % 64 0時(shí)會(huì)算出 64如果不處理就會(huì)多補(bǔ)一整塊哈希值直接不同。壓縮函數(shù)的核心是消息擴(kuò)展和 64 輪迭代private static void Compress(uint[] v, byte[] block, int offset) { uint[] w new uint[68]; uint[] w1 new uint[64]; for (int i 0; i 16; i) // 前 16 個(gè)字直接讀大端 w[i] ReadBe32(block, offset i * 4); for (int j 16; j 68; j) // 擴(kuò)展到 68 個(gè)字 w[j] P1(w[j - 16] ^ w[j - 9] ^ Rol(w[j - 3], 15)) ^ Rol(w[j - 13], 7) ^ w[j - 6]; for (int j 0; j 64; j) w1[j] w[j] ^ w[j 4]; // W 只是 W 的異或組合 uint a v[0], b v[1], c v[2], d v[3]; uint e v[4], f v[5], g v[6], h v[7]; for (int j 0; j 64; j) { uint t j 16 ? 0x79cc4519u : 0x7a879d8au; // 前 16 輪與后 48 輪常量不同 uint a12 Rol(a, 12); uint ss1 Rol(a12 e Rol(t, j % 32), 7); uint ss2 ss1 ^ a12; uint ff j 16 ? (a ^ b ^ c) : ((a b) | (a c) | (b c)); uint gg j 16 ? (e ^ f ^ g) : ((e f) | (~e g)); uint tt1 ff d ss2 w1[j]; uint tt2 gg h ss1 w[j]; d c; c Rol(b, 9); b a; a tt1; h g; g Rol(f, 19); f e; e P0(tt2); } v[0] ^ a; v[1] ^ b; v[2] ^ c; v[3] ^ d; // 末態(tài)異或回初值 v[4] ^ e; v[5] ^ f; v[6] ^ g; v[7] ^ h; } private static uint P0(uint x) x ^ Rol(x, 9) ^ Rol(x, 17); private static uint P1(uint x) x ^ Rol(x, 15) ^ Rol(x, 23);這里的參數(shù)說(shuō)明一下v是 8 個(gè) 32 位的初始向量第一塊用固定常量后續(xù)塊用上一塊的輸出Rol(x, n)是 32 位循環(huán)左移n要先% 32否則 C# 的移位運(yùn)算符只取低 5 位Rol(t, j % 32)里的取模不能省。w數(shù)組 68 個(gè)字、w1數(shù)組 64 個(gè)字這兩個(gè)長(zhǎng)度是固定的用List或者動(dòng)態(tài)擴(kuò)容會(huì)讓每塊多做幾次分配壓測(cè)時(shí)差別能看出來(lái)。3.2 SM4 輪函數(shù)一個(gè) T 變換貫穿 32 輪SM4 是分組長(zhǎng)度 128 位、密鑰長(zhǎng)度 128 位的分組密碼加密和解密用同一套輪函數(shù)只是輪密鑰順序反過(guò)來(lái)。它的全部復(fù)雜度都集中在T變換上// 字節(jié)代換把 32 位字按字節(jié)逐個(gè)查 S 盒 private static uint Tau(uint a) ((uint)SBox[(a 24) 0xFF] 24) | ((uint)SBox[(a 16) 0xFF] 16) | ((uint)SBox[(a 8) 0xFF] 8) | SBox[a 0xFF]; // 線(xiàn)性變換加密用 L密鑰擴(kuò)展用 L1少移位一次 private static uint L(uint b) b ^ Rol(b, 2) ^ Rol(b, 10) ^ Rol(b, 18) ^ Rol(b, 24); private static uint L1(uint b) b ^ Rol(b, 13) ^ Rol(b, 23); private static uint T(uint x) L(Tau(x)); // 輪函數(shù)里的合成置換 private static uint T1(uint x) L1(Tau(x)); // 密鑰擴(kuò)展里的合成置換S 盒是 256 字節(jié)的常量表放在Sm4Constants.cs里。寫(xiě)的時(shí)候容易犯的錯(cuò)是手抄表格抄錯(cuò)一個(gè)字節(jié)結(jié)果只有某些特殊輸入才會(huì)出錯(cuò)極難排查。建議直接從標(biāo)準(zhǔn)文檔復(fù)制然后寫(xiě)一個(gè)單元測(cè)試斷言SBox[0] 0xd6、SBox[255] 0x48用首尾兩個(gè)值做初步校驗(yàn)。密鑰擴(kuò)展和單分組加解密public static uint[] ExpandKey(byte[] key) { if (key.Length ! 16) throw new ArgumentException(SM4 密鑰必須 16 字節(jié)); uint k0 ReadBe32(key, 0) ^ 0xa3b1bac6; // FK 是四個(gè)固定常量 uint k1 ReadBe32(key, 4) ^ 0x56aa3350; uint k2 ReadBe32(key, 8) ^ 0x677d9197; uint k3 ReadBe32(key, 12) ^ 0xb27022dc; uint[] rk new uint[32]; for (int i 0; i 32; i) { uint k4 k0 ^ T1(k1 ^ k2 ^ k3 ^ Ck(i)); // CK 由公式生成不必手寫(xiě)表 rk[i] k4; k0 k1; k1 k2; k2 k3; k3 k4; } return rk; } // CK[i] (ck0,ck1,ck2,ck3)其中 ck_j ((4i j) * 7) mod 256 private static uint Ck(int i) { uint v 0; for (int j 0; j 4; j) v (v 8) | (uint)(((4 * i j) * 7) 0xFF); return v; } // 加解密共用解密時(shí)把輪密鑰倒著傳進(jìn)來(lái)即可 public static void CryptBlock(uint[] rk, byte[] input, int inOff, byte[] output, int outOff) { uint x0 ReadBe32(input, inOff); uint x1 ReadBe32(input, inOff 4); uint x2 ReadBe32(input, inOff 8); uint x3 ReadBe32(input, inOff 12); for (int i 0; i 32; i) { uint x4 x0 ^ T(x1 ^ x2 ^ x3 ^ rk[i]); // 一輪只產(chǎn)出一個(gè)新字 x0 x1; x1 x2; x2 x3; x3 x4; } // 輸出要反序這一步漏了會(huì)得到完全對(duì)不上的結(jié)果 WriteBe32(output, outOff, x3); WriteBe32(output, outOff 4, x2); WriteBe32(output, outOff 8, x1); WriteBe32(output, outOff 12, x0); }參數(shù)上要注意兩件事。第一rk是 32 個(gè) 32 位輪密鑰加密時(shí)正序解密時(shí)rk.Reverse()即可不需要另寫(xiě)一個(gè)解密函數(shù)。第二最后輸出必須反序x3 x2 x1 x0這是標(biāo)準(zhǔn)里寫(xiě)死的反變換很多人在這卡一下午因?yàn)榧用芙Y(jié)果看著“像那么回事”只是每個(gè)塊都對(duì)不上。3.3 分組模式與填充ECB 之外還得有 CBC 和 PKCS7單分組函數(shù)只是零件實(shí)際報(bào)文長(zhǎng)度很少正好是 16 的倍數(shù)所以要有模式和填充。ECB 實(shí)現(xiàn)最簡(jiǎn)單但同樣的明文塊會(huì)得到同樣的密文塊圖片、表格類(lèi)數(shù)據(jù)一眼就能看出結(jié)構(gòu)業(yè)務(wù)上一般不允許用。CBC 更常見(jiàn)public static byte[] EncryptCbc(byte[] key, byte[] iv, byte[] plain) { if (iv.Length ! 16) throw new ArgumentException(CBC 的 IV 必須 16 字節(jié)); byte[] padded Sm4Padding.Pkcs7(plain, 16); // 補(bǔ)到 16 的倍數(shù) byte[] cipher new byte[padded.Length]; byte[] prev (byte[])iv.Clone(); uint[] rk ExpandKey(key); byte[] block new byte[16]; for (int i 0; i padded.Length; i 16) { for (int j 0; j 16; j) block[j] (byte)(padded[i j] ^ prev[j]); // 先和上一塊密文異或 CryptBlock(rk, block, 0, cipher, i); Buffer.BlockCopy(cipher, i, prev, 0, 16); // 本塊密文成為下一塊的 prev } return cipher; }Sm4Padding.Pkcs7的邏輯是缺 n 字節(jié)就補(bǔ) n 個(gè)值為 n 的字節(jié)正好對(duì)齊時(shí)補(bǔ)一整塊 16 個(gè)0x10。這個(gè)“正好對(duì)齊也要補(bǔ)”的規(guī)則是解密時(shí)判斷填充長(zhǎng)度的依據(jù)少補(bǔ)這一塊對(duì)方解出來(lái)的尾巴會(huì)被當(dāng)成數(shù)據(jù)。IV 每次加密都要換新的隨機(jī)值跟著密文一起發(fā)過(guò)去不需要保密但絕不能固定不變否則相同明文前綴的密文前綴也相同。注意CBC 只保證機(jī)密性不保證完整性。要防篡改還得在密文后面附加 SM3 或 SM2 的校驗(yàn)值或者干脆用 SM2 加密會(huì)話(huà)密鑰、SM4 加密數(shù)據(jù)的兩段式方案。4. SM2 關(guān)鍵鏈路曲線(xiàn)參數(shù)、ZA 值與密文排列4.1 曲線(xiàn)參數(shù)與密鑰對(duì)先把 BigInteger 的字節(jié)序捋順SM2 用的是 256 位素域上的橢圓曲線(xiàn)曲線(xiàn)方程、基點(diǎn)、階都是固定常量直接照標(biāo)準(zhǔn)抄進(jìn)Sm2Curve.cs。真正的坑不在參數(shù)在BigInteger的字節(jié)序C# 的BigInteger內(nèi)部是小端構(gòu)造函數(shù)默認(rèn)還帶符號(hào)位而國(guó)密的所有數(shù)據(jù)都是大端無(wú)符號(hào)定長(zhǎng)。// 定長(zhǎng) 32 字節(jié)大端輸出左側(cè)補(bǔ) 0 補(bǔ)齊 internal static byte[] ToFixed32(BigInteger v) { byte[] raw v.ToByteArray(isUnsigned: true, isBigEndian: true); if (raw.Length 32) return raw; byte[] result new byte[32]; Buffer.BlockCopy(raw, 0, result, 32 - raw.Length, raw.Length); return result; } // 反過(guò)來(lái)讀的時(shí)候也要聲明無(wú)符號(hào)大端否則最高位為 1 會(huì)變成負(fù)數(shù) internal static BigInteger FromFixed32(byte[] buf, int offset) new BigInteger(new ReadOnlySpanbyte(buf, offset, 32), isUnsigned: true, isBigEndian: true);ToFixed32里那個(gè)補(bǔ)零動(dòng)作不能省。橢圓曲線(xiàn)坐標(biāo)偶爾會(huì)出現(xiàn)高位為 0 的情況概率大約 1/256如果直接ToByteArray輸出會(huì)少一個(gè)字節(jié)長(zhǎng)度變成 31對(duì)方解析直接報(bào)錯(cuò)。這種概率性錯(cuò)誤最難排查本地跑一百次都好上線(xiàn)跑一萬(wàn)次報(bào)一次。密鑰對(duì)生成就是取一個(gè)[1, n-1]的隨機(jī)數(shù)當(dāng)私鑰再算d * G得到公鑰點(diǎn)public static (BigInteger d, byte[] publicKey) GenerateKeyPair() { BigInteger d; do { d Sm2Curve.RandomScalar(); } while (d.IsZero || d Sm2Curve.N); var (x, y) Sm2Curve.MultiplyG(d); // 未壓縮點(diǎn)格式04 || X(32) || Y(32)共 65 字節(jié) byte[] pub new byte[65]; pub[0] 0x04; Buffer.BlockCopy(ToFixed32(x), 0, pub, 1, 32); Buffer.BlockCopy(ToFixed32(y), 0, pub, 33, 32); return (d, pub); }公鑰點(diǎn)的序列化格式有三種未壓縮04||X||Y65 字節(jié)、壓縮02/03||X33 字節(jié)、純裸X||Y64 字節(jié)。不同系統(tǒng)默認(rèn)值不一樣聯(lián)調(diào)前先問(wèn)清對(duì)方用哪種或者干脆在庫(kù)里三種都支持讀的時(shí)候看首字節(jié)判斷。4.2 簽名與驗(yàn)簽ZA 值沒(méi)算對(duì)后面全白搭SM2 簽名和很多人熟悉的橢圓曲線(xiàn)簽名差別在于被簽的不是消息的哈希而是ZA || M的哈希。ZA是用戶(hù)標(biāo)識(shí)、曲線(xiàn)參數(shù)、公鑰點(diǎn)的哈希摘要作用是把簽名和具體身份綁定起來(lái)。這一步漏了或者用戶(hù) ID 用了默認(rèn)值而對(duì)方用的是自己的驗(yàn)簽 100% 失敗而且失敗信息沒(méi)有任何提示。// ZA SM3(ENTL || ID || a || b || Gx || Gy || Px || Py) private static byte[] ComputeZa(byte[] userId, BigInteger px, BigInteger py) { int bitLen userId.Length * 8; // ENTL 是 ID 的比特長(zhǎng)度2 字節(jié)大端 var ms new MemoryStream(); ms.WriteByte((byte)(bitLen 8)); ms.WriteByte((byte)bitLen); ms.Write(userId); ms.Write(ToFixed32(Sm2Curve.A)); ms.Write(ToFixed32(Sm2Curve.B)); ms.Write(ToFixed32(Sm2Curve.Gx)); ms.Write(ToFixed32(Sm2Curve.Gy)); ms.Write(ToFixed32(px)); ms.Write(ToFixed32(py)); return Sm3.Hash(ms.ToArray()); } public static (BigInteger r, BigInteger s) Sign(byte[] message, BigInteger d, byte[] userId) { var (px, py) Sm2Curve.MultiplyG(d); byte[] za ComputeZa(userId, px, py); // e SM3(ZA || M)再當(dāng)作 256 位大端無(wú)符號(hào)整數(shù) byte[] digest Sm3.Hash(Concat(za, message)); BigInteger e new BigInteger(digest, isUnsigned: true, isBigEndian: true); while (true) { BigInteger k Sm2Curve.RandomScalar(); var (x1, _) Sm2Curve.MultiplyG(k); BigInteger r (e x1) % Sm2Curve.N; if (r.IsZero || (r k) % Sm2Curve.N 0) continue; // 規(guī)范要求重取 k BigInteger s BigInteger.ModPow(1 d, Sm2Curve.N - 2, Sm2Curve.N) * (k - r * d) % Sm2Curve.N; if (s.Sign 0) s Sm2Curve.N; // C# 取模會(huì)保留負(fù)號(hào)必須手動(dòng)修正 if (s.IsZero) continue; return (r, s); } }逐段說(shuō)明。ComputeZa里的所有長(zhǎng)度都必須定長(zhǎng) 32 字節(jié)少一位整體就變了所以統(tǒng)一走ToFixed32。默認(rèn)用戶(hù) ID 是 16 字節(jié)的固定字符串很多系統(tǒng)的開(kāi)放接口就是用它但私有協(xié)議經(jīng)常換成自己的 appId這一項(xiàng)必須和對(duì)方確認(rèn)。ModPow(x, n-2, n)是在求模逆因?yàn)閚是素?cái)?shù)費(fèi)馬小定理成立比手寫(xiě)擴(kuò)展歐幾里得快也不用擔(dān)心邊界。s的負(fù)數(shù)處理是 C# 特有的一處。C# 的%運(yùn)算符對(duì)負(fù)數(shù)返回負(fù)值s.Sign 0時(shí)加一次n才能回到[0, n-1]。在 Java 或 Python 里寫(xiě)習(xí)慣的人換到 C# 上很容易忽略這一點(diǎn)結(jié)果只有極少部分簽名是負(fù)數(shù)測(cè)試樣本少的時(shí)候根本發(fā)現(xiàn)不了。驗(yàn)簽就是反過(guò)來(lái)算檢查r、s是否在[1, n-1]算t (r s) mod nt 0直接拒然后算點(diǎn)(x1, y1) s*G t*P判斷(e x1) mod n r。4.3 加解密與密文順序C1C3C2 和 C1C2C3 的互相傷害SM2 加密產(chǎn)出的三部分C1是隨機(jī)點(diǎn)kGC2是明文異或 KDF 流C3是校驗(yàn)摘要。老版本標(biāo)準(zhǔn)把順序?qū)懗蒀1C2C3新標(biāo)準(zhǔn)改成C1C3C2兩套在現(xiàn)實(shí)系統(tǒng)里都還在用所以庫(kù)里一定要留一個(gè)開(kāi)關(guān)。public static byte[] Encrypt(byte[] message, byte[] publicKey, bool c1c3c2 true) { var (x, y) Sm2Curve.DecodePoint(publicKey); // 04 || X || Y while (true) { BigInteger k Sm2Curve.RandomScalar(); var (x1, y1) Sm2Curve.MultiplyG(k); var (x2, y2) Sm2Curve.Multiply(new Point(x, y), k); byte[] t Kdf(Concat(ToFixed32(x2), ToFixed32(y2)), message.Length); if (t.All(b b 0)) continue; // 全 0 說(shuō)明 KDF 失效規(guī)范要求重來(lái) byte[] c1 Sm2Curve.EncodePoint(x1, y1); // 65 字節(jié) byte[] c2 Xor(message, t); byte[] c3 Sm3.Hash(Concat(ToFixed32(x2), message, ToFixed32(y2))); return c1c3c2 ? Concat(c1, c3, c2) : Concat(c1, c2, c3); } }KDF 是基于 SM3 的計(jì)數(shù)器派生internal static byte[] Kdf(byte[] z, int klen) { byte[] output new byte[klen]; for (int i 0, ct 1; i klen; i 32, ct) { // 計(jì)數(shù)器是 4 字節(jié)大端接在共享點(diǎn)后面一起哈希 byte[] h Sm3.Hash(Concat(z, new byte[] { (byte)(ct 24), (byte)(ct 16), (byte)(ct 8), (byte)ct })); Buffer.BlockCopy(h, 0, output, i, Math.Min(32, klen - i)); } return output; }解密的順序是先按配置把三段拆開(kāi)用C1和自己的私鑰算出共享點(diǎn)(x2, y2)用同樣的 KDF 得到t異或回C2最后重算C3比對(duì)。C3比對(duì)必須用固定時(shí)間比較逐字節(jié)異或累加不要用SequenceEqual提前返回這類(lèi)細(xì)節(jié)在安全審計(jì)時(shí)會(huì)被挑出來(lái)。5. 避坑與排查聯(lián)調(diào)現(xiàn)場(chǎng)最常見(jiàn)的五個(gè)問(wèn)題這一章是整套實(shí)現(xiàn)里最值錢(qián)的部分。算法本身照著標(biāo)準(zhǔn)寫(xiě)就行真正耗時(shí)間的是下面這些表現(xiàn)完全一樣、原因各不相同的問(wèn)題。5.1 驗(yàn)簽一直返回 false但雙方代碼看著都“對(duì)”現(xiàn)象自測(cè)簽名驗(yàn)簽往返完全正常一旦換成對(duì)方給的公鑰就失敗把對(duì)方發(fā)來(lái)的簽名拿去驗(yàn)也失敗兩邊都不報(bào)異常只是布爾值 false。原因九成是 ZA 里的用戶(hù) ID 不一致。默認(rèn) ID 是 16 個(gè)字節(jié)的固定串而對(duì)方可能用了自己的應(yīng)用標(biāo)識(shí)另一個(gè)可能是對(duì)方把ZA || M里的M先做了 Base64 解碼再哈希而你直接對(duì)字符串字節(jié)哈希。解決讓對(duì)方明確給出 ID 的原始字節(jié)不是 Base64不是十六進(jìn)制并且約定M到底是原始報(bào)文還是某種規(guī)范化之后的字符串。確認(rèn)后先用SM3(ZA)單獨(dú)對(duì)比一次把 ZA 的哈希值發(fā)給對(duì)方核對(duì)這比反復(fù)試簽名快得多。ZA 一致了簽名再不對(duì)才是曲線(xiàn)參數(shù)或s負(fù)數(shù)處理的問(wèn)題。5.2 SM4 加密結(jié)果第一塊對(duì)、后面全不對(duì)現(xiàn)象16 字節(jié)以?xún)?nèi)的短報(bào)文加密結(jié)果和對(duì)方一致一旦超過(guò) 16 字節(jié)第一塊密文相同第二塊開(kāi)始全亂。原因CBC 的鏈?zhǔn)疆惢驅(qū)戝e(cuò)了。常見(jiàn)兩種寫(xiě)法錯(cuò)誤一是用明文塊而不是密文塊作為下一輪的prev二是循環(huán)里prev更新寫(xiě)在異或之前。解決把Buffer.BlockCopy(cipher, i, prev, 0, 16)放在CryptBlock之后、下一輪異或之前中間不要有別的賦值。驗(yàn)證方法是拿 32 字節(jié)的固定輸入手工用第一塊密文異或第二塊明文看結(jié)果是不是和內(nèi)部中間值一致。5.3 SM2 加密偶發(fā)“密文長(zhǎng)度不對(duì)”重啟又好了現(xiàn)象接口大部分時(shí)間正常偶爾報(bào)密文長(zhǎng)度異常日志里能看到長(zhǎng)度是 96 或 98 而期望 97 或 112 之類(lèi)的值。原因BigInteger.ToByteArray()輸出的長(zhǎng)度不固定。坐標(biāo)高位為 0 時(shí)會(huì)少一個(gè)字節(jié)如果沒(méi)用isUnsigned: true最高位為 1 時(shí)還會(huì)多出一個(gè)0x00符號(hào)字節(jié)。兩種都會(huì)讓C1的長(zhǎng)度在 64、65、66 之間抖。解決所有點(diǎn)坐標(biāo)輸出統(tǒng)一走定長(zhǎng) 32 字節(jié)的轉(zhuǎn)換函數(shù)不要直接調(diào)ToByteArray。再在解碼側(cè)加一層防御讀到C1時(shí)按首字節(jié)判斷格式04未壓縮、02/03壓縮、其余按裸坐標(biāo)補(bǔ)齊別硬編碼固定偏移量。5.4 大量數(shù)據(jù)加密時(shí) CPU 打滿(mǎn)單條報(bào)文要幾十毫秒現(xiàn)象壓測(cè)時(shí) SM4 的吞吐還能接受但整個(gè)接口 RT 很高火焰圖顯示時(shí)間集中在 SM2 的標(biāo)量乘上。原因一次 SM2 加解密要做兩次點(diǎn)乘kG和kP樸素的雙倍點(diǎn)算法每次都做模逆模逆是這里面最貴的一步另外BigInteger是不可變類(lèi)型循環(huán)里頻繁產(chǎn)生中間對(duì)象GC 壓力也上來(lái)了。解決把點(diǎn)運(yùn)算改到雅可比坐標(biāo)下做只在最后一步轉(zhuǎn)回仿射坐標(biāo)一次點(diǎn)乘的模逆從幾百次降到 1 次kG因?yàn)榛c(diǎn)固定可以預(yù)計(jì)算一張表做固定窗口加速。業(yè)務(wù)側(cè)更好的做法是不用 SM2 直接加密大報(bào)文改成 SM2 加密一把隨機(jī)的 SM4 密鑰數(shù)據(jù)走 SM4性能差距是數(shù)量級(jí)的。5.5 升級(jí)框架版本后簽名結(jié)果變了現(xiàn)象從舊框架遷到新框架同樣的私鑰、同樣的報(bào)文對(duì)方突然驗(yàn)簽失敗而自測(cè)往返還是通的。原因隨機(jī)數(shù)來(lái)源換掉了或者BigInteger的行為在新運(yùn)行時(shí)上有細(xì)微差異。更隱蔽的一種是把k寫(xiě)成了固定值做“可復(fù)現(xiàn)測(cè)試”上線(xiàn)忘了改回去兩次簽名用了同一個(gè)k從本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美成人AAA片一区国产精品| 9l视频自拍9l视频自拍九色学生| 九月丁香婷婷综合| 久久综合天天综合| 成人va在线观看视频| 婷婷五月天桃花网| 99热国产| 色一情一乱一乱一区91Av| 六月丁香五月激情网| 97黑人精品区| 久久九九99.www| 五月丁香免费看| 伊人五月丁香| 日逼免费视频 | 99久热这里有精品| 久久五月婷| 91干99| www.狠狠| 色五月欧美| 开心深爱激情网| 色婷婷狠狠干| 五月丁香色色网| 97操碰98| 五月伊人91| 99在线免费观看| 婷婷久久免费| 99干日本| 综合婷婷久久| 色色激情五月| 久久激情五月天| 99无吗| 狠狠干激情五月| 激情丁香五月天综合| 一级性感毛片| 91视频久久久| 色一情一乱一乱91Av| 91色综合久久| 日逼影音先锋AV男人资源站| xxxx五月天色色| 中文字幕一色哟哟哟哟| 色综色网| 丁香五月伊人| 国产精品成人网站| 亚洲无码yw| 日韩成人影片在线观看| avv在线| 婷婷综合中文字幕| 色婷婷在线视频观看| 成人国产欧美大片一区| 无码少妇高潮喷水A片免费| 色色激情五月天| √天堂资源在线人妻熟女| 99热这里只有精品9| 99av视频| 玖玖99免费视频| 五月六月婷| www夜夜操com| AV五月丁香| 九九精品综合| 亚洲精品亚洲人成人网| 久久久国产精品黄毛片| 久久密臀婷婷| 婷婷综合网性| 开心婷婷五月天综合| 久九色| 五月天大香蕉| 色狠狠综合网| 日本美女五月天| 五月婷婷综合在线| 欧洲色色| 十二区无码| 婷婷久久在线| www色色色com| 99热这里只有精品50| 996热re视频精品视频这里| 色狠狠六月| 日日夜夜天天爽| 人人妻久久妻| 这里只有精品1| 国产精品涩涩涩视频网站| 婷婷久久综合久| 亚洲无AV在线中文字幕| 色情五月| 袁子仪视频观看| 婷婷五月天性| 啪啪婷婷五月天激情| 亚洲激情视频在线观看| 国产婷伊人| 九热av| 99热99草97| 久久婷网| 99热精品一| 伊人久久丁香狠狠婷婷综合香蕉| 99aese| 国产探花AV在线| 日韩十国产极品久久| 可以看的AV| 午夜激情综合| 三日本无码| 伊人玖玖婷婷| 日日鲁鲁夜夜爽爽| 91操熟女| 东京热人妻一区二区三区在线| 日本久久人| 婷婷丁香五月av| 99爱最新免费视频在线观看| www超碰| 国产精品久久久久久久久久| 色欲婷婷五月天| A一级操| 色婷婷五月天小说| 五月婷婷色| 丁香五月玖玖| va婷婷在线| 天天色噜| 亚洲一二三网| 五月婷婷久久综合| 91精品久久久久久综合五月天| 久热免费视频| 色综合激情| 久热这里只有精品66| 激情99| 成人无码精品1区2区3区免费看| 超爽内射| 五月婷六月天| 五月天婷婷激情| 东京热人妻一区二区三区在线| 91玖玖| 亚洲六月婷| 成人国产综合| 五月99久久| 五月天欧美 另类小说| 在线观看免费狠狠色丁香香综合| 狠狠爱婷婷五月天| 亚洲日韩26uuu| 色碰碰| 色六月 婷婷| 色综合婷婷| 五月婷婷在线综合| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 男人天堂亚洲综合| 色色网站| 六月丁香啪啪| 日韩成人AV在线| a片在线免费观看一区| 亚洲人人96@| 日本在线视频播放91| 操逼视频网址| 女人天堂 AV| 色婷婷丁香五月天| 久久无码激情视频| 亚洲人妻av| 婷婷色色欧美| 天天色99| 色婷婷超碰| 久久婷婷五月综合色和| 色婷婷aV四虎| 婷婷网五月天| 伊人五月天97| 色玖玖导航| 大香蕉娱乐| 久久99久久99精品免观看软件 | 色色射| 伊人久久大香蕉网| 久热婷婷| 天搞天天天天天| 91碰超| 五月丁香天堂| 婷婷五月天成人网| 任你擦免费视频| 九九无码| 91人妻人人做人碰人人爽九色| 日日日日日| 区啪精品| www.日韩国产| 久久婷婷五月天懂色| 九月婷婷色色| 婷五月丁香俺| 精品亚洲国产成人A片在线鸭王| 五月丁香爱婷婷深深| 亚洲色在线观看| 五月激情视频| 国产精产国品一二三在观看 | 婷婷久久久| 日韩综合久久| 色婷婷综合网站| 天天激情综合| W色综合| 色五月综合网| 日韩一级网站| 99热这里只有精品在线观看| 2020久久婷婷五月| 亚洲成人网址在线观看| 九九无码| VA日本视频| 嫩BBB槡BBBB搡BBBB| 天天插天天日天天爽| 666555。COm毛片| www五月天激情com| 强伦轩人妻一区二区电影| 久久9热| 久久9精品视频| www.超碰在线| 手机AVAV天堂看网| 91精产一区三区免费观看| 99热主页日本| 天天干-天天日| 色色亚洲99com| 亭亭五月丁香五月天激情| 亚洲四色五月| 99热网站| 五月亭亭网成人在线视频| 色婷婷88| 91午夜婷婷狠狠久久综合9色| 五月婷婷丁香在线| 五月天天天操天天爽夜夜操| 国产欧美大香蕉一区| 五月天婷婷色| 99久久综合网| 色婷婷六月天| 玖玖婷婷五月天毛片| 天天做天天爱| 颜射 精品性爱av| 七七色色综合| 九九色网专区| 丁香五月成人社区| 亚洲免费婷婷| 五月综亚洲| 99资源人人| 97碰在线视频| 无码操B| 色五月xxx| 97luluse| 91超级碰| 99操久久| 五月天六月婷婷| 日韩婷婷| 91九色欧美| 97色在线| 色综合com| 第一区久久网站| 51XX午夜影福利| 国产午夜成人AV在线播放| 人人播| 色综合天天网| 97干免费视频| 婷婷丁香www视频日本韩国| 99精品网| 97操视频| 99视频在线观看网址| 亚洲 精品 综合 精品| 日韩一级网站| 色色色色色色色色色色色色色色,网站| 五月天激情小说| 天天做好综合色| 人妻乱码久久久| 99精品久久久久| 婷婷五月天综合亚洲| 色五月色五天色情网| 五月香六月婷| 婷婷激情区| 色婷婷香蕉| 免费超碰在线| www.cao.com久久| 亚洲精品久久久久久久久久吃药| 亚洲男女激情| 日本三级日本三级99| www.99情趣网| 亚洲日日操| 精品99爱免费视频在线观看| 免費亭亭成人| 婷婷丁香五月视频| 亚洲性爱干干| 五月天 综合 在线| 精品一区二区三区四区五区六区介绍 | www,色色色网站| 激情综合激情五月| 狠狠操天天日| 亚洲色色色色| 五月天婷婷五月| peg 2区三区四区的| www.婷婷五月天.com| 射久久丁香五月| 黄色高清无码| 色婷婷另类| 日本激情综合| 久9热在线免费观看| 青草视频在线观看视频| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | www.com久久久久久久久久久久久久久久久| 午夜色婷婷| 色99在线| 久/久精品99看9| A久久| 亚洲热久久| 草草视频91| 无码人妻电影| 久久HD| 狠狠操狠狠插| 无码免费人妻A片AAA毛片西瓜| 激情五月婷婷| 青青久久五月| 久激情| 激情啪啪五月天| 成人网页在线观看| 五月丁香六月综合基地| 六月丁香婷婷五月天| 日韩无码专区| 婷婷五月天成人动漫 | 爆乳熟妇一区二区三区爆乳照片| 丁香五月天啪啪| 狠狠穞A片一區二區三區| 天天插天天插天天插天天插| 丰满少妇猛烈A片免费看观看| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 色999五月色| 久久98| 国产亚洲成AV人片在线观黄桃| 99ER热精品视频| 狠狠爱青青草| 九九色区| 在线国产精品色| 天天做天天双| 婷婷五月天激情小说| 亚州操操| 农村熟妇高潮精品A片| 婷婷综合中文| 国产婷婷五月天| 淫荡家庭AV| 99精品在| 久9无码视频| 99热在线播放| 日本97在线看片| 香蕉久久六月| 我爱婷婷五月天综合88| 97热在线精品| 亚洲成人AV电影在线| αV电影| a九九热www| 天天做综合| 婷婷亚洲在线| 亚洲成人在线播放| 久久婷婷网址| 99 热| 人人人va亚洲视频在线| 亚洲天堂久久| 99九九99九九九视频精品| 色综合久久综合中文综合网| 久热这里只有精品视频6| 色色色色网站| 亚洲情综合五月天| 丁香花五月天激情| 天天摸夜夜夜| 丁香六月激情| 激情AV在线| 婷婷色天香| 久热免费| 伊人五月婷| 日韩久热| 亚洲色99| 日本女色人人| 激情综合播播| 99热只有| 人人妖人人97| 五月婷婷综合激情| 99在线69| 五月婷婷狠狠久久| 欧美综合在线五月天色婷婷| 99免费| 五月五月婷婷| 五月天婷婷青青草| 激情五月综合网| 婷婷综合一二三| 97色伦另类图片小说视频 | 色五月婷色彩免播放器| 天天色天天日天天舔| 精品久热| 九九热AV| 一区二区乱码视频| 99久免费视频| 色99热| 婷婷色婷婷| 97婷婷丁香| 六月丁香成人网| 九九色婷婷| 天天操天天曰天天射| 激情五月,深深爱五月| 五月色亚洲| 97干婷婷| 狠狠色噜噜狠狠狠狠综合| 国产乱人偷精品人妻A片| 五月丁香影院| 99综合免费视频| 色五月,婷婷大香蕉| www.夜夜.com| 免费碰碰视频久| 人人爱天天摸摸天天爱| 久热这里| 色欲婷婷夜夜| 香蕉综合网| 香蕉久久国产AV一区二区| 99re这里只有| av激情在线| 自拍盗摄 另类| 性欧美大战久久久久久久83| 草婷婷在线| 极品少妇高潮啪啪AV无码| 天天爽在线视频| www狠狠| 久婷久婷| 操操碰| 色婷婷亚洲| 丁香久月| 色欲丁香| 天天爽人人综合免费7799| 欧美色色色| 99碰碰| 大香蕉久久久| 婷婷五月激情小说| xxxx五月| 日韩在线看AV| 色色色色网色色网色色| av五月丁香| 26uuu欧美日本| 国产亚洲成AV人片在线| 婷婷五月天视频免费在线观看| 欧美六月婷婷| 99热热这里只精品996小说| 日本97久久久精品| AV五月丁香| 天天搡日日搡aaaaⅩ| 成人五月天丁香婷| 五月六月丁香激情视频| 久久久国产精品黄毛片| 婷婷丁香五月综合激情视频| 国精产品一区二区三区| 免费亚洲婷婷中文字幕| 激情五月图| 国自产拍偷拍精品啪啪一区二区| 俺也去在线视频| 热九九九九| 婷婷五月影院| 五月天激情黄色小说在线观看| 99久久这里只有精品| 天天拍夜夜撸| 丁香婷婷五月天成人| 婷婷五月另类网站| a在线观看| 免费无码毛片一区二区A片| 六月丁香五月亭亭| 久久婷婷亚洲无码一起| 色情成人五月天| 国产Va视频| 婷婷六月香| 丁香五婷婷| 噜综合| 久久婷婷五月综合色区| 狼人婷婷综合| 色九月激情综合网| 玖玖99精品视频| 啊v视频在线观看| ri电影在线| 亚洲AV成人精品网站在线播放| 夜夜爽天天爽| 婷婷激情六月综合| 婷婷性爱视频在线| 激情综合五月| www久久艹| 五月婷无码| 丁香色情五月综合激情| 99这里| av在线色五月丁香婷区久| 人妻激情视频| 亚洲成人AV高清字幕| 六月综合婷婷开心伊人| 综合久色五月| 99噜噜| 亚洲精品白浆高清久久久久久 | 天堂久久婷婷| 五月婷婷六月奇米网丁香| 91狠狠色色丁香婷婷综合久久| 人人摸人人干| 色婷婷久久综合| 婷婷丁香五月欧美人| 综合久久高清| 99国产97在线,| 精品人妻久久久久久| 丁香五月婷婷激情蜜桃| 九九视频精品这里只有| 天天射天天干天插色综合| 久久精品国产AV一区二区三区 | 亚洲网视屏| 开心激情网在线| 五月婷婷综合热| 久久影视婷婷五月| 九九九激情综合| 无码人妻激情| 五月天开心激情综合网| Jh7Uf088VHafNm| 日本99久久| 开心久久网婷婷| 丁香五月综合| 亚洲人妻av| 天天透天天爱| 99热精品6| 亚洲人人96@| 婷婷久久久久| 99热线观看9| 婷婷综合天堂| 激情五月天。| 色色三级视频| 免费观看全黄做爰的视频| 亚洲综合在线视频| 五月综合激情| 天天综合 99久久婷婷| 伊人久久五月天| bbwcuckold精品熟妇| 人人操人人操919999| 毛v一区二区视频| 久综合4| 成人做爰高潮A片免费视频| 亚洲视频99| 亚洲国产成人在线| 婷婷五月电影| 色天堂A| 99久在线精品99re5热视频| 毛片毛片毛片毛片| 天天爽天天做| 五月婷在线播放| 激情网五月婷婷| www.91有码.com| 日本丁香五月婷婷| 亚洲成色综合网站免费观看| 国产阿姨日皮艹逼内射视频| 久久这里只有精品07| 欧日美女Va| 五月成人网站| 婷婷丁香在线播放| 久久思思热视频| 99热日| 色婷婷丁香AV综合| 色婷婷激情视频| 蜜臀av在线成人电影| 呦呦视频无码播放| 69色色视频| 五月婷婷六月婷| 狠狠撸激情综合丁香五月天俺来啦| RenRenSe在线视频网站| 五月婷婷视频ab| 伊人色欲五月天| 亚洲狠狠狠| 51avj视频大全| 五月天综合婷婷| 99看片| 亚卅毛片| 九九热在线精品视频| 九九在线精点品| 激情六月婷婷| 依人大香蕉在钱1| 99在线小视频| 97人人看| 五月丁香六月婷婷在线小说视频| 色区域网站视频| 99热在线这里| 97狠狠色| 国产成人精品一区二三区熟女在线| 精品一二三区久久AAA片| 色欲AVV| 日韩淑女人妻luan伦激情精品一区二| 午夜爱插插| 久热精品视频在线观| 色亚洲视频| 色欲AV导航| 婷婷激情人妻| 国内外色色色色色成人视频| 岛囯综合激情网| 综合一区二区三区| 婷婷激情另类| 激情综合网五月天| 99热这里只有精品青草| 色五月丁香A欧美com| 99热69| 久久99热只有精品| 色色色.COM| 9久视频| 91无码一区人妻A片蜜| 五月色婷婷夜色| 欧洲综合视频| 五月天电影网| 在线中文av| 免费视频WWW在线观看网站| 国产女人十八水真多1| 91九色精品女同系列| 激情五月天之六月婷婷| 狠狠色噜噜狠狠| 五月婷婷丁香| 六月色婷婷综合影视| 人妻久久久久久久久妻久久久久久久久| 久久机只有这里精品| 色婷婷精品视频| 99在线观看精品视频| 9l视频自拍九色9l黑人| 丁香五月天偷拍| 五月丁香婷婷成人网| 丁香五月综合| 欧美性猛交99久久久99| 深爱丁香激情| 婷婷五月激情丁香| 日都一级A片| 99re这里只有精品国产99| 天天日天天干天天爽| 五月丁香大香蕉| 丁香视频| 欧美综合五月丁香五月天| 久久久8| 九热视频免费观看| 丁香五月六月婷婷自拍| 国产成人+综合亚洲+天堂| 丁香九月色| WWW.激情| 97精品欧美91久久久久久久| 六月婷婷日| 色六月丁香婷婷狠狠干| 婷婷91| 欧美三级视频下载| 亚洲狠狠操| 五月婷婷无码| 久久久99久久| 五月狠狠| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 亚洲99在线| 都市激情小说婷婷| 4399无码视频| 婷婷色播色五月五色五月天色妇| 狠狠久久婷五月| www.久操| 天天爽夜夜爽天天爽夜夜爽| 97精品人人A片免费看| 久草大| 天天搞天天色综合| 五月综合丁| 亚洲天码视频www蛋播视频| 成人无码精品1区2区3区免费看 | 亚洲九九免费| 思思热这里只有精品| 超碰免费99| 国产激情在线| 五月 激情视频| 天天日天天干天天操| 婷婷五月天久| 亚洲视色| 亚洲精品成人片在线播| 综合色播| 大香蕉人人人| 免费亚洲婷婷五月| 狠狠爱婷婷丁香| 日本丁香五月| 182TV大香蕉| 色欲午夜无码久久久久久张津瑜| 成人AV网站在线| 五月天色区| 大香婷婷| 99热精品观看| 乱码操操| 婷婷五月天福利| 激情美女五月天| 九久9精品| 六月丁香五月婷婷首页| 色综合五月天| 色婷激情网| 久久五月婷综合| 亚洲色婷婷视频| 97人人操人人操人人操人人| 五月天婷婷成人网| 99热9999| 99操逼| 亚洲看av的网站| 久久婷婷五月综合色区| 天天爽,夜夜爽| 丁香五月停停基地| 99熟女| 久久黄色免费视频| 99婷五月| 九九热视频在线观看| 色婷婷激情| 五月激情站| 先锋资源996| 91女人18毛片水多国产| 99超级碰碰| 色五月丁香六月资源站| 成人综合视频网址| 天天透天天爱| 99啪啪| 屁股翘好撅高迎合跪趴| 五月婷视屏在线观看| 婷婷色啪| 亚洲精品白浆高清久久久久久| 欧洲第一久色| 久久婷婷91| 天天做天天爱天天高潮| 精品成人a v无码内射| 丁香五月影视| 99re6在线视频精品免费| 亚洲最大五月天成人网| 色九月婷婷综合| 激情又色又爽又黄的A片| 丁香六月无码播放| 色玖玖| 伊人婷婷99热精品| 超碰超碰在线| 米奇影视资源777狠狠色婷婷五月天激情网| 天天网曰日曰夜夜综合永久免费| 久久九九热视频| 六月婷婷亚洲| 久久99视频| 任你爽在线视频| 久草天堂| 婷婷干五月综合在线播放| 亚洲午夜视频| 中国女人做爰A片| 欧美日韩成人在线观看| 狠狠色激情综合| 热99精品视频五月| 色香蕉精品五夜婷| 任我肏| 婷婷香五月综合激情| 91碰| 丁香五月婷婷老师网站| 激情五月天视频| 五月天啪啪啪| 欧美性爱特黄一级aaaassss| 97色久| 中文字幕在线视频播放| 色色色综合网| 九九无码| 都市激情五月婷婷亚洲| 99热精品10| 91精品婷婷国产综合| 九九色婷婷五月天| 欧美黄色AA片哗啦啦啦| 丁香六月婷婷| 国产精品视频久久99| 全亚洲最大的婷婷五月天网站COM| 婷婷五月天天激情| 青草青草视频2免费观看| 噜噜噜狠狠色综| 丁香涩涩爱| 婷婷六月色丁香视频在线观看| 五月丁香亭亭操逼| 色情五月天导航| 9国产在线视频| 五月婷婷丁香在线| 91九色在线视频| 天天色综网| 色婷五月丁香久亚洲| 六月婷婷天天操夜夜爽视频| 影音先锋毛片网站| 激情综合在线播放| www.cao.com久久| 成人在线观看精品| 亚州美女| 99爱在线视频| 婷婷视频网| 爱射综合| 91久操| 久久久ww| 精品99在线| 六月丁丁香| 丁香桃色网| 成人五月天视频播放| 少妇口诉沐足视频播放器网址| wwW天天干| 欧美激情丁香五月| 婷婷放心五日爱| 狠狠综合网| 99ri在线观看视频| 久婷| 97人人操人人爽| 任我肏| 天天射美女| 九九综合伊人| 第四色激情网| 日本精品在线噜噜噜| 五夜婷婷| 思思99热这里只有精品| j久久性爱视频| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 九九在线视频| 精品影院| 男人大jjc女人免费视频| 婷婷色色综合| 99草在线免费观看视频| 97操在线资源| 婷婷五月丁香超碰| 综合99综合久久久久久久| 色噜噜狠狠色综合网| 久久五月网| 久色网| 日韩好吊操| 国产五月天激情小说| 丁香5月啪啪| 亚洲婷婷成人五月天| 五月开心深深爱激情综合| 天天日天天干天天天| 六月综合婷婷开心伊人| 五月丁香激情婷婷| 这里只有精品视频免费在线观看| 丁香六月婷婷久久综合| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 99热99在线| 日韩丰满少妇无码内射| 九九XX视频| 亚洲色五月婷婷| 超碰97免费在线| 久久免费精品小视频| 草操网| 99热中国| 中文字幕AV网址| 五月丁香综合激情网| 亚洲精品又粗又大又爽A片| 丁香五月之久操视频| 伊人玖玖综合| 久久之人妻| 色色色色色色色色色999| 99热a片免| 色五月丁香五月| 黑人巨粗进入警花疼哭A片| 亚洲成人av在线观看| 97在线/亚洲| 第2色五月婷| 天天舔天天摸视频| 人人综合久| 精品一二三区久久AAA片| 超碰色碰碰| 97在线精品视频| 99热只有国产在线精品| 色五月综合| 九九在线视频| 伊人九九综合| 色播播之激情五月婷婷| www.婷婷五月| 婷婷丁香久久| 久热re在线视频| 思思热闹这里只有精品| 新伍月婷婷| 五月丁香| 无码一区二区三区四区五区91c| 亚洲视频五区| 激情综合六月| 婷婷导航| 91丨九色丨国产打屁股网站| 色玖玖| 日屌日日操日日色| 色色色热| 影音先锋91资源站| 五月色欧洲| 91九色丨国产丨爆乳| 懂色av粉嫩av蜜臀av| 操操人人| 久热这里只有精品99re| 亚洲综合色婷婷| 天天色综| 欧美色欲色欲天天天www| 欧美日韩99| 99久久高清视频| 狠狠草婷婷| 三级三久久线久久99久目本WW| 欧美日本不卡黄色片| aaa丁香五月天| 丁香美女五月天婷婷| 99精品国产在热久久| 日本在线视频播放91| 丁香五月在线观看完整版| 狠狠操综合| 中文精品在| 99免费热视频在线| 草草女人亚洲| ww亚洲ww在线观看| AV成人在线播放| 丁香五月激情啪啪啪啪| 色国产五月| 亚洲五月花| 任你搞网站| 久久婷婷六月综合综合色| 99ER热精品视频| 婷婷无码视频| 七七色色综合| 9 1 A v久久久| 五月丁香婷婷中文网| 狠狠干婷婷| 超碰在线看| 91色噜噜狠狠狠狠色综合| 久久久久久久久久久久63| 天天 青草 丝袜制服 在线| 婷婷五月综合在线| 久久香蕉网| 九九婷婷综合| 99久久精彩视频| 综合色激情| 男女av免费看| 激情综合网激情五月丁香| 麻豆WWWCOM内射软件| 激情啪啪五月天| 五月婷婷在线免费观看| 久操婷婷| 狠狠综合网| 婷婷丁香激情综合色情| 亚洲欧洲午夜成人精品av| 婷婷丁香www视频日本韩国| 五月丁香婷爱在线| 青青草99re| 九九热这里只有精品在线观看| 日韩青青| 五月婷婷精品无在线| 婷婷丁香红五月91C| 婷婷丁香五月六月激情| Blackedraw视频一区二区| 九九在线免费观看| 丁香性爱在线视频| anquye五月| 五月丁香婷婷狠狠操| 色五婷婷| 精品一区二区三区三区| 婷婷五月天久久| 哇嘎成人久久| 激情五月婷| 久操人妻| 欧美久热| 最新五月天婷婷影| 色综合99无码| 99精在线| 激情文学第四色婷婷丁香五月| 成人五月天丁香婷| 91碰碰碰| 成人视频网| 五月丁香亭亭天天舔| 9久热在线视频| 成人va视频| 成人av在线电影| 我爱大香蕉| 米奇影视资源婷婷狠狠色激情欧美五月丁香| 五月美女婷婷风骚| 六月激情久久| 97碰超级人人看| 婷婷在线播放| 激情二色月| 中文成人在线| 欧美日韩99| 国产日韩欧美性生活| 日本91在线播放| 色综合久久五月天| 狠狠操综合| 亚洲色无码A片一区二区麻豆| 涩涩涩.com| 综合色网站| 六月天婷婷| 中文国产五月天| 五月色亚洲| 天天狠狠夜夜狠狠2023| 五月天成人网婷婷| 去色色五月天| www.久久99| wwwxxx五月婷婷小说| 久久九九re热| 六月婷婷激情| 色五开心五月五月深深爱| 国产精品色婷婷99久久精品| 色五月首页| 欧美色爱五月天| 黄色AV日韩| 在线中文AV| 婷婷 伊人 久久| 婷婷欧美色| 91亚洲视频| 国产成人+综合亚洲+天堂| 精品99网站| 97碰碰在线观看视频| 天天做天天爽| 色综合99| 深夜婷婷五月丁香| 丁香五月天婷婷91| 久久九九99| 激情五月综合| 欧美色骚婷婷五月天| 天天艹| 国产激情综合| 99热国产免费| 综合狠狠五月婷婷| 丁香六月激情四射| 狠狠婷婷综合| 91综合在线| 99热这里只有精品18| 婷婷久久久| 99人人干人人操| 99视频只有精品| 九月色婷婷综合| 激情五月综合ì香亚洲| www.五月婷婷.com| 久操乱| 五月婷婷五月天| 日日噜噜夜夜狠狠久久丁香六月| 亚洲激情高潮| www.久久久久久久| 99精品手机在线视频| 色婷婷激情| 综合99视频| 婷婷丁香激情五月天色色| 色五月天.con| 亚洲色婷婷五月天| 色综合99无码| 丁香六月婷婷久久综合| 久久精品9| 五月丁香六月综合基地| 婷婷色5月天在线。| 九九综合| 欧美 日韩 成人| 五月婷久久久久综合| 婷婷五月花| 五月久久婷婷| 人妻久久人妻久久第一区| 欧美性丁香色色五月天| 秋霞电影一级黄| 激情婷婷在线中文字幕| se婷97| 影音先锋自拍网| 97人人射| 色吧五月婷婷| 久久婷.com| 亚洲色热| 99色性爰网络| 五月丁香做爱视频| 五月天伊人日日噜影片AV| 婷婷五月黄色激情在线| 7777激情基地| 97性视频| 色综合视频| 成人在线高清| 超碰成人在线免费观看| 婷婷狠狠干| 国外亚洲成AV人片在线观看| 丁香六月婷婷| 91chinese在线| 色综合天天综合成人网| 久婷婷| 99在线播放视频| 五月婷婷天堂| 久久免费操| 97亚洲婷婷| 日本九九网| 欧美色频| www.色婷婷| 另类小说五月天| 五月激情天| 26uuu丁香婷婷五月| 久草狼人| 婷婷99狠狠躁天天躁中| 大香蕉久久久| 五月丁香亭亭操逼| 激情综合国产| 久久久大香蕉| 六月婷婷激情| 九九热只有精品| 中文av网| www.99视频| 69精品人人人人| 777米奇影视第四色| 超碰成人公开| 天堂在线伊久| 国产性爱色| 色激情五月| 亚洲精品无码久久| 桃色五月婷婷| 免費亭亭成人| 99黄色| 91精品久久久久久综合五月天| 五月亭亭六月天| 久久婷婷五月综合色丁香| 日本啪啪网| 久热这里只有精品6| 色吧五月| 色婷青青| 狠狠色九月| 国产成人高清| 亚洲综合在线伊人婷| 99久热这里有精品| 亚洲99在线视频| 欧美丁香婷婷五月天| 婷婷少妇激情| 色婷婷电影网| 中文字幕免费高清电视剧| 性爱激情久久| 99超级碰碰| 亚洲激情亚洲激情| 午夜爱爱爱成人| 亚洲狠狠干| 色三级色三级| 思思99热| 色婷婷精品视频在线播放| 婷婷久久免费| 精品国产va久久久久| 亚洲行行色色| 日本WWW九九九| 国产成人+综合亚洲+天堂| 亚洲中字AV电影在线网站| 色色丁香色五月| 五月丁香综合激情| 五月丁香婷婷六月天| 思思热视频| 婷婷大香蕉| 日韩AV在线影片| 久久精品五月| 怕怕視頻| 婷婷丁香色情五月天| 4399在线日本A片| 无码激情AAAAA片-区区| 1024久婷| 天天爽在线视频| 色婷婷狠狠干芒果TV| 99re视频在线播放| 久久性爱网| 久热AA| 人妻在线中文字幕久久| 五月精品| 99国产精品久久久久久久久久久| 色色五月丁香婷婷综合| 免费国产VA国产免费| 五月婷婷婷婷网| 久久婷婷五月综合| 五月婷婷性爱视频| 99在线观看亚洲| www,色色色网站| 91久热| 婷婷丁香成人五月天| 国产婷婷五月中文字幕高清| 国产精品美女| 国产无套精品一区二区| 色五月五月婷婷| 99精品久久久久久久婷婷久久| 九九热中文| 北条麻妃伊人| 婷婷五月天改成什么了| 九九热在线精品视频| 香蕉久久av一区二区三区 | 99视频网| 九九99精品视频在线观看| 婷婷99丁香| 婷婷玉月丁香五月在线视频| 中文字幕婷婷| 五月丁香综合网| 男人天堂亚洲综合| 日本精品99网站| 久青草大香蕉| 颜射 精品性爱av| 99热爆在线| 天堂网操| 丁香婷婷免费| 综合另类视频| 丁香婷婷久| 色五月在线| 婷婷丁香熟妇综合网| 超碰AV成人| 色五月婷婷DVD| AV中文在线| 色情五月综合婷婷| 看片视频在线免费日产在线看| 秋霞少妇AV网站| 这里只有精品99视频| 级情九色| 日韩精品一品二区三区的使用体验 | 丰满人妻妇伦又伦精品国产| 亚洲婷婷五月天在线激情综合网| 国产精品美女| 香蕉色色网| 婷婷播播五月天| 六月色婷婷| 九九精品在线视频观看| 六月婷婷综合激情| 久久中国毛毛片爱久久| 天天操夜夜爽| 99热热热99精品婷婷| 久热这里只有精品在线观看| 色婷婷色99国产综合精品| 五月99久久| 狠狠的日| www.玖玖婷婷在线| 天天五月情| 激情AV综合| 丁香五月综合在线播放 | 色天五月天在线观看视频| 国内9l视频自拍老熟女九色| 亚洲VA在线| 日本二级毛片二级毛片| 五月色导航| 亚洲乱码日产精品BD| se色99| 91综合在线| 99r这里只有精品哦| 久久人妻视频| 天天做天天爱天天摸| 99热只有| 丁香五月天激情五月天激情五月天激情网 | 九九艹女| 99爱免费视频| 九九色中文| 可以免费看的AV网站| 中文av在线观看| 五月天婷婷综合免费| 超碰国产在线观看| 偷拍91九色| 丁香五月欧美激情| 97干在线| 久久五月天婷婷视频| 婷婷五月色| 日日射天天射| 北条麻妃伊人| 激情丁香五月天图片| 99超碰人人| 9热视频在线观看| 九九色逼| 五月色综合| 婷婷丁香激情五月| 涩丁香91| 丁香五月AV| 成人在线网| 免费视频无码| 婷婷丁香五另类网站| 99视频在线9| 中文av网| 色情五月综合婷婷| 久久99网站| 甈你aaaaa| 久久久久久久久久久久63| 女人被男人吃奶到高潮| 久99视频在线观看| 97人妻碰碰中文无码久热丝袜| 亚洲色婷婷99一9|| 男人的天堂99| 婷婷久久久久| 小视频aaa久久久| 好吊兆人妻| 能看的av| 视频综合网| 99在线资源视频| 五月丁香六月激情综合| 99热精品在线播放| 99人妻碰碰久久久禁片| 激情伊人五月天| 色播婷婷大香蕉| 做爰丰满少妇1313| 五月天狠狠网| 97干在线视频| 丁香婷婷五月份| 99热综合| WWW夜夜| 久久五月天丁香| 色播丁香| 色情五月天A片| 91丨九色丨熟女|老版| 大香蕉啪啪啪| 天天激情| 五月激情丁香五月| 久久激情四射| 色婷婷综合网站| 婷婷五月丁香六月天亚洲综合| 五月婷婷啪啪啪| 狠狠色丁香乆乆|