个人网站主页建设教程,wordpress  子菜单,网站建设柒首先金手指8,手机网站seo优化ECC加密 .全称#xff1a;椭圆曲线加密#xff08;Elliptic Curve Cryptography#xff09;#xff0c;ECC加密算法是一种公钥加密技术#xff0c;以椭圆曲线理论为基础。利用有限域上椭圆曲线的点构成的Abel群离散对数难解性#xff0c;实现加密、解密和数字签名。将椭圆…ECC加密 .全称椭圆曲线加密Elliptic Curve CryptographyECC加密算法是一种公钥加密技术以椭圆曲线理论为基础。利用有限域上椭圆曲线的点构成的Abel群离散对数难解性实现加密、解密和数字签名。将椭圆曲线中的加法运算与离散对数中的模乘运算相对应就可以建立基于椭圆曲线的对应密码体制。 # -*- coding:utf-8 *-# description: ECC椭圆曲线加密算法实现考虑KkG 其中K、G为椭圆曲线Ep(a,b)上的点n为G的阶nGO∞ k为小于n的整数。则给定k和G根据加法法则计算K很容易但反过来给定K和G求k就非常困难。因为实际使用中的ECC原则上把p取得相当大n也相当大要把n个解点逐一算出来列成上表是不可能的。这就是椭圆曲线加密算法的数学依据点G称为基点base pointkkn为私有密钥privte keyK为公开密钥public key)
def get_inverse(mu, p):获取y的负元for i in range(1, p):if (i*mu)%p  1:return ireturn -1def get_gcd(zi, mu):获取最大公约数if mu:return get_gcd(mu, zi%mu)else:return zidef get_np(x1, y1, x2, y2, a, p):获取n*p每次p直到求解阶数np-pflag  1  # 定义符号位/-# 如果 pq  k(3x2a)/2y1mod pif x1  x2 and y1  y2:zi  3 * (x1 ** 2)  a  # 计算分子      【求导】mu  2 * y1    # 计算分母# 若P≠Q则k(y2-y1)/(x2-x1) mod pelse:zi  y2 - y1mu  x2 - x1if zi* mu  0:flag  0        # 符号0为-负数zi  abs(zi)mu  abs(mu)# 将分子和分母化为最简gcd_value  get_gcd(zi, mu)     # 最大公約數zi  zi // gcd_value            # 整除mu  mu // gcd_value# 求分母的逆元  逆元 ∀a ∈G ョb∈G 使得 ab  ba  e# P(x,y)的负元是 (x,-y mod p) (x,p-y) 有P(-P) O∞inverse_value  get_inverse(mu, p)k  (zi * inverse_value)if flag  0:                   # 斜率负数 flag0k  -kk  k % p# 计算x3,y3 PQx3≡k2-x1-x2(mod p)y3≡k(x1-x3)-y1(mod p)x3  (k ** 2 - x1 - x2) % py3  (k * (x1 - x3) - y1) % preturn x3,y3def get_rank(x0, y0, a, b, p):获取椭圆曲线的阶x1  x0             #-p的x坐标y1  (-1*y0)%p      #-p的y坐标tempX  x0tempY  y0n  1while True:n  1# 求pq的和得到n*p直到求出阶p_x,p_y  get_np(tempX, tempY, x0, y0, a, p)# 如果  -p,那么阶数1返回if p_x  x1 and p_y  y1:return n1tempX  p_xtempY  p_ydef get_param(x0, a, b, p):计算p与-py0  -1for i in range(p):# 满足取模约束条件椭圆曲线Ep(a,b)p为质数x,y∈[0,p-1]if i**2%p  (x0**3  a*x0  b)%p:y0  ibreak# 如果y0没有返回falseif y0  -1:return False# 计算-y负数取模x1  x0y1  (-1*y0) % preturn x0,y0,x1,y1def get_graph(a, b, p):输出椭圆曲线散点图x_y  []# 初始化二维数组for i in range(p):x_y.append([- for i in range(p)])for i in range(p):val get_param(i, a, b, p)  # 椭圆曲线上的点if(val ! False):x0,y0,x1,y1  valx_y[x0][y0]  1x_y[x1][y1]  1print(椭圆曲线的散列图为)for i in range(p):              # i 0- p-1temp  p-1-i        # 倒序# 格式化输出1/2位数y坐标轴if temp  10:print(temp, end )else:print(temp, end  )# 输出具体坐标的值一行for j in range(p):print(x_y[j][temp], end  )print()   #换行# 输出 x 坐标轴print(  , end)for i in range(p):if i 10:print(i, end )else:print(i, end  )print(\n)def get_ng(G_x, G_y, key, a, p):计算nGtemp_x  G_xtemp_y  G_ywhile key ! 1:temp_x,temp_y  get_np(temp_x,temp_y, G_x, G_y, a, p)key - 1return temp_x,temp_ydef ecc_main():while True:a  int(input(请输入椭圆曲线参数a(a0)的值))b  int(input(请输入椭圆曲线参数b(b0)的值))p  int(input(请输入椭圆曲线参数p(p为素数)的值))   #用作模运算# 条件满足判断if (4*(a**3)27*(b**2))%p  0:print(您输入的参数有误请重新输入\n)else:break# 输出椭圆曲线散点图get_graph(a, b, p)# 选点作为G点print(user1在如上坐标系中选一个值为G的坐标)G_x  int(input(user1请输入选取的x坐标值))G_y  int(input(user1请输入选取的y坐标值))# 获取椭圆曲线的阶n  get_rank(G_x, G_y, a, b, p)# user1生成私钥小keykey  int(input(user1请输入私钥小key{}.format(n)))# user1生成公钥大KEYKEY_x,kEY_y  get_ng(G_x, G_y, key, a, p)# user2阶段# user2拿到user1的公钥KEYEp(a,b)阶n加密需要加密的明文数据# 加密准备k  int(input(user2请输入一个整数k{}用于求kG和kQ.format(n)))k_G_x,k_G_y  get_ng(G_x, G_y, k, a, p)                         # kGk_Q_x,k_Q_y  get_ng(KEY_x, kEY_y, k, a, p)                     # kQ# 加密plain_text  input(user2请输入需要加密的字符串:)plain_text  plain_text.strip()#plain_text  int(input(user1请输入需要加密的密文))c  []print(密文为,end)for char in plain_text:intchar  ord(char)cipher_text  intchar*k_Q_xc.append([k_G_x, k_G_y, cipher_text])print(({},{}),{}.format(k_G_x, k_G_y, cipher_text),end-)# user1阶段# 拿到user2加密的数据进行解密# 知道 k_G_x,k_G_ykey情况下求解k_Q_x,k_Q_y是容易的然后plain_text  cipher_text/k_Q_xprint(\nuser1解密得到明文,end)for charArr in c:decrypto_text_x,decrypto_text_y  get_ng(charArr[0], charArr[1], key, a, p)print(chr(charArr[2]//decrypto_text_x),end)if __name__  __main__:print(*************ECC椭圆曲线加密*************)ecc_main()