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的填充格式就是这样的。
RFC 8017: PKCS #1: RSA Cryptography Specifications Version 2.2
基于以上格式可以提取出证书的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
相关文章:
https数字签名手动验签
以bing.com 为例 1. CA 层级的基本概念 CA 层级是一种树状结构,由多个层级的 CA 组成。每个 CA 负责为其下一层级的实体(如子 CA 或终端实体)颁发证书。层级结构的顶端是 根 CA(Root CA),它是整个 PKI 体…...
为什么LabVIEW适合软硬件结合的项目?
LabVIEW是一种基于图形化编程的开发平台,广泛应用于软硬件结合的项目中。其强大的硬件接口支持、实时数据采集能力、并行处理能力和直观的用户界面,使得它成为工业控制、仪器仪表、自动化测试等领域中软硬件系统集成的理想选择。LabVIEW的设计哲学强调模…...
C# 操作符重载对象详解
.NET学习资料 .NET学习资料 .NET学习资料 一、操作符重载的概念 在 C# 中,操作符重载允许我们为自定义的类或结构体定义操作符的行为。通常,我们熟悉的操作符,如加法()、减法(-)、乘法&#…...
git:恢复纯版本库
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
java异常处理——try catch finally
单个异常处理 1.当try里的代码发生了catch里指定类型的异常之后,才会执行catch里的代码,程序正常执行到结尾 2.如果try里的代码发生了非catch指定类型的异常,则会强制停止程序,报错 3.finally修饰的代码一定会执行,除…...
【架构面试】二、消息队列和MySQL和Redis
MQ MQ消息中间件 问题引出与MQ作用 常见面试问题:面试官常针对项目中使用MQ技术的候选人提问,如如何确保消息不丢失,该问题可考察候选人技术能力。MQ应用场景及作用:以京东系统下单扣减京豆为例,MQ用于交易服和京豆服…...
A4988一款常用的步进电机驱动芯片
A4988 是一款常用的步进电机驱动芯片,广泛应用于 3D 打印机、CNC 机床和小型自动化设备中。它可以驱动多种类型的步进电机,但需要根据电机的参数(如电压、电流、相数等)进行合理配置。 一、A4988 的主要特性 驱动能力:…...
TypeScript语言的语法糖
TypeScript语言的语法糖 TypeScript作为一种由微软开发的开源编程语言,它在JavaScript的基础上添加了一些强类型的特性,使得开发者能够更好地进行大型应用程序的构建和维护。在TypeScript中,不仅包含了静态类型、接口、枚举等强大的特性&…...
A星算法两元障碍物矩阵转化为rrt算法四元障碍物矩阵
对于a星算法obstacle所表示的障碍物障碍物信息,每行表示一个障碍物的坐标,例如2 , 3; % 第一个障碍物在第二行第三列,也就是边长为1的正方形障碍物右上角横坐标是2,纵坐标为3,障碍物的宽度和高度始终为1.在rrt路径规划…...
什么情况下,C#需要手动进行资源分配和释放?什么又是非托管资源?
扩展:如何使用C#的using语句释放资源?什么是IDisposable接口?与垃圾回收有什么关系?-CSDN博客 托管资源的回收有GC自动触发,而非托管资源需要手动释放。 在 C# 中,非托管资源是指那些不由 CLR(…...
【最长上升子序列Ⅱ——树状数组,二分+DP,纯DP】
题目 代码(只给出树状数组的) #include <bits/stdc.h> using namespace std; const int N 1e510; int n, m; int a[N], b[N], f[N], tr[N]; //f[i]表示以a[i]为尾的LIS的最大长度 void init() {sort(b1, bn1);m unique(b1, bn1) - b - 1;for(in…...
day37|完全背包基础+leetcode 518.零钱兑换II ,377.组合总和II
完全背包理论基础 完全背包与01背包的不同在于01背包的不同物品每个都只可以使用一次,但是完全背包的不同物品可以使用无数次 在01背包理论基础中,为了使得物品只被使用一次,我们采取倒序遍历来控制 回顾:>> for(int j …...
【VM】VirtualBox安装ubuntu22.04虚拟机
阅读本文之前,请先根据 安装virtualbox 教程安装virtulbox虚拟机软件。 1.下载Ubuntu系统镜像 打开阿里云的镜像站点:https://developer.aliyun.com/mirror/ 找到如图所示位置,选择Ubuntu 22.04.3(destop-amd64)系统 Ubuntu 22.04.3(desto…...
Qt事件处理:理解处理器、过滤器与事件系统
1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中,所有事件都继承自 QEvent ,并且每个事件都有特定的标识符,如:Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息ÿ…...
DeepSeek 云端部署,释放无限 AI 潜力!
1.简介 目前,OpenAI、Anthropic、Google 等公司的大型语言模型(LLM)已广泛应用于商业和私人领域。自 ChatGPT 推出以来,与 AI 的对话变得司空见惯,对我而言没有 LLM 几乎无法工作。 国产模型「DeepSeek-R1」的性能与…...
【论文复现】基于Otsu方法的多阈值图像分割改进鲸鱼优化算法
目录 1.摘要2.鲸鱼优化算法WOA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了一种基于Otsu方法的多阈值图像分割改进鲸鱼优化算法(RAV-WOA)。RAV-WOA算法能够在分割灰度图像和彩色图像时,自动选择最优阈值,并确…...
Hive之数据定义DDL
Hive之数据定义DDL 文章目录 Hive之数据定义DDL写在前面创建数据库查询数据库显示数据库查看数据库详情切换当前数据库 修改数据库删除数据库创建表管理表(内部表)外部表管理表与外部表的互相转换 修改表重命名表增加、修改和删除表分区增加/修改/替换列信息 删除表 写在前面 …...
Golang 应用的 Docker 部署方式介绍及使用详解
本文将介绍如何使用 Docker 部署一个基于 Go 语言的后台服务应用 godco,并介绍如何配置 MongoDB 数据库容器的连接,确保应用能够成功启动并连接到容器方式部署的mongoDB数据库。 前提条件 1.已安装 Docker/Podman 2.已安装 MongoDB 数据库容器ÿ…...
SuccessFactors OData OAuth with SAP IAS-generated SAML assertion
导读 IAS:一句话说明白。SAP相关的系统可以通过IAS登录,只要IAS登录,其他系统免密登录。 作者:vivi,来源:osinnovation 上图有三个角色:brower,就是自己的浏览器,sp就是我们的目标…...
vue入门到实战 三
目录 3.1 v-bind 3.1.1 v-bind指令用法 编辑3.1.2 使用v-bind绑定class 3.1.3 使用v-bind绑定style 3.2.1 v-if指令 3.2.1 v-if指令 3.2.2 v-show指令 3.3 列表渲染指令v-for 3.3.1 基本用法 3.3.2 数组更新 3.3.3 过滤与排序 3.4 事件处理 3.4.1 使用v-on指令…...
音视频入门基础:RTP专题(7)——RTP协议简介
一、引言 本文对RTP协议进行简介。在简介之前,请各位先下载RTP的官方文档《RFC 3550》。该文档总共有89页,本文下面所说的“页数”是指在pdf阅读器中显示的页数: 二、RTP协议简介 根据《RFC 3550》第5页,实时传输协议(…...
06-机器学习-数据预处理
数据清洗 数据清洗是数据预处理的核心步骤,旨在修正或移除数据集中的错误、不完整、重复或不一致的部分,为后续分析和建模提供可靠基础。以下是数据清洗的详细流程、方法和实战示例: 一、数据清洗的核心任务 问题类型表现示例影响缺失值数值…...
《逆向工程核心原理》第三~五章知识整理
查看上一章节内容《逆向工程核心原理》第一~二章知识整理 对应《逆向工程核心原理》第三章到第五章内容 小端序标记法 字节序 多字节数据在计算机内存中存放的字节顺序分为小端序和大端序两大类 大端序与小端序 BYTE b 0x12; WORD w 0x1234; DWORD dw 0x12345678; cha…...
影视文件大数据高速分发方案
在当今的数字时代,影视行业的内容创作和传播方式经历了翻天覆地的变化。随着4K、8K高清视频的普及,以及虚拟现实(VR)和增强现实(AR)技术的发展,影视文件的数据量正以前所未有的速度增长。这就要求行业内的参与者必须拥有高效的大数据传输解决…...
使用朴素贝叶斯对散点数据进行分类
本文将通过一个具体的例子,展示如何使用 Python 和 scikit-learn 库中的 GaussianNB 模型,对二维散点数据进行分类,并可视化分类结果。 1. 数据准备 假设我们有两个类别的二维散点数据,每个类别包含若干个点。我们将这些点分别存…...
pytorch线性回归模型预测房价例子
人工智能例子汇总:AI常见的算法和例子-CSDN博客 import torch import torch.nn as nn import torch.optim as optim import numpy as np# 1. 创建线性回归模型类 class LinearRegressionModel(nn.Module):def __init__(self):super(LinearRegressionModel, self).…...
微信登录模块封装
文章目录 1.资质申请2.combinations-wx-login-starter1.目录结构2.pom.xml 引入okhttp依赖3.WxLoginProperties.java 属性配置4.WxLoginUtil.java 后端通过 code 获取 access_token的工具类5.WxLoginAutoConfiguration.java 自动配置类6.spring.factories 激活自动配置类 3.com…...
C++运算符重载
C的运算符重载:使对象的运算表现得和编译器内置类型一样 以复数类为例: #include <iostream> using namespace std;class CComplex { public:CComplex(int r 0, int i 0): mreal(r), mimage(i){}// 指导编译器怎么做CComplex类对象的加法操作CC…...
pandas(三)Series使用
一、Series基础使用 import pandasd {x:100,y:200,z:300} s1 pandas.Series(d) #将dict转化为Series print(s1)print("") l1 [1, 2, 3] l2 [a, b, c] s2 pandas.Series(l1, indexl2) #list转为Series print(s2)print("") s3 pandas.Series([11…...
PVE 中 Debian 虚拟机崩溃后,硬盘数据怎么恢复
问题 在 PVE 中给 Debian 虚拟机新分配硬盘后,通过 Debian 虚拟机开启 Samba 共享该硬盘。如果这个 Debian 虚拟机崩溃后,怎么恢复 Samba 共享硬盘数据。 方法 开启 Samba 共享相关知识:挂载硬盘和开启Samba共享。 新建一个虚拟机…...
【大数据技术】案例01:词频统计样例(hadoop+mapreduce+yarn)
词频统计(hadoop+mapreduce+yarn) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 在阅读本文前,请确保已经阅读过以上两篇文章,成功搭建了Hadoop+MapReduce+Yarn的大数据集群环境。 写在前面 Wo…...
PySPARK带多组参数和标签的SparkSQL批量数据导出到S3的程序
设计一个基于多个带标签SparkSQL模板作为配置文件和多组参数的PySPARK代码程序,实现根据不同的输入参数自动批量地将数据导出为Parquet、CSV和Excel文件到S3上,标签和多个参数(以“_”分割)为组成导出数据文件名,文件已…...
分享刷题过程中有价值的两道题目
小编在这里先祝大家新的一年里所愿皆得,万事顺意,天天开心!!! 一.水仙花数 题目描述: 求100∼999中的水仙花数。若三位数ABCA^3B^3C^3,则称ABC为水仙花数。例如153,135333112527153&…...
Java篇之继承
目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…...
7.DP算法
DP 在C中,动态规划(Dynamic Programming,DP)是一种通过将复杂问题分解为重叠子问题来高效求解的算法设计范式。以下是DP算法的核心要点和实现方法: 一、动态规划的核心思想 重叠子问题:问题可分解为多个重…...
[SAP ABAP] 在ABAP Debugger调试器中设置断点
在命令框输入/H,点击回车以后,调试被激活,点击触发任意事件进入ABAP Debugger调试器界面 点击按钮,可以在Debugger调试器中新增临时断点 我们可以从ABAP命令、方法、功能、表单、异常、消息、源代码等多个维度在Debugger调试器中设…...
使用LLaMA-Factory对AI进行认知的微调
使用LLaMA-Factory对AI进行认知的微调 引言1. 安装LLaMA-Factory1.1. 克隆仓库1.2. 创建虚拟环境1.3. 安装LLaMA-Factory1.4. 验证 2. 准备数据2.1. 创建数据集2.2. 更新数据集信息 3. 启动LLaMA-Factory4. 进行微调4.1. 设置模型4.2. 预览数据集4.3. 设置学习率等参数4.4. 预览…...
2 [GitHub遭遇严重供应链投毒攻击]
近日,有黑客针对 Discord Top.gg 的GitHub 账户发起了供应链攻击,此次攻击导致账户密码、凭证和其他敏感信息被盗,同时也影响到了大量开发人员。 Checkmarx 在一份技术报告中提到,黑客在这次攻击中使用了多种TTP,其中…...
[c语言日寄]C语言类型转换规则详解
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
Python魔法函数
在Python中,的确有“魔法函数”(Magic Methods)这种说法,也被称为特殊方法(Special Methods)。这些函数的名称以双下划线开始和结束,例如 __init__、__len__ 等。它们为Python提供了一种约定俗成…...
Cypher入门
文章目录 Cypher入门创建数据查询数据matchoptional matchwhere分页with 更新数据删除数据实例:好友推荐 Cypher入门 Cypher是Neo4j的查询语言。 创建数据 在Neo4j中使用create命令创建节点、关系、属性数据。 create (n {name:$value}) return n //创建节点&am…...
excel如何查找一个表的数据在另外一个表是否存在
比如“Sheet1”有“张三”、“李四”“王五”三个人的数据,“Sheet2”只有“张三”、“李四”的数据。我们通过修改“Sheet1”的“民族”或者其他空的列,修改为“Sheet2”的某一列。这样修改后筛选这个修改的列为空的或者为出错的,就能找到两…...
【华为OD-E卷 - 连续出牌数量 100分(python、java、c++、js、c)】
【华为OD-E卷 - 连续出牌数量 100分(python、java、c、js、c)】 题目 有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、绿中的一种,数字为0-9中的一个。游戏开始时玩家从手牌中选取一张卡牌打出&…...
buu-jarvisoj_level0-好久不见30
嘶,我咋觉得这个也是栈溢出呢,找到读取的值,在再找到后门函数...
DeepSeek r1本地安装全指南
环境基本要求 硬件配置 需要本地跑模型,兼顾质量、性能、速度以及满足日常开发需要,我们需要准备以下硬件: CPU:I9内存:128GB硬盘:3-4TB 最新SSD,C盘确保有400GB,其它都可划成D盘…...
【论文笔记】Fast3R:前向并行muti-view重建方法
众所周知,DUSt3R只适合做稀疏视角重建,与sapnn3r的目的类似,这篇文章以并行的方法,扩展了DUSt3R在多视图重建中的能力。 abstract 多视角三维重建仍然是计算机视觉领域的核心挑战,尤其是在需要跨不同视角实现精确且可…...
开源智慧园区管理系统对比其他十种管理软件的优势与应用前景分析
内容概要 在当今数字化快速发展的时代,园区管理软件的选择显得尤为重要。而开源智慧园区管理系统凭借其独特的优势,逐渐成为用户的新宠。与传统管理软件相比,它不仅灵活性高,而且具有更强的可定制性,让各类园区&#…...
第四节 MATLAB变量
每个MATLAB变量可以是数组或者矩阵。 用一个简单的方法指定变量。例如: x 3 % defining x and initializing it with a value MATLAB执行上述语句,并返回以下结果: x 3 上述的例子创建了一个1-1的矩阵名为x和的值存储在其元素中…...
小红的小球染色期望
B-小红的小球染色_牛客周赛 Round 79 题目描述 本题与《F.R小红的小球染色期望》共享题目背景,但是所求内容与范围均不同,我们建议您重新阅读题面。 有 n 个白色小球排成一排。小红每次将随机选择两个相邻的白色小球,将它们染成红色。小红…...
c++井字棋(单人对电脑:1.电脑随机下 2.电脑AI;3.双人对决)
本游戏分两个模式,三种玩法: 每个玩法中的人下棋规则不变,如下: while (1) {/*输入*/int row,col;cout<<"请输入坐标(1索引):\n";cin>>row>>col;/*切换索引*/row--;col--;if(legal(row,col)) {prin…...