https數字簽名手動驗簽

以bing.com 為例

1.?CA 層級的基本概念

CA 層級是一種樹狀結構,由多個層級的 CA 組成。每個 CA 負責為其下一層級的實體(如子 CA 或終端實體)頒發證書。層級結構的頂端是?根 CA(Root CA),它是整個 PKI 體系的信任錨點。

主要角色
  • 根 CA(Root CA)

    • 位于層級結構的頂端。

    • 自簽名證書(自己為自己頒發證書)。

    • 是信任鏈的起點。

  • 中間 CA(Intermediate CA)

    • 位于根 CA 和終端實體之間。

    • 由根 CA 或上級中間 CA 頒發證書。

    • 負責為終端實體或其他中間 CA 頒發證書。

  • 終端實體(End Entity)

    • 層級結構的最底層。

    • 包括用戶、設備、服務器等。

    • 證書由中間 CA 頒發。

可以從中間ca獲取公鑰

模數(4096 位):B2 EE 82 05 CD C0 D5 65 56 E8 99 66 6D 4B 0A C0
5F C2 E2 29 7B 1B 09 CC 2E 14 BE C5 1E 40 F9 9B
AE E8 96 63 9D 4E E7 8E 2A 13 44 47 9C A4 16 CF
E6 78 A1 B5 7F 0C DD DF 9F FE 43 5F 8A 4F 17 15
F3 D2 08 5E 61 2B B5 2B 23 F0 45 AE EE B7 44 01
56 27 60 C1 5B B2 DA B0 90 85 4D 12 8C F8 38 83
3C DA 19 FE 37 9A 79 EF 39 07 18 FA 20 CC 5E 93
38 F4 54 38 AF 32 63 20 8F 7A A9 C7 BE 85 69 13
96 F4 91 92 F8 41 3F 1B 77 28 52 45 06 D4 B1 48
92 68 EB 85 E7 2D DE 67 D5 5C F7 66 DA 0E 48 58
EC 21 59 13 64 E1 2C BB F9 3D 0D 16 C7 32 E8 B7
7B 75 F1 DD AF 40 FE 71 DB D2 34 9F A3 45 B2 3D
FB 27 67 7F 10 7F D9 E9 AF E5 84 05 73 2A 37 D8
96 81 9C 43 52 0F C8 31 08 1A 1F 60 60 99 CC 2C
56 62 51 B9 BF 18 19 A5 A4 A5 6B F0 CD 37 39 62
82 47 4B 61 45 B7 E7 53 A5 28 B2 4A F0 1A B1 02
02 79 E8 8C 51 14 C3 E8 FC 8B A8 05 2C 13 56 5E
D0 4E B5 8B E0 97 C4 87 08 25 4A 51 45 25 E1 83
9F 47 9C C5 E0 E9 0A 8A B2 6E 51 B3 A6 07 60 0E
98 B8 D8 24 87 1A 6C 3B F1 31 C9 AB CA 14 22 9E
88 3E FF E8 E0 1C 99 D8 EB 6A 29 81 2B 64 75 A2
26 30 FC F2 2C 1E D9 69 65 67 C6 94 5D B4 52 8E
D5 9B C6 91 97 91 36 F6 CF 01 42 91 DA 43 5E 92
7B A1 DC DB 45 BF 3D 9D 63 7C 4F EC 07 E1 C8 B1
3F B7 CB D6 EF 69 C0 CE 54 4A CF EF 8B EF 40 A0
0A F8 FF C9 E3 9B 3F 06 80 3C 37 76 B1 9D 28 8F
6B BF 37 E9 3A 7A 01 AA D3 87 BE 18 15 BE 41 80
92 A0 9E 5E 01 8D FA 8A 5D 1F BB B7 58 48 76 03
A3 B4 41 E5 A3 D3 2E A9 F2 6E 9F 30 31 E0 1A B5
C6 A0 73 C5 3D 38 CE 36 82 11 0B 4D A5 85 01 1B
B2 A0 29 A0 A9 1E F2 F1 F0 14 F4 D8 E1 72 AA E6
EB ED 17 CE FF EF CC C7 E1 2F 85 25 A5 FD 46 EF公用指數(17 位):01 00 01

使用上述公鑰,驗簽對應私鑰簽名(使用 RSA 加密的 PKCS #1 SHA-384)

簽名值如上上圖紅色部分。

import hashlibsign='''97 2B 9D FA E4 55 B2 67 12 26 C5 A7 05 1C 0C 52
13 EC 0E 18 C5 83 40 5D 38 61 33 65 18 8F 23 7B
D5 1C 7D E9 EF 5D D2 15 AD 02 5F 37 2A 35 24 C2
56 FD 71 46 08 2F 31 98 24 59 2E F2 89 46 40 EA
04 3D CF 8F 3A 68 F7 4B 7B 3D 19 70 56 83 A1 D3
BA 07 45 C1 C6 8A 1F 20 20 13 47 A6 DB F0 9F F3
B2 D6 49 37 8A 20 DC 57 88 21 F4 46 16 70 7D 8B
C4 3B 69 B5 63 01 13 68 62 2A DA CC 02 E2 F7 E3
FC 1D 1D 03 30 EC AD D3 6F 7D 47 A4 E3 AA 3A 98
9C D3 28 94 3A 7E 6D 38 80 04 F2 D5 14 F9 DC C4
6A B4 15 DB 0E 5E CE 2E D3 95 94 72 43 E8 27 B7
E2 2B F8 3C 82 F9 30 5F F4 2A 0E B9 0C E9 15 FE
20 94 F0 E5 B7 95 58 2C 78 BE 2A 58 2C 75 96 C0
43 66 F8 07 C6 11 D0 7F B1 17 9F DE 4D 10 E0 A6
BB 78 FE 6F 5B 93 AE 69 9A 3B 7A F5 ED DA 39 15
0F 3C F8 C4 24 EA 8A 76 53 80 E2 9E 58 E4 4F 84
2E C3 AA BF 75 48 98 BC 6A 67 73 A5 DB 14 87 27
29 5A 83 D9 77 3B 82 1C 2E 6D 65 AF 45 96 88 75
AB 15 A5 3A A3 47 01 12 85 5A 3C 45 3B 60 D4 3A
95 09 85 F0 D9 17 8D 57 77 E0 A7 7C AD BF 7E 97
86 9D 10 D3 C7 23 3A 40 7D E0 78 F0 CB 4B 28 CD
93 2F 2E B7 D0 49 05 1C F5 8E 17 32 28 05 F9 FA
FD 03 A7 E1 3F A1 B5 8C BD 13 A0 C2 FA E6 D7 45
96 BC 7D C9 3F AE 52 96 DF 93 9D CC A3 52 C6 77
F9 B0 1F E5 9D 7E AE 2A B2 F4 DB 8A 13 F6 FF E9
34 93 B1 C7 6D 4E 14 40 9A 70 EF 1D AA 4C 3D E2
FC 7E FA 5C D2 FE EB 49 69 0D 1A 81 08 61 E6 DC
6D 98 06 8E A6 51 05 BD 1F 17 D7 09 53 43 03 CF
9B 72 62 77 7E DF 8B 0C 24 1B 78 CF 4B 3E D4 42
C9 46 CE DF 3A 53 3F 95 96 19 46 07 06 97 4F C7
92 FD 14 A6 2F C4 41 62 BA 37 D2 EB 51 62 60 05
E2 59 8B E3 7F 5E 6B AF 32 72 4F 00 B2 81 69 70'''sign=sign.replace('\n','').replace(' ','')
sign=int(sign,16)
e=0x10001
public_n='''B2 EE 82 05 CD C0 D5 65 56 E8 99 66 6D 4B 0A C0
5F C2 E2 29 7B 1B 09 CC 2E 14 BE C5 1E 40 F9 9B
AE E8 96 63 9D 4E E7 8E 2A 13 44 47 9C A4 16 CF
E6 78 A1 B5 7F 0C DD DF 9F FE 43 5F 8A 4F 17 15
F3 D2 08 5E 61 2B B5 2B 23 F0 45 AE EE B7 44 01
56 27 60 C1 5B B2 DA B0 90 85 4D 12 8C F8 38 83
3C DA 19 FE 37 9A 79 EF 39 07 18 FA 20 CC 5E 93
38 F4 54 38 AF 32 63 20 8F 7A A9 C7 BE 85 69 13
96 F4 91 92 F8 41 3F 1B 77 28 52 45 06 D4 B1 48
92 68 EB 85 E7 2D DE 67 D5 5C F7 66 DA 0E 48 58
EC 21 59 13 64 E1 2C BB F9 3D 0D 16 C7 32 E8 B7
7B 75 F1 DD AF 40 FE 71 DB D2 34 9F A3 45 B2 3D
FB 27 67 7F 10 7F D9 E9 AF E5 84 05 73 2A 37 D8
96 81 9C 43 52 0F C8 31 08 1A 1F 60 60 99 CC 2C
56 62 51 B9 BF 18 19 A5 A4 A5 6B F0 CD 37 39 62
82 47 4B 61 45 B7 E7 53 A5 28 B2 4A F0 1A B1 02
02 79 E8 8C 51 14 C3 E8 FC 8B A8 05 2C 13 56 5E
D0 4E B5 8B E0 97 C4 87 08 25 4A 51 45 25 E1 83
9F 47 9C C5 E0 E9 0A 8A B2 6E 51 B3 A6 07 60 0E
98 B8 D8 24 87 1A 6C 3B F1 31 C9 AB CA 14 22 9E
88 3E FF E8 E0 1C 99 D8 EB 6A 29 81 2B 64 75 A2
26 30 FC F2 2C 1E D9 69 65 67 C6 94 5D B4 52 8E
D5 9B C6 91 97 91 36 F6 CF 01 42 91 DA 43 5E 92
7B A1 DC DB 45 BF 3D 9D 63 7C 4F EC 07 E1 C8 B1
3F B7 CB D6 EF 69 C0 CE 54 4A CF EF 8B EF 40 A0
0A F8 FF C9 E3 9B 3F 06 80 3C 37 76 B1 9D 28 8F
6B BF 37 E9 3A 7A 01 AA D3 87 BE 18 15 BE 41 80
92 A0 9E 5E 01 8D FA 8A 5D 1F BB B7 58 48 76 03
A3 B4 41 E5 A3 D3 2E A9 F2 6E 9F 30 31 E0 1A B5
C6 A0 73 C5 3D 38 CE 36 82 11 0B 4D A5 85 01 1B
B2 A0 29 A0 A9 1E F2 F1 F0 14 F4 D8 E1 72 AA E6
EB ED 17 CE FF EF CC C7 E1 2F 85 25 A5 FD 46 EF'''
public_n=public_n.replace('\n','').replace(' ','')
public_n=int(public_n,16)m=pow(sign,e,public_n)
print(hex(m))# 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003041300d060960864801650304020205000430f0b5b67540085f352c9652c17655ece83bedc6ac86e490bbda003123f08d28ae5087e389f1dcf978e96c282d755bb5b6

如果解出來是0x1fffffff格式,應該是解對了,貌似PKCS #1的填充格式就是這樣的。

https://www.rfc-editor.org/rfc/rfc8017#page-62

基于格式可以提取出證書的hash值。

sha384='f0b5b67540085f352c9652c17655ece83bedc6ac86e490bbda003123f08d28ae5087e389f1dcf978e96c282d755bb5b6'

接下來手動計算證書的hash是否和我們提取的sha384相等。

先導出證書

base64編碼的ascii ,單個證書長這個樣子

-----BEGIN CERTIFICATE-----
MIINWTCCC0GgAwIBAgITMwD36wOscXLGFiN8dwAAAPfrAzANBgkqhkiG9w0BAQwF
ADBdMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
MS4wLAYDVQQDEyVNaWNyb3NvZnQgQXp1cmUgUlNBIFRMUyBJc3N1aW5nIENBIDA4
MB4XDTI0MTIxNTA3NTIyOFoXDTI1MDYxMzA3NTIyOFowYzELMAkGA1UEBhMCVVMx
CzAJBgNVBAgTAldBMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv
ZnQgQ29ycG9yYXRpb24xFTATBgNVBAMTDHd3dy5iaW5nLmNvbTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAKOE2PRzy3AhT9TJGbN/JYTKDu5Asz7uUdFk
nrLrXIEmmpn57QuVxuLVUgPkz/W8w5jaPHyHlzeqEP1ajswS1o+cxqiYBcFTWhfS
z7A6HIY3UzafEjhwM6EMibKro/H4Tkpb8QHz0iIeic4nPaIsXl3mM1YoSuR/f83k
rQunifp7qUpkwmbj0OUVY1j0HPwc4TLHFk8sAAUtH8nq9B7oXT6jhEVE2dQPGavh
bBkwV9vCdxpZgxdFpe1I+N+Nqma3U4vo8AMouGKsJ1Ir9AaNudDM2p3x6Q4mbr20
mmij8ld/X1Icpneoa29MO2I4ebqkreSf+UA+8Gp+t7TnhsKXCokCAwEAAaOCCQow
ggkGMIIBfgYKKwYBBAHWeQIEAgSCAW4EggFqAWgAdgDPEVbu1S58r/OHW9lpLpvp
GnFnSrAX7KwB0lt3zsw7CAAAAZPJVyTUAAAEAwBHMEUCIBFsWqv3SCYOeAbgn7O9
fXE31BM945CB+ryCnPpmQJi4AiEAmb8uqZVavqrUfY8uDEkRIFulCbHBaj8VSWS0
crp0lIEAdgB9WR4S4XgqexxhZ3xe/fjQh1wUoE6VnrkDL9kOjC55uAAAAZPJVyUT
AAAEAwBHMEUCIQCtGjV3pIPRT0JZU6Qa9s1UaYoei+aO1iq148Wq1ZrG5wIgKvVe
9fj5dr/JhHruW9gRCAi2J5rIQGbbSLh1ZFCzeHkAdgDgkrP8DB3I52g2H95huZZN
ClJ4GYpy1nLEsE2lbW9UBAAAAZPJVyUnAAAEAwBHMEUCIHrzZn/f8fgibS2d+JSq
rNHTdZTOdjrX8M22GcaG4akcAiEA7PzDwesXuDwRj/QAzxPfAEZrkOmurLr6mnhg
2ID13kIwJwYJKwYBBAGCNxUKBBowGDAKBggrBgEFBQcDAjAKBggrBgEFBQcDATA8
BgkrBgEEAYI3FQcELzAtBiUrBgEEAYI3FQiHvdcbgefrRoKBnS6O0AyH8NodXYKr
5zCH7fEfAgFkAgEtMIG0BggrBgEFBQcBAQSBpzCBpDBzBggrBgEFBQcwAoZnaHR0
cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBB
enVyZSUyMFJTQSUyMFRMUyUyMElzc3VpbmclMjBDQSUyMDA4JTIwLSUyMHhzaWdu
LmNydDAtBggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3AubWljcm9zb2Z0LmNvbS9v
Y3NwMB0GA1UdDgQWBBSdG38i9dxNEO6vPvTS31L/30wD5jAOBgNVHQ8BAf8EBAMC
BaAwggURBgNVHREEggUIMIIFBIITKi5wbGF0Zm9ybS5iaW5nLmNvbYIKKi5iaW5n
LmNvbYIIYmluZy5jb22CFmllb25saW5lLm1pY3Jvc29mdC5jb22CEyoud2luZG93
c3NlYXJjaC5jb22CGWNuLmllb25saW5lLm1pY3Jvc29mdC5jb22CESoub3JpZ2lu
LmJpbmcuY29tgg0qLm1tLmJpbmcubmV0gg4qLmFwaS5iaW5nLmNvbYINKi5jbi5i
aW5nLm5ldIINKi5jbi5iaW5nLmNvbYIQc3NsLWFwaS5iaW5nLmNvbYIQc3NsLWFw
aS5iaW5nLm5ldIIOKi5hcGkuYmluZy5uZXSCDiouYmluZ2FwaXMuY29tgg9iaW5n
c2FuZGJveC5jb22CFmZlZWRiYWNrLm1pY3Jvc29mdC5jb22CG2luc2VydG1lZGlh
LmJpbmcub2ZmaWNlLm5ldIIOci5iYXQuYmluZy5jb22CECouci5iYXQuYmluZy5j
b22CDyouZGljdC5iaW5nLmNvbYIOKi5zc2wuYmluZy5jb22CECouYXBwZXguYmlu
Zy5jb22CFioucGxhdGZvcm0uY24uYmluZy5jb22CDXdwLm0uYmluZy5jb22CDCou
bS5iaW5nLmNvbYIPZ2xvYmFsLmJpbmcuY29tghF3aW5kb3dzc2VhcmNoLmNvbYIO
c2VhcmNoLm1zbi5jb22CESouYmluZ3NhbmRib3guY29tghkqLmFwaS50aWxlcy5k
aXR1LmxpdmUuY29tghgqLnQwLnRpbGVzLmRpdHUubGl2ZS5jb22CGCoudDEudGls
ZXMuZGl0dS5saXZlLmNvbYIYKi50Mi50aWxlcy5kaXR1LmxpdmUuY29tghgqLnQz
LnRpbGVzLmRpdHUubGl2ZS5jb22CCzNkLmxpdmUuY29tghNhcGkuc2VhcmNoLmxp
dmUuY29tghRiZXRhLnNlYXJjaC5saXZlLmNvbYIVY253ZWIuc2VhcmNoLmxpdmUu
Y29tgg1kaXR1LmxpdmUuY29tghFmYXJlY2FzdC5saXZlLmNvbYIOaW1hZ2UubGl2
ZS5jb22CD2ltYWdlcy5saXZlLmNvbYIRbG9jYWwubGl2ZS5jb20uYXWCFGxvY2Fs
c2VhcmNoLmxpdmUuY29tghRsczRkLnNlYXJjaC5saXZlLmNvbYINbWFpbC5saXZl
LmNvbYIRbWFwaW5kaWEubGl2ZS5jb22CDmxvY2FsLmxpdmUuY29tgg1tYXBzLmxp
dmUuY29tghBtYXBzLmxpdmUuY29tLmF1gg9taW5kaWEubGl2ZS5jb22CDW5ld3Mu
bGl2ZS5jb22CHG9yaWdpbi5jbndlYi5zZWFyY2gubGl2ZS5jb22CFnByZXZpZXcu
bG9jYWwubGl2ZS5jb22CD3NlYXJjaC5saXZlLmNvbYISdGVzdC5tYXBzLmxpdmUu
Y29tgg52aWRlby5saXZlLmNvbYIPdmlkZW9zLmxpdmUuY29tghV2aXJ0dWFsZWFy
dGgubGl2ZS5jb22CDHdhcC5saXZlLmNvbYISd2VibWFzdGVyLmxpdmUuY29tghV3
d3cubG9jYWwubGl2ZS5jb20uYXWCFHd3dy5tYXBzLmxpdmUuY29tLmF1ghN3ZWJt
YXN0ZXJzLmxpdmUuY29tghhlY24uZGV2LnZpcnR1YWxlYXJ0aC5uZXSCDHd3dy5i
aW5nLmNvbTAMBgNVHRMBAf8EAjAAMGoGA1UdHwRjMGEwX6BdoFuGWWh0dHA6Ly93
d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMEF6dXJlJTIw
UlNBJTIwVExTJTIwSXNzdWluZyUyMENBJTIwMDguY3JsMGYGA1UdIARfMF0wUQYM
KwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0
LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAIBgZngQwBAgIwHwYDVR0j
BBgwFoAU9n4vvYCjSrJwW+vfmh/Y7cphgAcwHQYDVR0lBBYwFAYIKwYBBQUHAwIG
CCsGAQUFBwMBMA0GCSqGSIb3DQEBDAUAA4ICAQCXK5365FWyZxImxacFHAxSE+wO
GMWDQF04YTNlGI8je9UcfenvXdIVrQJfNyo1JMJW/XFGCC8xmCRZLvKJRkDqBD3P
jzpo90t7PRlwVoOh07oHRcHGih8gIBNHptvwn/Oy1kk3iiDcV4gh9EYWcH2LxDtp
tWMBE2hiKtrMAuL34/wdHQMw7K3Tb31HpOOqOpic0yiUOn5tOIAE8tUU+dzEarQV
2w5ezi7TlZRyQ+gnt+Ir+DyC+TBf9CoOuQzpFf4glPDlt5VYLHi+KlgsdZbAQ2b4
B8YR0H+xF5/eTRDgprt4/m9bk65pmjt69e3aORUPPPjEJOqKdlOA4p5Y5E+ELsOq
v3VImLxqZ3Ol2xSHJylag9l3O4IcLm1lr0WWiHWrFaU6o0cBEoVaPEU7YNQ6lQmF
8NkXjVd34Kd8rb9+l4adENPHIzpAfeB48MtLKM2TLy630EkFHPWOFzIoBfn6/QOn
4T+htYy9E6DC+ubXRZa8fck/rlKW35OdzKNSxnf5sB/lnX6uKrL024oT9v/pNJOx
x21OFECacO8dqkw94vx++lzS/utJaQ0agQhh5txtmAaOplEFvR8X1wlTQwPPm3Ji
d37fiwwkG3jPSz7UQslGzt86Uz+VlhlGBwaXT8eS/RSmL8RBYro30utRYmAF4lmL
439ea68yck8AsoFpcA==
-----END CERTIFICATE-----

去掉前后的-----BEGIN CERTIFICATE-----,-----END CERTIFICATE-----并解碼base64。

30 82 0d 59 30 82 0b 41,base64 解碼后前八個字節,最后兩個字節0x0b41 指示剩下的部分的長度。tbs=30 82 0b 41加上tbs的0xb41個字節。對這部分進行對應的hash后就能驗證了。

import base64,hashlibf=open(r'C:\Users\Administrator\Desktop\cert\www.bing.com','rb').read()
content=f.split(b'-')[10]
b64de=base64.b64decode(content.replace(b'\r\n',b''))
len1=int.from_bytes(b64de[6:8],'big')
tbs=b64de[4:8+len1]
sha384=hashlib.sha384(tbs).hexdigest()
print('hash:',sha384)
hash: f0b5b67540085f352c9652c17655ece83bedc6ac86e490bbda003123f08d28ae5087e389f1dcf978e96c282d755bb5b6
target:f0b5b67540085f352c9652c17655ece83bedc6ac86e490bbda003123f08d28ae5087e389f1dcf978e96c282d755bb5b6

總結:

用上一級CA的公鑰解密對應私鑰加密的簽名數據,提取其中的hash值,并對證書的tbs部分進行對應的hash,比較兩個hash一致性,這就是驗簽。

此例使用 RSA 加密的 PKCS #1 SHA-384

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67229.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【自然語言處理(NLP)】深度循環神經網絡(Deep Recurrent Neural Network,DRNN)原理和實現

文章目錄 介紹深度循環神經網絡(DRNN)原理和實現結構特點工作原理符號含義公式含義 應用領域優勢與挑戰DRNN 代碼實現 個人主頁:道友老李 歡迎加入社區:道友老李的學習社區 介紹 **自然語言處理(Natural Language Pr…

Niagara學習筆記

橙色 發射器 , 綠色 粒子, 紅色 渲染器 Emitter State 發射器狀態 Life Cycle Mode(生命周期模式) 選擇Self就是發射器自身管理生命周期 Loop Behavior 決定粒子發射次數 一次(Once):發射器只播放一次多次&#…

17 一個高并發的系統架構如何設計

高并發系統的理解 第一:我們設計高并發系統的前提是該系統要高可用,起碼整體上的高可用。 第二:高并發系統需要面對很大的流量沖擊,包括瞬時的流量和黑客攻擊等 第三:高并發系統常見的需要考慮的問題,如內存不足的問題,服務抖動的…

2025數學建模美賽|F題成品論文

國家安全政策與網絡安全 摘要 隨著互聯網技術的迅猛發展,網絡犯罪問題已成為全球網絡安全中的重要研究課題,且網絡犯罪的形式和影響日益復雜和嚴重。本文針對網絡犯罪中的問題,基于多元回歸分析和差異中的差異(DiD)思…

適配Android16

Android16新特性 Android 16帶來了許多新特性和改進,提升了系統的流暢度、用戶體驗和安全性。對于應用開發者來說,適配Android 16可以確保應用在該版本上的兼容性和性能,同時也可以利用其新特性為用戶提供更好的服務。以下是Android 16的一些…

【C++數論】880. 索引處的解碼字符串|2010

本文涉及知識點 數論:質數、最大公約數、菲蜀定理 LeetCode880. 索引處的解碼字符串 給定一個編碼字符串 s 。請你找出 解碼字符串 并將其寫入磁帶。解碼時,從編碼字符串中 每次讀取一個字符 ,并采取以下步驟: 如果所讀的字符是…

【MQ】如何保證消息隊列的高可用?

RocketMQ NameServer集群部署 Broker做了集群部署 主從模式 類型:同步復制、異步復制 主節點返回消息給客戶端的時候是否需要同步從節點 Dledger:要求至少消息復制到半數以上的節點之后,才給客戶端返回寫入成功 slave定時從master同步數據…

ESP32 I2S音頻總線學習筆記(二):I2S讀取INMP441音頻數據

簡介 在這個系列的上一篇文章中,我們介紹了ESP32 I2S音頻總線的相關知識,簡要了解了什么是I2S總線、它的通信格式,以及相關的底層API函數。沒有看過上篇文章的可以點擊文章進行回顧: ESP32 I2S音頻總線學習筆記(一&a…

EasyExcel使用詳解

文章目錄 EasyExcel使用詳解一、引言二、環境準備與基礎配置1、添加依賴2、定義實體類 三、Excel 讀取詳解1、基礎讀取2、自定義監聽器3、多 Sheet 處理 四、Excel 寫入詳解1、基礎寫入2、動態列與復雜表頭3、樣式與模板填充 五、總結 EasyExcel使用詳解 一、引言 EasyExcel 是…

objection的簡單使用

objection環境配置 下載以下版本 objection1.11.0 frida-tools9.2.4 python3.8.8 報錯的話看這里: 在這個網站下載frida-tools14.2.18的離線包Links for frida 然后放入C:\Users\Asus\frida-14.2.18-py3.8-win-amd64.egg文件夾下 執行poetry add frida-tools14.2.18 ob…

危機13小時:追蹤一場GitHub投毒事件

事件概要 自北京時間 2024.12.4 晚間6點起, GitHub 上不斷出現“幽靈倉庫”,倉庫中沒有任何代碼,只有誘導性的病毒文件。當天,他們成為了 GitHub 上 star 增速最快的倉庫。超過 180 個虛假僵尸賬戶正在傳播病毒,等待不…

【Redis】緩存+分布式鎖

目錄 緩存 Redis最主要的使用場景就是作為緩存 緩存的更新策略: 1.定期生成 2.實時生成 面試重點: 緩存預熱(Cache preheating): 緩存穿透(Cache penetration) 緩存雪崩 (Cache avalan…

記錄 | MaxKB創建本地AI智能問答系統

目錄 前言一、重建MaxKBStep1 復制路徑Step2 刪除MaxKBStep3 創建數據存儲文件夾Step4 重建 二、創建知識庫Step1 新建知識庫Step2 下載測試所用的txtStep3 上傳本地文檔Step4 選擇模型補充智譜的API Key如何獲取 Step5 查看是否成功 三、創建應用Step1 新建應用Step2 配置AI助…

C#新語法

目錄 頂級語句(C#9.0) using 全局using指令(C#10.0) using資源管理問題 using聲明(C#8.0) using聲明陷阱 錯誤寫法 正確寫法 文件范圍的命名空間聲明(C#10.0) 可空引用類型…

基于dlib/face recognition人臉識別推拉流實現

目錄 一.環境搭建 二.推拉流代碼 三.人臉檢測推拉流 一.環境搭建 1.下載RTSP服務器MediaMTX與FFmpeg FFmpeg是一款功能強大的開源多媒體處理工具,而MediaMTX則是一個輕量級的流媒體服務器。兩者結合,可以實現將本地視頻或者實時攝像頭畫面推送到RTSP流,從而實現視頻…

Couchbase UI: Analytics

Couchbase 的 Analytics 頁面是用于執行分析查詢的部分,允許用戶對存儲在 Couchbase 中的數據進行復雜的分析和聚合。Analytics 提供了 SQL-like 查詢語言(N1QL for Analytics),使得用戶能夠輕松地執行數據分析任務。以下是關于 C…

梯度下降優化算法-Adam

Adam(Adaptive Moment Estimation)是一種結合了動量法(Momentum)和 RMSProp 的自適應學習率優化算法。它通過計算梯度的一階矩(均值)和二階矩(未中心化的方差)來調整每個參數的學習率…

論文筆記(六十三)Understanding Diffusion Models: A Unified Perspective(六)(完結)

Understanding Diffusion Models: A Unified Perspective(六)(完結) 文章概括指導(Guidance)分類器指導無分類器引導(Classifier-Free Guidance) 總結 文章概括 引用: …

【PySide6快速入門】信號與槽的使用

文章目錄 前言什么是信號與槽信號與槽的功能最簡單的信號與槽控件連接信號與信號的連接總結 前言 在 PySide6 中,信號與槽機制是核心概念之一,它是 Qt 庫中事件通信的基礎。通過信號與槽,開發者能夠實現不同組件之間的解耦,從而使…

GOGOGO 枚舉

含義:一種類似于類的一種結構 作用:是Java提供的一個數據類型,可以設置值是固定的 【當某一個數據類型受自身限制的時候,使用枚舉】 語法格式: public enum 枚舉名{…… }有哪些成員? A、對象 public …