Digital-Currency-and-Blockchain-Lab-2
实验目的
1、实现数字签名算法。
2、实现加密算法。
实验器材
1、编译器:Vscode
2、操作系统:windows10
3、编程语言:Python 3.10.11
4、库:ecc-pycrypto
实验原理
本次实验基于 Python 以及 ecc-pycrypto 库来实现。其中我们将使用
ecc-pycrypto 库中的 P256 椭圆曲线的一个简单实现。
数字签名算法
问题1
在TrapGen函数中,首先生成两个大素数p和q,然后计算的逆。在Eval函数中,首先计算n,然后返回y。在Invert函数中,首先计算x=,然后返回。在函数中,首先判断n是否小于等于1或者是否为偶数且大于2,如果是则返回False,否则判断是否能被2到sqrt(n)之间的奇数整除,如果能则返回False,否则返回True。在generate_large_prime函数中,首先生成一个10**5到10**6之间的随机数,然后判断是否为素数,如果是则返回p。在main函数中,首先调用generate_large_prime函数生成两个大素数和,然后计算,然后调用TrapGen函数生成陷门,然后调用Eval函数计算单向函数输出,然后调用Invert函数计算信息,最后判断信息是否等于单向函数输出。
1 | import random |
问题2
在createMatrix函数中,首先生成一个rows*cols的矩阵,然后将矩阵中的每个元素都设置为0到2**15-1之间的随机数,最后返回矩阵。在BitInvert函数中,首先遍历0到q之间的每个数x,然后判断是否等于,如果是则返回,否则返回0。在Eval函数中,首先计算,然后遍历0到n之间的每个数i,然后计算,最后返回y和。在TrapGen函数中,首先计算的逆,然后返回。在Invert函数中,首先计算,然后遍历0到n之间的每个数,然后遍历0到之间的每个数,然后计算,最后返回和。
1 | import sympy |
问题3
问题3在问题2代码的基础上,增加了签名和验证的功能。签名时首先调用 Eval函数计算单向函数输出,然后调用 TrapGen函数生成陷门,最后返回单向函数输出。验证时首先调用 TrapGen函数生成陷门,然后调用 Invert函数计算信息,最后判断信息是否等于单向函数输出。
1 | import Q2 |
加密算法
问题4
在KGen函数中,首先生成一个随机数k,然后计算,。在Enc函数中,首先计算,然后计算,最后返回和。在Dec函数中,首先计算的逆,然后计算,最后返回m。
1 | from ecc.key import gen_keypair |
问题5
在Prove函数中,首先生成一个随机数k,然后计算,,,最后返回。在Verif函数中,首先判断是否等于,然后判断是否等于,如果两个条件都满足,则返回True,否则返回False。
1 | from ecc.curve import P256 |