• 【现代密码学原理实验】——CrypTool2与OpenSSL的使用(学习笔记)


    📖 前言:本期我们将使用两个密码学常用工具来实现与分析前面所学的理论知识。
    在这里插入图片描述


    🕒 1. 工具介绍

    🕘 1.1 CrypTool 2

    • CrypTool 2(CT2)是一个面向Windows的现代电子学习程序,它将密码学和密码分析可视化。它不仅包括密码的加密和密码分析,还包括它们的基础知识和现代密码学的全部内容。
    • CT2包含200多个具有工作流的现成模板。你还可以轻松地组合和执行加密函数,以自己在CT2中创建工作流(可视化编程)。使用这种方法,复杂的过程可以很容易地可视化,从而更好地理解。通过使用矢量图形,可以自由缩放当前视图。

    🔎 CrypTool 2下载链接

    在这里插入图片描述

    🕘 1.2 OpenSSL

    • OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
    • OpenSSL包含一个命令行工具用来完成OpenSSL库中的所有功能,更好的是,它可能已经安装到你的系统中了。
    • OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不应该只将其作为一个库来使用,它还是一个多用途的、跨平台的密码工具。

    🕤 1.2.1 常用指令语法

    openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e][-d] [-a] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-p]
    [-P] [-bufsize number] [-nopad] [-debug]
    
    • 1
    • 2

    在这里插入图片描述

    • -ciphername选项:加密算法,Openssl支持的算法在help上列出了,你只需选择其中一种算法即可实现文件加密功能。
    • -in选项:输入文件,对于加密来说,输入的应该是明文文件;对于解密来说,输入的应该是加密的文件。该选项后面直接跟文件名。
    • -out选项:输出文件,对于加密来说,输出的应该是加密后的文件名;对于解密来说,输出的应该是明文文件名。
    • -pass选项:选择输入口令的方式,输入源可以是标准输入设备,命令行输入,文件、变量等。
    • -e选项:实现加密功能(不使用-d选项的话默认是加密选项)。
    • -d选项:实现解密功能。
    • -a-A选项:对文件进行BASE64编解码操作。
    • -K选项:手动输入加密密钥(不使用该选项,Openssl会使用口令自动提取加密密钥)。
    • -IV选项:输入初始变量(不使用该选项,Openssl会使用口令自动提取初始变量)。
    • -salt选项:是否使用盐值,默认是使用的。
    • -p选项:打印出加密算法使用的加密密钥。

    🕤 1.2.2 Dgst 指令语法

    openssl    dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1 ] [-c] [-r] [-rand file] [-d ] [-hex]  [-binary] [-sign filename] [-verify filename] [-prverify filename] [-keyform filename] [-out filename]  [-signature filename ] [-sigopt nm:v] [-hmac key] [-mac alg] [-macopt nm:v] [-passin arg] [-engine e] [file...]  
    
    • 1
    • -md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1:用md5/ md4/ md2/ sha1/ mdc2/ripemd160/-dss1算法进行摘要。
    • -c:打印出两个哈希结果的时候用冒号来分隔开。仅仅设置了[-hex]的时候有效。
    • -r:用coreutils格式来输出摘要值。
    • -rand:产生随机数种子的文件。
    • -d:打印出BIO调试信息值。
    • -hex:显示ASCII编码的十六进制摘要结果,默认选项。
    • -binary:以二进制的形式来显示摘要结果值。
    • -sign filename:用filename中的私钥文件对数据进行签名。
    • -verify filename:用filename中的公钥文件对数据进行验证签名。输出结果仅仅是"Verification OK" 和 "Verification Failure"中的一种。
    • -prverify filename:用filename中的私钥文件对数据进行验证签名。
    • -keyform arg:filename中的证书格式,该命令中仅仅支持PEM以及ENGINE格式。
    • -out filename:输出对象,默认为标准输出。
    • -signature filename:实际需要验证的签名值的位置。
    • file:你要hash的文件,如果没有指定,就使用标准输入。

    注意:算法默认为SHA1。
    如果希望用DSA算法来进行签名或验证,就必须要使用DSS摘要算法

    🕒 2. 传统加密技术

    🔎 传统加密技术理论知识回顾

    🕘 2.1 Caeser 密码

    题目:使用Python编写凯撒密码的程序,分别对下面两组明文进行加密,并用Cryptool 2 中的Caesar Brute-force analysis模板对所得密文进行穷举法攻击。再使用Caesar Analysis using character frequencies模板分别对两组密文进行字母频率分析法解密,找出明文E字母的对应密文字母,判断结果是否正确,分析原因。
    1) To be or not to be, that is a question.
    2) The encrypted text is forwarded to the FrequencyTest component. This component generates a bar chart of the character frequencies of the encrypted text and sends it to the CaesarAnalysisHelper component. This component performs the cryptanalysis of a Caesar cipher using the frequency of 1-grams in the encrypted text. The calculated shift key is finally given to a Caesar component to decrypt the encrypted text. The key can also seen in the TextOutput “Key”.

    # Caeser密码
    print("请输入明文")
    s=input()
    print("请输入密钥(数字)")
    k=int(input())
    t = ''
    for i in s:
        if 'A' <= i <= 'Z':
            t += chr(ord('A')+((ord(i)-ord('A'))+k)%26)
        elif 'a'<= i <='z':
            t += chr(ord('a')+((ord(i)-ord('a'))+k)%26)
        else:
            t += i
    print(t)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    设置密钥为10
    第一题的密文:Dy lo yb xyd dy lo, drkd sc k aeocdsyx.
    第二题的密文:Dro oxmbizdon dohd sc pybgkbnon dy dro PboaeoxmiDocd mywzyxoxd. Drsc mywzyxoxd qoxobkdoc k lkb mrkbd yp dro mrkbkmdob pboaeoxmsoc yp dro oxmbizdon dohd kxn coxnc sd dy dro MkockbKxkvicscRovzob mywzyxoxd. Drsc mywzyxoxd zobpybwc dro mbizdkxkvicsc yp k Mkockb mszrob ecsxq dro pboaeoxmi yp 1-qbkwc sx dro oxmbizdon dohd. Dro mkvmevkdon crspd uoi sc psxkvvi qsfox dy k Mkockb mywzyxoxd dy nombizd dro oxmbizdon dohd. Dro uoi mkx kvcy coox sx dro DohdYedzed “Uoi”.

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    分析:不难看出,只有文本足够大的时候,字母频率分析法才能发挥作用。如题目二字母E对应的密文是O是准确的,而题目一中频率最高的却是D,这就是出现差错了。

    🕘 2.2 Vigenère 密码

    题目:使用Python编写Vigenère密码的程序,加密明文:Itismyhonortobeyourlecturer,Vigenere密钥是center,再使用Cryptool 2 中Vigenere cipher模板对同样的明文进行加密,对比密文是否相同。

    # Vigenère密码 加密
    letter_list='abcdefghijklmnopqrstuvwxyz' # 字母表
     
    #根据输入的key生成key列表
    def get_keylist(key):
     key_list=[]
     for ch in key:
      key_list.append(ord(ch.upper())-65)  # 尾插
     return key_list
    
    def encrypt(plaintext,key_list):
     ciphertext=""
     
     i=0
     for ch in plaintext: # 遍历明文
      if 0==i%len(key_list):
       i=0
      if ch.isalpha(): # 明文是否为字母,如果是,则判断大小写,分别进行加密
       if ch.isupper():
        ciphertext+=letter_list[(ord(ch)-65+key_list[i]) % 26]
        i+=1
       else:
        ciphertext+=letter_list[(ord(ch)-97+key_list[i]) % 26].lower()
        i+=1
      else: # 如果密文不为字母,直接添加到密文字符串里
       ciphertext+=ch
     return ciphertext
    
    if __name__=='__main__':       # 主函数
     
     print("请输入密钥:")
     key=input()
     while(False==key.isalpha()):# 输入合法性判断
      print("输入有误!密钥为字母,请重新输入:")
      key=input()
     
     key_list=get_keylist(key)
    
     print("请输入明文:")
     plaintext=input()
     ciphertext=encrypt(plaintext,key_list)
     print("密文为:\n%s" % ciphertext)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    密文:kxvlqpjsahvkqfrrsltprvxltie

    在这里插入图片描述

    🕘 2.3 Playfair 密码

    题目:使用Cryptool 2 中Playfair cipher模板进行加密,密钥词分别用
    1) APPLE
    2) CROWN
    加密:Manners make the man.
    自己动手写下两个5*5字母矩阵,对比模板中的Pre-formatted Text控件的内容,是否相同。

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    🕘 2.4 一次一密

    题目1:使用Cryptool 2 中one-time pad demo(一次一密)模块观察使用不同的密钥,也就是one-time pad 1,2,3,输出的结果的差异。

    在这里插入图片描述
    题目2:使用Cryptool 2 中 one -time pad misuage模板,运行,观察分析,数据A,B能够被破解的原因。

    在这里插入图片描述

    🕘 2.5 置换加密

    题目:使用Cryptool 2 中Transpotition模板,观察密钥为:ZEBRAS,明文为:Wir wurden entdeckt, flieh wenn du kannst,进行置换加密及解密的过程。

    请添加图片描述

    🕒 3. 现代对称加密技术

    🕘 3.1 DES

    🔎 分组密码和数据加密标准回顾

    题目1:使用Cryptool2的DES Visualization模板查看DES加密每一个步骤,简要描述DES的加密结构和密钥生成过程。

    在这里插入图片描述
    在这里插入图片描述

    题目2:使用Cryptool2的DES cipher模板进行加密,密钥:1B 11 11 11 1D 11 11 11,明文:The attack will be on Saturday morning, 加密两次,两次的工作模式分别选择电码本模式和密文反馈模式。加密结果是否相同?

    在这里插入图片描述
    在这里插入图片描述

    题目3:使用Cryptool2的DES Brute-force analysis模板观察对DES进行穷举攻击的过程及所需时间,将穷举所需时间记录下来。

    在这里插入图片描述
    穷举攻击需要9秒

    题目4:自己创立文件text.txt,内容为你自己的学号。使用openssl中的DES密码加密,分别使用ECB和CBC模式进行加密,并使用密钥0123456789abcdef,使用base64编码,输出加密后的文件为msg.bin和msg1.bin。对比生成的两个文件中的密文,说明区别和原因。

    [hins@VM-12-13-centos testOpenssl]$ openssl
    OpenSSL> enc -des-cbc -in text.txt -out msg1.bin -a
    enter des-cbc encryption password:		# Linux下输入密码不可见
    Verifying - enter des-cbc encryption password:
    
    • 1
    • 2
    • 3
    • 4

    msg.bin密文:

    2FsdGVkX1//hXzh+ZKqWw1V8Cfgy6tMAZFBWenpdUY=
    
    • 1

    msg1.bin密文:

    2FsdGVkX1+QkWbP05SNONbigVSryi/Dj6U+5tdMLAU=
    
    • 1

    ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。

    题目5:使用openssl中的DES密码解密msg.bin文件,并输出text01.txt文件,对比text.txt和text01.txt文件的内容,是否一样?

    OpenSSL> enc -d -des-ecb -in msg.bin -out text01.txt -a
    enter des-ecb decryption password:
    
    • 1
    • 2

    在这里插入图片描述
    注:-pass选项,格式:-pass pass:[密钥]把它写入到脚本中,自动完成加密功能,不使用pass选项默认系统会提示输入口令,并且确认,是需要人工操作的

    🕘 3.2 AES

    🔎 高级加密标准AES回顾

    题目1:使用Cryptool2的AES cipher (text input)模板加密明文:The attack will be on Saturday morning, 密钥:Password,分别用以下的密钥长度和工作模式:
    1)128bit,CBC模式

    在这里插入图片描述
    2)192bit,ECB模式
    在这里插入图片描述
    题目2:并使用Cryptool2的AES Known-plaintext观察已知部分明文的解密方法解密过程。

    在这里插入图片描述
    题目3:使用openssl中的AES密码进行加密,密钥长度选择128位,工作模式:OFB,加密text.txt,密钥:0123456789abcdef0123456789abcdef,输出生成加密后的文件encmsg.bin,使用BASE64格式进行编码

    OpenSSL> enc -aes-128-ofb -k 0123456789abcdef0123456789abcdef -in text.txt -out encmsg.bin -a
    
    • 1

    密文:U2FsdGVkX186QHxUPO7OfRJGIst0X1w5Gy6r1qg=

    题目4:使用openssl中的AES密码进行解密,密钥长度选择128位,工作模式:OFB,解密encmsg.bin,输出文件text02.txt,对比原文和解密后的内容,是否一样?

    在这里插入图片描述

    题目5:使用openssl中的AES密码进行加密,密钥长度选择256位,工作模式:CFB,加密text.txt,密钥:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef,输出生成加密后的文件encmsg1.bin,初始向量为0123456789abcdef0123456789abcdef,此初始向量是多少位?为什么需要这种长度的初始向量?

    OpenSSL> enc -aes-256-cfb -k 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef -iv 0123456789abcdef0123456789abcdef -in text.txt -out encmsg1.bin -a
    
    • 1

    初始向量为128位,因为明文分组长度固定为128位,这样更安全,

    密文:U2FsdGVkX1+BJXmWuHMwEtn6KG5af/vWvdn6PzI=

    🕒 4. 现代非对称加密技术

    🕘 4.1 RSA

    🔎 公钥密码学与RSA回顾

    题目1:使用RSA with big number 模板观察RSA的进行加密的完整过程,已知p=17,q=11,e=7,m=88,用扩展欧几里得算法计算,并用这个模板验证得到的密文。

    在这里插入图片描述
    在这里插入图片描述

    题目2:使用RSA Encryption模板用RSA加密明文:
    In this mode, the component only looks for the smallest prime factor of the input number. It provides the found factor and the composite remainder on its outputs. In this example, the composite remainder is fed back to the input of the factorizer via a gate and the resulting loop thus completely factorizes the input number.
    使用素数p=1548419053,q=1578847709,e=7

    在这里插入图片描述

    题目3:使用RSA Decryption 模板对上题明文进行解密,观察输出结果

    在这里插入图片描述

    题目4:使用Factorization with Trial Division(brute-force)模板,观察因子分解的过程,因子分解的进展情况,了解RSA的安全问题。

    在这里插入图片描述
    题目5:用rsa -help指令了解rsa的相关指令

    OpenSSL> rsa -help 
    rsa [options] <infile >outfile
    where options are
     -inform arg     input format - one of DER NET PEM
     -outform arg    output format - one of DER NET PEM
     -in arg         input file
     -sgckey         Use IIS SGC key format
     -passin arg     input file pass phrase source
     -out arg        output file
     -passout arg    output file pass phrase source
     -des            encrypt PEM output with cbc des
     -des3           encrypt PEM output with ede cbc des using 168 bit key
     -idea           encrypt PEM output with cbc idea
     -seed           encrypt PEM output with cbc seed
     -aes128, -aes192, -aes256
                     encrypt PEM output with cbc aes
     -camellia128, -camellia192, -camellia256
                     encrypt PEM output with cbc camellia
     -text           print the key in text
     -noout          don't print key out
     -modulus        print the RSA key modulus
     -check          verify key consistency
     -pubin          expect a public key in input file
     -pubout         output a public key
     -engine e       use engine e, possibly a hardware device.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    题目6:用openssl直接生成1024字节的RSA公私钥对,输出文件priRSAkey.pem
    指令:

    genrsa -out priRSAkey.pem 1024
    
    • 1

    在这里插入图片描述

    题目7:用上一题的公私钥对文件提取出对应的公钥,输出文件publicRSAkey.pem.
    指令:

    rsa -in priRSAkey.pem -pubout -out publicRSAkey.pem
    
    • 1

    在这里插入图片描述
    题目8:自己创立文件text.txt,内容为自己学号。用第7题的公私钥对加密,输出加密后的文件为rsaenctext.enc
    指令:

    rsautl -encrypt -in text.txt -inkey priRSAkey.pem -out rsaenctext.enc
    
    • 1

    在这里插入图片描述
    题目9:用私钥对rsaenctext.enc进行解密,输出detext.txt文件。对比detext.txt和text.txt的内容,是否相同?
    指令:

    rsautl -decrypt -in rsaenctext.enc -inkey priRSAkey.pem -out detext.txt
    
    • 1

    在这里插入图片描述
    是相同的

    题目10:用第6题中的公私钥对文件对text.txt进行数字签名,产生文件signtext01.file
    指令:

    rsautl -sign -in text.txt -inkey priRSAkey.pem -out signtext01.file   
    
    • 1

    在这里插入图片描述

    题目11:并使用第7题中的公钥对文件signtext01.file并进行验证,并产生文件designtext01.txt,对比designtext01.txt和text.txt

    OpenSSL> rsautl -verify -in signtext01.file -inkey publicRSAkey.pem -out designtext01.txt
    unable to load Private Key
    140569182566288:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:707:Expecting: ANY PRIVATE KEY
    error in rsautl
    
    • 1
    • 2
    • 3
    • 4

    验证发现使用公钥对文件会报错,因此改用公私钥对文件进行验证。
    指令:

    rsautl -verify -in signtext01.file -inkey priRSAkey.pem -out designtext01.txt
    
    • 1

    在这里插入图片描述

    🕘 4.2 Diffie-Hellman 密钥交换

    🔎 DH密钥交换回顾

    题目1:使用Diffie-Hellman key exchange模板观察Diffie-Hellman密钥交换过程,使用公用素数71,本元根7。并用自己语言简单描述其密钥交换过程。

    在这里插入图片描述
    在这里插入图片描述

    🕒 5. 数据完整性

    🕘 5.1 Hash 函数

    🔎 哈希函数回顾

    题目1:使用SHA-256模板,用SHA1、SHA256、SHA512分别加密明文:
    (a) Hong Kong, officially the Hong Kong Special Administrative Region of the People’s Republic of China, is an autonomous territory on the eastern side of the Pearl River estuary in East Asia. Along with Macau, Guangzhou, Shenzhen, Zhuhai, and several other major cities in Guangdong, the territory forms a core part of the Pearl River Delta metropolitan region, the most populated area in the world. With over 7.4 million Hongkongers of various nationalitiesin a territory of 1,104 square kilometres, Hong Kong is the fourth-most densely populated region in the world.
    (b) To be or not to be, that is a question.
    观察三者加密后的密文差别(特别注意长度差别)

    (a)
    SHA1:CB 1B D8 9B 53 89 C8 05 B7 21 29 71 26 0E E7 C2 22 94 2E 87
    SHA256:F3 C8 26 33 5C 43 3E 74 03 8E 2A 84 6A 31 CC B5 18 B5 D2 B0 FF 4B 92 B1 9C B8 39 84 F5 49 43 0C
    SHA512:F9 6D 78 0E FF 90 6F 34 7A 2D C6 C8 5E 44 A5 82 F0 A6 4B 0B 8B 49 E2 E0 B9 92 96 A1 CF 8A AA 31 4A 37 71 13 BD 5A 68 9D E4 DB CD 6B 45 9A 4D 17 57 FB 09 2F 1B 54 97 2F 80 49 CF 54 31 9A CD 02

    (b)
    SHA1:E3 2F DB 01 81 9B FC 49 63 68 A9 32 E5 62 C2 EA D1 7E E1 DC
    SHA256:02 7D 41 BE BC 15 41 BA 42 0D F8 7C 84 5D 10 1A 37 1E 81 9B 8C DA 5C 7A 1D C6 D7 A1 11 BB A4 51
    SHA512:6C 9E 95 E1 9D B0 B9 8A BC AB 04 9A DF 9C 28 0A 6C E3 19 27 47 23 36 81 1E 34 46 B2 5F B0 F5 F4 91 DB 78 D2 5D 3B F8 0D 2F B3 B4 48 47 D0 3C 80 FE C3 F4 89 2D 77 76 55 62 A6 1D D9 23 46 5F 62

    长度分别为20,32,64

    题目2:使用Dictionary attack on a password hash value 模板观察抗弱碰撞攻击,简述一下抗弱碰撞攻击。
    对任意给定的𝒙,找到满足𝒚≠𝒙 且𝑯(𝒚)=𝑯(𝒙)的𝒚,在计算上不可行

    在这里插入图片描述
    题目3:使用SHA-1 collision模板观察针对SHA-1的抗强碰撞攻击,简述一下什么是抗强碰撞攻击?
    找到任何满足𝑯(𝒚)=𝑯(𝒙)的偶对(𝒙,𝒚),在计算上不可行

    在这里插入图片描述
    题目4:使用Password store using salted 模板,密码输入框输入:abcd1234,密码存储进服务器前的处理过程,过程中加了几次salt(在密码任意固定位置插入特定的随机字符串),思考加salt的意义。结合实际思考并回答问题:服务器是否直接存储密码?用户密码忘记后,网站一般操作是什么?

    答:服务器不直接存储密码,忘记密码后会要求用户找回密码

    在这里插入图片描述

    题目5:创建文件text,txt,内容为自己学号,使用Openssl的MD5算法hash text.txt

    OpenSSL> dgst -md5 text.txt
    MD5(text.txt)= 58e9b45073e94ab5e6bb595c0186b991
    
    • 1
    • 2

    题目6:使用Openssl的sha1 hash text.txt,并转化成十六进制数,中间用冒号隔开。

    OpenSSL> dgst -sha1 -hex -c text.txt
    SHA1(text.txt)= b3:a6:1f:d4:80:d1:96:c6:9b:74:fe:b0:91:4c:3e:df:2b:9d:9d:aa
    
    • 1
    • 2

    🕘 5.2 HMAC 函数

    🔎 消息认证码回顾

    题目1:使用HMAC模板观察HMAC的整个结构,结合模板说明一下HMAC中间可以进行预处理的部分。

    在这里插入图片描述

    题目2:使用Openssl生成RSA公私钥对文件prikey.pem 对text.txt进行数字签名,再用MD5进行hash,生成文件hashed.txt

    指令:

    dgst -sign priRSAkey.pem -md5 -keyform PEM -out hashed.txt text.txt
    
    • 1

    在这里插入图片描述

    题目3:根据prikey.pem生成公钥pubkey.pem,用公钥进行检验,检验结果是否成功?

    OpenSSL> dgst -md5 -verify publicRSAkey.pem -signature hashed.txt text.txt
    Verified OK
    
    • 1
    • 2

    题目4:使用Openssl的SHA1作为HMAC的hash算法,再用“abbaab”作为密钥,hash文件text.txt,输出文件hashed1.txt

    dgst -sha1 -hmac "abbaab" -out hashed1.txt text.txt
    
    • 1

    在这里插入图片描述


    OK,以上就是本期知识点“CrypTool2与OpenSSL的使用”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟📌~
    💫如果有错误❌,欢迎批评指正呀👀~让我们一起相互进步🚀
    🎉如果觉得收获满满,可以点点赞👍支持一下哟~

  • 相关阅读:
    50、东北大学、阿尔伯塔大学:Hi-GCN从2个层次角度进行图学习,用来诊断脑部疾病[你这和MVS-GCN套娃呢?]
    嵌入式 单片机面试 通信协议常见问题答案 串口通信 IIC通信 SPI通信 协议解析讲解 RS232 RS485 协议 IIC总线
    毫秒级!千万人脸库快速比对,上亿商品图片检索,背后的极速检索用了什么神器?
    程序设计思路-球连球组成的群
    技术管理进阶——跨级管理/汇报
    pbjs的一些用法.
    【无标题】
    vue2 - 基于Export2Excel.js导出Excel案例(js-xlsx插件二次封装使用)
    nydusd 源码理解(一)
    基于SpringBoot+Vue的服装销售系统
  • 原文地址:https://blog.csdn.net/HinsCoder/article/details/127921863