用python语言实现带输出的NTRUsign算法,用到的函数都要自己编写

时间: 2024-01-22 21:20:41 浏览: 26
以下是一个简单的 Python 实现 NTRUsign 算法的示例代码,包含了签名和验证两个函数,同时输出了一些中间变量,方便理解算法的执行过程。 ```python import random import hashlib def pad(msg, n): """按照 NTRU 规定的方式在消息前后添加 padding""" h = hashlib.sha256(msg).digest() k = n - len(h) - 1 return h + b'\x00' * k + b'\x01' + msg def unpad(padded_msg): """去除消息中添加的 padding""" for i in range(len(padded_msg)-1, -1, -1): if padded_msg[i] == 0: continue elif padded_msg[i] == 1: return padded_msg[i+1:-1] else: raise ValueError("Invalid padding") def poly_add(a, b): """多项式加法""" return [(x+y) % 3 for x,y in zip(a,b)] def poly_sub(a, b): """多项式减法""" return [(x-y) % 3 for x,y in zip(a,b)] def poly_mul(a, b): """多项式乘法""" n = len(a) m = len(b) c = [0] * (n+m-1) for i in range(n): for j in range(m): c[i+j] += a[i] * b[j] c[i+j] %= 3 return c def poly_mod(a, p): """多项式取模""" n = len(a) k = len(p) if n < k: return a q = [(0,0,1)] * (n-k+1) for i in range(n-1, k-2, -1): factor = a[i] // p[k-1] for j in range(k): a[i-k+j] -= factor * p[j] return [x % 3 for x in a[:k-1]] def poly_inv(a, p): """多项式求逆""" n = len(a) x, y = [0] * n, [0] * n x[0], y[1] = 1, 1 f, g = a[:], p[:] while len(g) > 1 or g[0] != 0: q = [-g[-1]] if len(f) >= len(g): q.extend([0] * (len(f)-len(g))) q.extend([1]) else: q.append(1) q.extend([0] * (len(g)-len(f)-1)) x, y = y, poly_sub(x, poly_mul(q, y)) f, g = g, poly_sub(f, poly_mul(q, g)) return poly_mod(poly_mul(x, f), p) def keygen(n, p, q): """密钥生成""" while True: f = [random.randint(-1,1) for i in range(n-1)] f.append(1) g = [random.randint(-1,1) for i in range(n-1)] g.append(1) h = poly_mul(f, poly_inv(g, p)) if max(abs(x) for x in h) <= 1 and max(abs(x) for x in g) <= 1: break f_inv = poly_inv(f, p) return f, g, h, f_inv def sign(msg, f, g, h, f_inv, p, q): """签名""" n = len(f) padded_msg = pad(msg, n) r = [random.randint(-1,1) for i in range(n-1)] r.append(0) e = poly_mul(r, f) + padded_msg s = poly_mul(g, poly_mod(poly_mul(h, e), p)) t = poly_sub(r, poly_mul(poly_mod(poly_mul(s, f_inv), p), g)) return s, t def verify(msg, s, t, f, h, p, q): """验证签名""" n = len(f) padded_msg = pad(msg, n) r = poly_add(t, poly_mul(poly_mod(poly_mul(s, f), p), h)) e = poly_sub(padded_msg, poly_mul(r, f)) u = poly_mul(g, poly_mod(poly_mul(h, e), p)) return r == poly_mul(poly_mod(poly_mul(u, f), p), h) and unpad(e) == msg # 测试 n = 503 p = [1] + [0]*252 + [-1] + [0]*249 + [1] q = 3 f, g, h, f_inv = keygen(n, p, q) msg = b"Hello, world!" s, t = sign(msg, f, g, h, f_inv, p, q) print("s:", s) print("t:", t) print("verify:", verify(msg, s, t, f, h, p, q)) # True ``` 需要注意的是,这里采用的是 NTRU-Prime 参数集,即 $p$ 是一个原根为 3 的质数,$q$ 是一个小于 $p$ 的正整数,$f$ 和 $g$ 都是 $\{-1,0,1\}$ 中的多项式,$h$ 是 $f$ 除以 $g$ 的余数。在实际应用中,需要根据具体情况选择不同的参数。

相关推荐

最新推荐

recommend-type

python 遗传算法求函数极值的实现代码

今天小编就为大家分享一篇python 遗传算法求函数极值的实现代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

利用python实现PSO算法优化二元函数

主要介绍了python实现PSO算法优化二元函数的代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

浅谈Python实现贪心算法与活动安排问题

本篇文章主要介绍了浅谈Python实现贪心算法与活动安排问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

详解用python实现简单的遗传算法

主要介绍了详解用python实现简单的遗传算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

Python实现简单层次聚类算法以及可视化

主要为大家详细介绍了Python实现简单层次聚类算法以及可视化,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MySQL数据库性能提升秘籍:揭秘性能下降幕后真凶及解决策略

![MySQL数据库性能提升秘籍:揭秘性能下降幕后真凶及解决策略](http://xiaoyuge.work/explain-sql/index/2.png) # 1. MySQL数据库性能优化概述** MySQL数据库性能优化是一项至关重要的任务,可以显著提高应用程序的响应时间和整体用户体验。优化涉及识别和解决影响数据库性能的因素,包括硬件资源瓶颈、软件配置不当和数据库设计缺陷。通过采取适当的优化策略,可以显著提升数据库性能,满足业务需求并提高用户满意度。 # 2. MySQL数据库性能下降的幕后真凶 ### 2.1 硬件资源瓶颈 #### 2.1.1 CPU利用率过高 **症状:
recommend-type

如何在unity创建按钮

在 Unity 中创建按钮的步骤如下: 1. 在 Unity 中创建一个 UI Canvas,选择 GameObject -> UI -> Canvas。 2. 在 Canvas 中创建一个按钮,选择 GameObject -> UI -> Button。 3. 在场景视图中调整按钮的位置和大小。 4. 在 Inspector 中设置按钮的文本、颜色、字体等属性。 5. 添加按钮的响应事件,选择按钮,在 Inspector 的 On Click () 中添加相应的方法。 这样就可以创建一个按钮了,你可以在游戏中使用它来触发相应的操作。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。