写在前面:能来找gmpy2的使用肯定应该都知道它是干什么用的,有哪些功能,如果还不知道的,请出门找度娘先问一下,我这篇文章不适合你;要了解gmpy2更高深的用法的,请移步官方文档,这里我就简单介绍一下我用gmpy2实现的我的密码方案的一系列过程。
一、gmpy2安装
(安装好的大神请略过此节)
就安装而言,其实比较简单,优快云上有很好的解决方案,请自行查找,如果对于Linux不太熟的同学来说,还是老老实实的在Windows下做实验的比较好,至少不用去用那些麻烦的apt-get或是yum,反正我到现在还是用得不太溜。有精力的话还是试一下ubuntu下的使用,可以增长很多linux知识,也是不错的。
Windows下的话建议使用VSCode进行开发,我用的就是它。
Windows下有一个比较大的坑,大家都知道如果直接使用源代码是无法安装的,因为那些依赖包无法解决(gmp等),需要用到.whl文件的安装方式,但很多同学可能像我一样,一开始下载了最新版的python3.7或更高的版本,怎么安都安不上,提示错误。以 gmpy2-2.1.0a1-cp36-cp36m-win_amd64.whl为例,这个安装包只能安装在python3.6的环境下使用。
pip install 文件路径/gmpy2-2.1.0a1-cp36-cp36m-win_amd64.whl
二、gmpy2简介和学习感受
gmpy2的参考文件点这里
与gmpy2所基于的gmp大数库相比,gmpy2理解起来相对简单,这也跟python语言的特性有关,由gmpy2编写的代码更加简洁易读,对于懂技术但编程水平一般的人来说,再合适不过了。
本人是学信息安全的,本科时跟导师做毕业设计,实现BLS短签名,用的是pbc包,pbc用的好像是C或C++,首先,当时光是安装各种数据包(gmp,m4,pbc)就已经把我折磨坏了,当然,这也跟本人学艺不精有关。上研究生的时候,写论文都很少用到实验,现在想来,就是跟本科时的毕业设计留下的心理阴影有关。去年心血来潮,学了python,本来以为很难,但学了之后,也没有想像中的难,在实现我去年写的论文中的方案时,没有费多大力气就学会了。也跟当时的运气有关吧,在注册了github帐号后,无聊搜索研究生的一篇论文《基于Paillier公钥密码体制的签密方案》中涉及的Paillier方案时,搜索到了Paillier-gmpy2 [ 1 ] ^{[1]} [1],细看之后,这就是我想要的。
三、无证书签密方案实现
以周彦伟等人于2016年发表的论文《不使用双线性映射的无证书签密方案的安全性分析及改进》 [ 2 ] ^{[2]} [2]为例,来看一下如何使用gmpy2来进行密码方案的实现。
(一)方案介绍
1.系统建立阶段( S e t u p Setup Setup)
在系统初始化阶段,KGC进行如下操作:
1)输入安全参数 k k k,输出满足条件 q ∣ p − 1 q|p-1 q∣p−1的两个大素数 p p p和 q q q(在计算机学报官网上下载的此处有一错误,原文为 p ∣ q − 1 p|q-1 p∣q−1,不明白的请在此论文的文献中去看, p > q p>q p>q才是对的),取 g g g为群 Z p ∗ Z_p^* Zp∗中任意阶为 q q q的生成元;
2)定义抗碰撞的安全哈希函数: H 1 : { 0 , 1 } L 1 × Z p ∗ × Z p ∗ → Z q ∗ H_1:\{0,1\}^{L_1}\times Z_p^*\times Z_p^*\rightarrow Z_q^* H1:{
0,1}L1×Zp∗×Zp∗→Zq∗, H 2 : { 0 , 1 } L 1 × { 0 , 1 } L 2 × Z p ∗ → Z q ∗ H_2:\{0,1\}^{L_1}\times \{0,1\}^{L_2}\times Z_p^*\rightarrow Z_q^* H2:{
0,1}L1×{
0,1}L2×Zp∗→Zq∗, H 3 : Z p ∗ → : { 0 , 1 } L 2 + ∣ Z q ∗ ∣ H_3: Z_p^*\rightarrow :\{0,1\}^{L_2+|Z_q^*|} H3:Zp∗→:{
0,1}L2+∣Zq∗∣, H 2 : { 0 , 1 } L 1 × { 0 , 1 } L 2 × Z p ∗ × Z p ∗ → Z q ∗ H_2:\{0,1\}^{L_1}\times \{0,1\}^{L_2}\times Z_p^*\times Z_p^*\rightarrow Z_q^* H2:{
0,1}L1×{
0,1}L2×Zp∗×Zp∗→Zq∗,其中, L 1 L_1 L1为用户身份标识 I D ID ID的长度, L 2 L_2 L2为明文消息的长度, ∣ Z q ∗ ∣ |Z_q^*|