云计算作业之加密算法(哈希,AES,RSA)

云计算作业之加密算法(哈希,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)

结果

image-20220422131601641

问题二

代码

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)

结果

image-20220423190216881

问题三

生成秘钥与公钥

代码

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)

结果

image-20220422142207176image-20220422142214925

加密与解密

代码
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64
from random import randint

def random_data(lens):
    ans = ''
    for i in range(lens):
        ans += chr(randint(33, 125))
    return ans

lens_list = [1,16,255]
for i in lens_list:
    print("********************************************")
    print(f">随机生成长度为{i}字节的数据,如下:")
    message = random_data(i)
    print(message)
    ## 加密
    rsakey = RSA.importKey(open("public.pem").read())
    cipher = Cipher_pkcs1_v1_5.new(rsakey)  # 创建用于执行pkcs1_v1_5加密或解密的密码
    cipher_text = base64.b64encode(cipher.encrypt(message.encode('utf-8')))
    cipher_text = cipher_text.decode('utf-8')
    print(">加密结果为:",cipher_text)

    ## 解密
    encrypt_text = cipher_text.encode('utf-8')
    rsakey = RSA.importKey(open("private.pem").read())
    cipher = Cipher_pkcs1_v1_5.new(rsakey)  # 创建用于执行pkcs1_v1_5加密或解密的密码
    text = cipher.decrypt(base64.b64decode(encrypt_text), "解密失败")
    print(">解密结果为:",text.decode('utf-8'))
结果

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RockLis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值