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

news2025/8/11 12:13:46

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


目录

  • 🕒 1. 工具介绍
    • 🕘 1.1 CrypTool 2
    • 🕘 1.2 OpenSSL
      • 🕤 1.2.1 常用指令语法
      • 🕤 1.2.2 Dgst 指令语法
  • 🕒 2. 传统加密技术
    • 🕘 2.1 Caeser 密码
    • 🕘 2.2 Vigenère 密码
    • 🕘 2.3 Playfair 密码
    • 🕘 2.4 一次一密
    • 🕘 2.5 置换加密
  • 🕒 3. 现代对称加密技术
    • 🕘 3.1 DES
    • 🕘 3.2 AES
  • 🕒 4. 现代非对称加密技术
    • 🕘 4.1 RSA
    • 🕘 4.2 Diffie-Hellman 密钥交换
  • 🕒 5. 数据完整性
    • 🕘 5.1 Hash 函数
    • 🕘 5.2 HMAC 函数

🕒 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]

在这里插入图片描述

  • -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...]  
  • -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)

设置密钥为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)

密文: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:

msg.bin密文:

2FsdGVkX1//hXzh+ZKqWw1V8Cfgy6tMAZFBWenpdUY=

msg1.bin密文:

2FsdGVkX1+QkWbP05SNONbigVSryi/Dj6U+5tdMLAU=

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:

在这里插入图片描述
注:-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

密文: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

初始向量为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.

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

genrsa -out priRSAkey.pem 1024

在这里插入图片描述

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

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

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

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

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

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

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

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

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

在这里插入图片描述

题目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

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

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

在这里插入图片描述

🕘 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

题目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

🕘 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

在这里插入图片描述

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

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

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

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

在这里插入图片描述


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++/VS XP系统 无法定位程序输入点WSAPoll于动态链接库ws2_32.dll解决方案

项目情况&#xff1a; 调用第三方网络库&#xff08;hv库&#xff09;&#xff0c;在win7/8/10等系统都运行正常&#xff0c;在XP系统提示“ 无法定位程序输入点WSAPoll于动态链接库ws2_32.dll” 产生原因&#xff1a; 第三方网络库&#xff08;hv库&#xff09;使用到了wsap…

PDF转OFD ~java实现

PDF转OFD ~java实现 上篇文章记录了一下我第一次对接“超阅云”实现了ofd转pdf功能&#xff0c;想了想&#xff0c;还是再写一篇pdf转ofd的实现&#xff0c;其实对接的API基本一样&#xff0c;如果你是第一次看&#xff0c;建议先看看上一篇文章-“ofd转pdf” ———————…

Web前端——用CSS的常用样式制作一个炫酷的按钮

文章目录笔记&#xff1a;CSS的常用样式炫酷按钮效果实现笔记&#xff1a;CSS的常用样式 边框以及弧度样式 border-width&#xff1a;边框的线条宽度。 border-style&#xff1a;边框的样式&#xff0c;例如 solid实现 dotted 点线 dashed 虚线… border-color&#xff1a;边框…

Docker -- 01实践:使用Docker 快速安装Jenkins

使用Docker 快速安装Jenkins1. Docker install2. Jenkins install3. User Guide1.1 Big Data -- Postgres3. User Guide1.1 Big Data -- PostgresJenkins Website: https://www.jenkins.io/. 1. Docker install Docker 安装和基础知识 Docker install: https://blog.csdn.net/w…

TS学习笔记 类型标签 联合类型 枚举类型 泛型 类型别名

个人理解总结&#xff1a; js天生没有编译和类型检查的束缚 灵活好上手 结合项目使用时也可以做到热更新提升开发体验。 (需要编译的JAVA以前开发DEBUG很麻烦但现在有了容器编排技术&#xff0c;也可以实现类似效果) TS是JS的超集&#xff0c;添加了类型标注&#xff0c;不能直…

vulnhub靶机corrosion1

靶机下载地址&#xff1a;Corrosion: 1 ~ VulnHub Kail IP&#xff1a;192.168.174.128 Corrosion ip&#xff1a;192.168.174.133 思路&#xff1a; 靶机端口扫描&#xff0c;ssh日志反弹shell&#xff0c;linpeas脚本扫描&#xff0c;备份文件发现密码&#xff0c;爆破zi…

医疗器械设计时需要注意的事项

伴随着医疗器械的增加&#xff0c;经市场评估的医疗器械产品也趋向多样化&#xff0c;医疗器械设计也非常重要&#xff0c;下面小编就带大家了解一下开展医疗器械设计时需要注意什么? 说到医疗器械&#xff0c;相信大家都很熟悉。医疗器械有很多种&#xff0c;包括一类医疗器械…

【C++位图】1. 快速查找某个数据是否在一个集合中 2. 排序(全部插入,遍历一遍) 3. 求两个集合的交集、并集等

目录 问题&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 2.简单实现一个位图 3.如何利用位图求两个集合的交集、并集 问题&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排过序…

Golang入门笔记(14)—— 错误处理

来一个除以0的异常&#xff0c;代码如下&#xff1a; package mainimport "fmt"func main() {fmt.Println("before")divNum()fmt.Println("after") }func divNum() {num1 : 10num2 : 0result : num1 / num2fmt.Println(result) } console 异常&…

GitHub 昙花一现:《Spring Boot 趣味实战》神作开源几分钟被下架

又来给大家分享好书了&#xff1a;刘水镜老师的 Spring Boot 趣味实战&#xff0c;网上依旧是没有开源版本&#xff01;文末送上 刘水镜是谁&#xff1f; 十余年持续技术文章输出&#xff0c;CSDN 博客专家。2020 年《 Spring Boot 趣味私房课》专栏上线&#xff0c;凭借风趣…

创新案例|巴黎欧莱雅如何以内容+货架双轮驱动全渠道兴趣电商增长飞轮

对巴黎欧莱雅而言&#xff0c;兴趣电商作为内容场景为核心的平台&#xff0c;但货架场景已成为驱动增长的飞轮。巴黎欧莱雅团队注意到&#xff0c;抖音用户不只是被动地接受信息流推送&#xff0c;而是越来越倾向于主动搜索。消费者行为的重大变革意味着消费者不再满足于货找人…

【MFC】初识MFC(8)

MFC简介 微软提供的一个类库&#xff08;Class Libraries&#xff09;&#xff0c;封装了Windows的API&#xff0c;并且包含一个应用程序框架。 1、MFC是对前面窗口编程所用到的API进行封装&#xff0c;在Windows C基础上引入了C面向对象的思想&#xff0c;简单而言就是把API…

【论文翻译】2.5PC:一个更快的非阻塞原子提交协议

2.5-PC: A Faster and Non-Blocking Atomic Commit Protocol 目录1 介绍2 相关工作3 原子承诺和 3PC 概述4 为什么 3PC 是非阻塞的&#xff1f;5 2.5 PC6 2.5 PC 的非正式证明7 确认信息8 2.5 PC 机器证明参考摘要&#xff1a;我们提出 2.5PC&#xff0c;一种非阻塞原子提交协…

DNS与网站访问流程

1&#xff1a;dns与网址url简介 DNS是域名系统(DomainNameSystem)的缩写&#xff0c;域名系统是一中庞大而复杂的系统&#xff0c;但我们这里讲解重心并不是这个系统&#xff0c;而是指本地电脑dns是什么 讲到dns&#xff0c;我们就不得不讲讲网址和域名&#xff0c;我们经常会…

linux杀死进程的五种方法(kill)

添加链接描述 相关博主的链接&#xff1b; 方法一&#xff1a;通过kill 进程id的方式可以实现 首先需要知道进程id, 例如,想要杀死firefox的进程,通过 ps -ef|grep firefox,可以查到firefox的进程id: 然后通过 kill 3781 就可以关闭进程了. 补充: kill -9 来强制终止退出, 例…

16.一篇文章学会django模型的使用

1.django模型简单示例 1.1 创建django项目 创建完项目&#xff0c;还需要创建django子项目 django-admin startproject model_study cd .\model_study\ python manage.py startapp model_app1.2配置应用 将模型对应的应用程序&#xff08;刚刚创建的子应用&#xff09;添加…

CentOS 7 Jenkins配置及SpringBoot项目自动部署

1.下载Jenkins 下载地址:War Jenkins Packages 运行Jenkins之前确保系统已经安装好JDK&#xff0c;因为我安装的是JDK1.8,所以选择2.346.1 这个版本 2.启动jenkins 将下载好的jenkins.war上传到服务器上,我的目录是/home/jenkins 启动命令 java -jar jenkins.war --httpPo…

万字详文:TCP 拥塞控制详解

本文主要介绍 TCP 拥塞控制算法&#xff0c;内容多来自网上各个大佬的博客及《TCP/IP 详解》一书&#xff0c;在此基础上进行梳理总结&#xff0c;与大家分享。因水平有限&#xff0c;内容多有不足之处&#xff0c; 敬请谅解。一、TCP 首部格式 在了解 TCP 的拥塞控制之前&…

多向思考者--高敏感人群的内心世界

工作以后很少看心理学的书&#xff0c;因为心理学书给我的印象是&#xff1a;国外翻译的很啰嗦&#xff0c;国内的太鸡汤&#xff0c;看的时候能有感触&#xff0c;看完以后就都忘记了。阅读心理学的书籍&#xff0c;更多的是跟着书中的内容和自己对话。看完《多向思考者》这本…

SpringMVC使用(二)

1. 统一异常处理 SpringMVC提供了统一处理Controller层抛出的异常的方法 1.1 统一异常处理案例 RestController的统一异常处理 package com.lan.controller;import com.lan.exception.BusinessException; import com.lan.exception.SystemException; import org.springfram…