密码学作业心得

前言

不多bb,直接上图
在这里插入图片描述
在这里插入图片描述

RSA加密库实现

有一说一,这个题目刚拿到手被吓到了,作为咸鱼的我慌得很
在这里插入图片描述)
正好前几节课大佬正好讲了pycryptodoom这个库,赶紧看看
在这里插入图片描述
导入库之后漫长的读代码时间,不要误会,不是读这个库,是读大佬写好的代码,因为不需要签名,我主要读了这三个函数

def generate_key(bits):
return RSA.generate(bits)
def encrypt(message, pk, hasher=Hash.SHA1):
    cipher_obj = cipher.new(RSA.importKey(pk))
    org_bytes = message.encode()
    length_en = RSA.RsaKey.size_in_bytes(RSA.importKey(pk)) - 2 * hasher.digest_size - 2 

    res_en = b''
    for i in range(0, len(org_bytes), length_en):
        res_en += cipher_obj.encrypt(org_bytes[i: i + length_en])
    cipher_text = res_en
    return cipher_text


def decrypt(cipher_text, sk):
    cipher_obj = cipher.new(RSA.importKey(sk))
    length_de = RSA.RsaKey.size_in_bytes(RSA.importKey(sk))

    res_de = b''
    for i in range(0, len(cipher_text), length_de):
        #res_de += cipher_obj.decrypt(cipher_text[i:i + length_de], 'DecryptError') # for pkcs
        res_de += cipher_obj.decrypt(cipher_text[i:i + length_de])  # for oaep
    plaint_text = res_de.decode()
return plaint_text

运行时先创建公私钥,然后调用加密解密函数就可以了,这是RSA库的功能。没啥可说的,先读库的说明,里边有举例(主要大佬例子明显),懂得都懂

自己实现的RSA加密

RSA算法大家都懂,基本计算机上过带学的都知道

参数参数说明
公钥n,en=p*q,e和(p-1)(q-1)互质
私钥n,dd·e=1mod[(p-1)(q-1))]
加密C,M,e C = M e m o d ( n ) C=M^emod(n) C=Memod(n)
解密M,C,d M = C d m o d ( n ) M=C^dmod(n) M=Cdmod(n)

看起来很简单吧,感觉主要简单数论知识就明白了原理,我开始也是这么想的,实现起来被RSA狠狠暴打一顿,RSA算法实现的几个重要的点:

  1. 产生两个随机的质数p,q,要是不查表只能手搓了
  2. E和乘积互质,听起来简单吧,算起来也挺要命
  3. 求d,其实是在求e的逆,多亏刚考了数论,还能hold住
  4. 在加密时 M e M^e Me时 模指数运算问题,正常算太慢

这次是真的学到了,每次考试的小素数分解式多么简单,这些问题属实要命,没招,只能回炉重造(百度),找到了一些解决方法

  1. 产生随机质数的方法:米勒罗宾算法,
    这算法的原理如下:
    (1).若p是素数,则 a 2 m o d p = 1 a^2mod p=1 a2modp=1当且仅当 a m o d p = 1 或 a m o d p = − 1 amodp=1或a mod p=-1 amodp=1amodp=1成立;
    (2).若p是素数,有 p − 1 = 2 k q , p-1=2^kq, p1=2kq,设a为整数且1<a<p-1,则 a q m o d p = 1 a^qmodp=1 aqmodp=1即费马小定理
    证明如下:
    在这里插入图片描述
    代码实现:

    def montgomery(a, q, k, n):
    if quick_power_mod(a, q, n) == 1:
    	return False
    else:
    	for i in range(0, k):
    		if quick_power_mod(a, 2 ** i * q, n) == n - 1:
    			return False
    return True
    

    2.e和乘积互质解决方法:判断最大公因数是不是1,用欧几里得算法,不多说了上代码;

    def GCD(a, b):
    while b != 0:
    	temp = b
    	b = a % b
    	a = temp
    return a
    

    3.求逆,用扩展欧几里得算法,也不多说了上代码;

    def exgcd(e, phi_n):
    a = phi_n
    b = e
    x0, y0 = 1, 0
    x1, y1 = 0, 1
    x, y = 0, 1
    r = a % b
    q = (a - r) // b
    while r != 0:
    	x = x0 - q * x1
    	y = y0 - q * y1
    	x0, y0 = x1, y1
    	x1, y1 = x, y
    	a = b
    	b = r
    	r = a % b
    	q = (a - r) // b
    return y
    

    4.快速求模指数,利用模除的性质,代码如下

    def quick_power_mod(alpha, plpha, nlpha):
    b = alpha
    p = plpha
    n = nlpha
    a = 1
    b = b % n
    while(p):
    	if p & 1 == 1:
    		a = a * b % n
    	p = p >> 1
    	a = a
    	b = (b * b) % n
    return a
    

除此之外别的就好说了 剩下的关键代码如下:

def RSA_Encrypt(string, e, n):
	bit = 0
	tempn = n
	while tempn > 0:
		bit += 1
		tempn = tempn >> 1
	s = random.randint(2, bit - 1)
	string = string.encode('utf-8')
	bit64 = _bytes_2_64bit_(string)
	P = _64bit_2_sbit(bit64, s)
	C = []
	for i in range(len(P)):
		tempC = quick_power_mod(P[i], e, n)
		C.append(tempC)
	return C,s

def RSA_Decrypt(C, d, n,s):
	P = []
	for i in range(len(C)):
		tempP = quick_power_mod(C[i], d, n)
		P.append(tempP)
	P = _sbit_2_64bit(P, s)
	P = _64bit_2_bytes(P)
	return P.decode('utf-8')

至此RSA两大块完成

LFSR反馈多项式库+自己实现

要求前边已经提过,这部分实现起来原理很简单,但过程很困难,主要难点在类型转换,比如np数组和list;2,10,16进制和字符串等格式转换等;还有个问题是pythonClass的使用,在实体化一个class的时候,我的参数有一个无法调用,最终被迫使用函数完成(代码行数少了,但写的很难看).
有个小技巧,在字符串不好调用时可以输出,输出再读取,可能有奇效,也可能是我会改格式,哈哈
不多说了,上代码:

def LFSR_self_fankui(state,seq):
    fpoly1 = [13, 12, 6, 5, 4, 3]
    b = np.logical_xor(state[fpoly1[0] - 1], state[fpoly1[1] - 1])  # 异或最后一位和第一位
    if len(fpoly1) > 2:
        for i in range(2, len(fpoly1)):
            b = np.logical_xor(state[fpoly1[i] - 1], b)  # 反馈多项式启动
    state = np.roll(state, 1)  # 沿着给定轴滚动数组元素。超出最后位置的元素将会滚动到第一个位置。
    state[0] = b * 1  # 反馈位填入第一位        # if self.verbose:  # 输出每轮的值
    if seq.size==0:
        seq = state[1]
        seq = np.append(seq, state[4])
        seq = np.append(seq, state[8])
        seq = np.append(seq, state[7])
        seq = np.append(seq, state[17])
        seq = np.append(seq, state[99])
        seq = np.append(seq, state[137])
        seq = np.append(seq, state[221])
    else:
        seq = np.append(seq, state[1])
        seq = np.append(seq, state[4])
        seq = np.append(seq, state[8])
        seq = np.append(seq, state[7])
        seq = np.append(seq, state[17])
        seq = np.append(seq, state[99])
        seq = np.append(seq, state[137])
        seq = np.append(seq, state[221]) # 过滤密钥流
	return (state,seq)
	
def LFSR_self():
    state_1 = np.array(sha_1)
    state1 = state_1.astype(int)
    state_2 = np.array(sha_1)
    state2 = state_2.astype(int)
    state_3 = np.array(sha_1)
    state3 = state_3.astype(int)
    state_4 = np.array(sha_1)
    state4 = state_4.astype(int)
    # 初始化4个LFSR verbose 控制是否显示每轮结果,测试时改为true
    seq=np.zeros(1)
    # L1首先进行一轮操作
    state1,seq=LFSR_self_fankui(state1,seq)  # 过滤的密钥值放入总的密钥流中
    for i in range(255):  # 轮换执行n-1次
        state2,seq=LFSR_self_fankui(state2,seq)
        state2[0] = state2[0] ^ state1[0]

        state3, seq = LFSR_self_fankui(state3, seq)
        state3[0] = state3[0] ^ state2[0]

        state4,seq=LFSR_self_fankui(state4,seq)
        state4[0] = state4[0] ^ state3[0]

        state1,seq=LFSR_self_fankui(state1,seq)
        state1[0] = state1[0] ^ state4[0]

    state2, seq = LFSR_self_fankui(state2, seq)
    state2[0] = state2[0] ^ state1[0]

    state3, seq = LFSR_self_fankui(state3, seq)
    state3[0] = state3[0] ^ state2[0]

    state4, seq = LFSR_self_fankui(state4, seq)
    state4[0] = state4[0] ^ state3[0]

    hex_num = hex_change(seq)  # 将产生的二进制密钥流转为16进制字符
    text_save("seq_self.txt", hex_num)  # 保存生成的密钥流字符串到文件中

    q = open("seq_self.txt", "rb")
    seq = q.read(1024)
    q.close()

    mingwen = "mingwen.txt"
    miwen = "jiami_self.txt"
    jiemip = "jiemi_self.txt"
    jiami(mingwen, miwen, seq)
    jiemi(miwen, jiemip, seq)

基本就这了,学到了很多,学哭了都.
最后附上一张友情赞助的可爱小图:
在这里插入图片描述

我感觉蛮不错的,很喜欢这种黑白画风,大家品一品,欢迎留言

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Hitsz现代密码作业主要包括以下几个方面的内容。首先,作业会涉及对于对称加密算法和公钥加密算法的理解和应用。对于对称加密算法,作业可能会要求我们理解其工作原理和常用的对称加密算法,如AES、DES等,并能够进行加密和解密的实践操作。同时,还可能需要我们能够了解对称加密算法的优缺点和安全性。 其次,作业可能会要求我们习和理解公钥加密算法的原理与应用。作业可能会要求我们习RSA算法,理解其加密和解密的过程,并能够实践操作。同时,我们还需要了解公钥加密算法的安全性和应用场景,以及与对称加密算法的比较。 此外,作业可能会要求我们习和应用密码中的哈希函数和消息认证码。我们需要习哈希函数的原理和常用的哈希算法,如MD5、SHA-1等,并能够进行哈希函数的实践运用。同时,我们还需要了解消息认证码的概念和应用,以及其在保障数据完整性和身份认证方面的作用。 最后,作业还可能会要求我们习和理解密码中的数字签名和密钥交换协议。我们需要了解数字签名的原理和应用,以及其在保证消息的真实性和不可抵赖性方面的作用。同时,我们还需要习密钥交换协议的原理和常见的协议,如Diffie-Hellman密钥交换协议等,并能够进行实践操作。 综上所述,Hitsz现代密码作业涉及对对称加密算法、公钥加密算法、哈希函数、消息认证码、数字签名以及密钥交换协议的习和应用。我们需要理解它们的原理与应用场景,并能够进行实践操作。这些作业将帮助我们全面了解和掌握现代密码的基本概念和技术,为今后的密码研究和应用奠定基础。 ### 回答2: hitsz现代密码作业是哈尔滨信息科技大计算机院中的一门课程作业。该课程主要介绍现代密码的基本理论和应用,通过习和掌握密码的基本概念、加密算法和安全协议等,培养生在信息安全领域的专业知识和能力。 在这门作业中,生需要完成一系列与现代密码相关的任务。这些任务可能包括选择适当的加密算法来实现安全的数据传输、设计密码方案来保护敏感数据的机密性、进行密码攻击与防御的实验等。生需要运用所的知识和技能,结合实际情境和问题,提出解决方案并完成相应的实验和报告。 通过这门作业生可以加深对现代密码基本原理的理解,提高密码算法的设计和应用能力。同时,这门作业也能帮助生培养解决实际安全问题的思维和能力,增强对信息安全的认识和重视程度。 总之,hitsz现代密码作业是一门具有实践性和综合性的课程作业,通过完成这些作业任务,生将能够在实际应用中熟练运用密码的知识和技术,为信息安全提供有效的保护。 ### 回答3: HITSZ现代密码作业涉及到现代密码领域的一些基本概念和技术。在作业中,我们需要掌握对称加密算法和公钥密码的基本原理和应用。对称加密算法包括DES、AES等,公钥密码包括RSA、椭圆曲线密码等。作业内容主要包括以下几个方面: 1. 对称加密算法的原理和应用:需要了解DES和AES算法的工作原理,以及它们在实际应用中的使用场景和安全性评估。 2. 公钥密码的基本原理和应用:需要掌握RSA算法的原理,了解数字签名、密钥交换和身份认证等应用。同时,需要理解椭圆曲线密码的基本概念和应用场景。 3. 密码中的安全性分析:需要了解密码中的攻击模型和常见的攻击手段,如密码分析、密钥泄露等。同时,需要密码的安全性分析方法,如信息论和计算复杂性理论。 4. 实际应用案例研究:通过习现代密码的实际应用案例,如SSL/TLS安全协议,可理解密码在互联网传输安全中的重要性和应用场景。 在完成作业的过程中,我们可以通过查阅相关教材、参考文献以及互联网上的术资源来加深理解和掌握这些知识。同时,还可以尝试编写一些简单的代码实现,如DES算法的加解密过程,以提升对密码算法的认识。 总之,HITSZ现代密码作业要求我们深入了解现代密码的基本知识和技术,以及其在实际应用中的运用。通过完成作业,我们可以加深对密码的理解,并将其应用于实际场景中,提高信息安全的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Enginer静态力

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

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

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

打赏作者

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

抵扣说明:

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

余额充值