📖 前言:本期我们将使用两个密码学常用工具来实现与分析前面所学的理论知识。
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
选项:打印出加密算法使用的加密密钥。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摘要算法
题目:使用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,这就是出现差错了。
题目:使用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
题目:使用Cryptool 2 中Playfair cipher模板进行加密,密钥词分别用
1) APPLE
2) CROWN
加密:Manners make the man.
自己动手写下两个5*5字母矩阵,对比模板中的Pre-formatted Text控件的内容,是否相同。
题目1:使用Cryptool 2 中one-time pad demo(一次一密)模块观察使用不同的密钥,也就是one-time pad 1,2,3,输出的结果的差异。
题目2:使用Cryptool 2 中 one -time pad misuage模板,运行,观察分析,数据A,B能够被破解的原因。
题目:使用Cryptool 2 中Transpotition模板,观察密钥为:ZEBRAS,明文为:Wir wurden entdeckt, flieh wenn du kannst,进行置换加密及解密的过程。
题目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选项默认系统会提示输入口令,并且确认,是需要人工操作的
题目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=
题目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
题目1:使用Diffie-Hellman key exchange模板观察Diffie-Hellman密钥交换过程,使用公用素数71,本元根7。并用自己语言简单描述其密钥交换过程。
题目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
题目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的使用”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟📌~
💫如果有错误❌,欢迎批评指正呀👀~让我们一起相互进步🚀
🎉如果觉得收获满满,可以点点赞👍支持一下哟~