- 云计算作业之加密算法(哈希,AES,RSA)
- 问题一
- 代码
- 结果
- 问题二
- 代码
- 结果
- 问题三
- 生成秘钥与公钥
- 代码
- 结果
- 加密与解密
- 代码
- 结果
问题:
随机生成一组长度分别为1、16、255字节的数据d1、d16、d255,任选一种编程语言和环境(java、.net、python等)
(1)计算数据的哈希(SHA-Il、MD5等)值,观察它们的特征;
(2)生成AES密钥,计算数据的加密结果,观察它们的特征;
(3)生成RSA密钥对,计算数据的加密结果、签名结果,观察它们的特征。
from random import randint
import hashlib
def random_data(lens):
ans = ''
for i in range(lens):
ans += chr(randint(33,125))
return ans
if __name__ == '__main__':
lens_list = [1,16,255]
for i in lens_list:
data = random_data(i)
data_bit = data.encode(encoding='utf-8') #加密或者哈希算法需要原始数据为bytes的类型
data_md5 = hashlib.md5(data_bit).hexdigest()
data_sha1 = hashlib.sha1(data_bit).hexdigest()
data_sha256 = hashlib.sha256(data_bit).hexdigest()
print("********************************************")
print(f">随机生成长度为{i}字节的数据,如下:")
print(data)
print(">md5哈希算法后结果如下:")
print(data_md5)
print(">sh1哈希算法后结果如下:")
print(data_sha1)
print(">sh256哈希算法后结果如下:")
print(data_sha256)
结果
问题二
代码
from random import randint
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
def random_data(lens):
ans = ''
for i in range(lens):
ans += chr(randint(33,125))
return ans
# 明文必须为16字节或者16字节的倍数的字节型数据,如果不够16字节需要进行补全,关于补全规则,后面会在补全模式中具体介绍。
def pad_s (s):
if len(s) == 16:
return s
elif len(s) == 1:
return pad(s,16)
elif len(s) == 255:
return pad(s,256)
# 从补全中找到原始数据
def unpad_s(s,num):
if num == 1:
return unpad(s,16)
elif num == 16:
return s
elif num == 255:
return unpad(s,256)
if __name__ == '__main__':
lens_list = [1,16,255]
for i in lens_list:
data = random_data(i)
data_bit = data.encode(encoding='utf-8') #加密或者哈希算法需要原始数据为bytes的类型
print("********************************************")
print(f">随机生成长度为{i}字节的数据,如下:")
print(data_bit)
print(">补全为16个字节的整数倍后的数据为:")
data_bit = pad_s(data_bit) # 明文必须为16字节或者16字节的倍数的字节型数据,如果不够16字节需要进行补全,关于补全规则,后面会在补全模式中具体介绍。
print(data_bit)
password = b"1907310308liyany" #秘钥 ,要求为bytes类型 秘钥必须为16字节或者16字节的倍数的字节型数据。
aes = AES.new(password,AES.MODE_ECB) #创建一个aes对象 采用ECB加密模式
en_data = aes.encrypt(data_bit)
print(">加密后的密文为:")
print(en_data)
de_data = aes.decrypt(en_data)
de_data = unpad_s(de_data,i)
print(">解密后的结果为")
print(de_data)
结果
问题三
生成秘钥与公钥
代码
from Crypto import Random
from Crypto.PublicKey import RSA
# 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成实例
rsa = RSA.generate(3072, random_generator) #由于实验的数据有长为255个字节的例子,为了满足所有的例子,这里用3072
# 私钥的生成
private_pem = rsa.exportKey()
with open("private.pem", "wb") as f:
f.write(private_pem)
# 公钥的生成
public_pem = rsa.publickey().exportKey()
with open("public.pem", "wb") as f:
f.write(public_pem)
结果
加密与解密
代码
from Crypto import Random
from Crypto.PublicKey import RSA
# 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成实例
rsa = RSA.generate(3072, random_generator) #由于实验的数据有长为255个字节的例子,为了满足所有的例子,这里用3072
# 私钥的生成
private_pem = rsa.exportKey()
with open("private.pem", "wb") as f:
f.write(private_pem)
# 公钥的生成
public_pem = rsa.publickey().exportKey()
with open("public.pem", "wb") as f:
f.write(public_pem)
结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)