云计算作业之加密算法

云计算作业之加密算法,第1张

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

问题二 代码
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)
结果

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/733966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存