教学服务系统

 找回密码
 立即注册
搜索
查看: 580|回复: 5

信息计算2019级1班6号马璐

[复制链接]

7

主题

15

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2022-4-22 15:51:23 | 显示全部楼层 |阅读模式

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

15

帖子

71

积分

注册会员

Rank: 2

积分
71
 楼主| 发表于 2022-6-2 16:33:32 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

15

帖子

71

积分

注册会员

Rank: 2

积分
71
 楼主| 发表于 2022-6-2 16:34:11 | 显示全部楼层

RSA

本帖最后由 马璐 于 2022-6-2 16:43 编辑
  1. import math
  2. import random


  3. def mess2long(message):
  4.         return int(message,16)

  5. def long2mess(long_num):
  6.     long_mess = hex(long_num)[2:].replace("L","")
  7.     if len(long_mess) % 2 != 0: long_mess = '0' + long_mess
  8.     return long_mess

  9. def gcd(a, b):
  10.     if a > b: a, b = b, a
  11.     while b != 0:
  12.         a, b = b, a%b
  13.     return a

  14. def isPrime(n):

  15.     if n <= 1:
  16.         return False
  17.     for i in range(2, int(math.sqrt(n)) + 1):
  18.         if n % i== 0:
  19.             return False
  20.     return True

  21. def generate_key(key_len):

  22.     p = random_prime(key_len // 2)
  23.     q = random_prime(key_len // 2)
  24.     n  = p * q
  25.     ph_n = (p -1) * (q -1)
  26.     e = 65537
  27.     d = generate_d(ph_n, e)
  28.     return (n ,e, d)

  29. def random_prime(half_len):
  30.     while True:
  31.         n = random.randint(0, 1 << half_len)
  32.         if n % 2 != 0:
  33.             found = True
  34.             for i in range(0, 5):
  35.                 if prime_test(n) == False:
  36.                     found = False
  37.                     break
  38.             if found == True:
  39.                 return n

  40. def prime_test(n):
  41.         q = n - 1
  42.         k = 0
  43.         while q % 2 == 0:
  44.             k += 1
  45.             q = q // 2
  46.         a = random.randint(2, n - 2)
  47.         if fast_mod(a, q, n) == 1:
  48.             return True
  49.         for j in range(0, k):
  50.             if fast_mod(a, (2 ** j) * q, n) == n - 1:
  51.                 return True
  52.         return False

  53. def ext_gcd(a, b):
  54.     if b == 0:
  55.         return 1, 0, a
  56.     else:
  57.         x, y, q = ext_gcd(b, a % b)
  58.         x, y = y, (x - (a // b) * y)
  59.         return x, y, q


  60. def fast_mod(b, n, m):

  61.     ret = 1
  62.     tmp = b
  63.     while n:
  64.         if n & 0x1:
  65.             ret = ret * tmp % m
  66.         tmp = tmp * tmp % m
  67.         n >>= 1
  68.     return ret

  69. def generate_d(ph_n, e):
  70.     (x, y, r) = ext_gcd(ph_n, e)
  71.     if y < 0:
  72.         return y + ph_n  
  73.     return y

  74. if __name__ == '__main__':
  75.     message = input("input your message:\n")
  76.     mess_num = mess2long(message)
  77.     mess_num_length = len(str(mess_num))
  78.     (n, e, d) = generate_key(mess_num_length*15)
  79.     cipher = fast_mod(mess_num,e, n)
  80.     print("-----------------------------------------------------------------")
  81.     print("cipher:"+str(cipher))





  82. import math
  83. import random


  84. def mess2long(message):
  85.         return int(message,16)

  86. def long2mess(long_num):
  87.     long_mess = hex(long_num)[2:].replace("L","")
  88.     if len(long_mess) % 2 != 0: long_mess = '0' + long_mess
  89.     return long_mess

  90. def gcd(a, b):
  91.     if a > b: a, b = b, a
  92.     while b != 0:
  93.         a, b = b, a%b
  94.     return a

  95. def isPrime(n):

  96.     if n <= 1:
  97.         return False
  98.     for i in range(2, int(math.sqrt(n)) + 1):
  99.         if n % i== 0:
  100.             return False
  101.     return True

  102. def generate_key(key_len):

  103.     p = random_prime(key_len // 2)
  104.     q = random_prime(key_len // 2)
  105.     n  = p * q
  106.     ph_n = (p -1) * (q -1)
  107.     e = 65537
  108.     d = generate_d(ph_n, e)
  109.     return (n ,e, d)

  110. def random_prime(half_len):
  111.     while True:
  112.         n = random.randint(0, 1 << half_len)
  113.         if n % 2 != 0:
  114.             found = True
  115.             for i in range(0, 5):
  116.                 if prime_test(n) == False:
  117.                     found = False
  118.                     break
  119.             if found == True:
  120.                 return n

  121. def prime_test(n):
  122.         q = n - 1
  123.         k = 0
  124.         while q % 2 == 0:
  125.             k += 1
  126.             q = q // 2
  127.         a = random.randint(2, n - 2)
  128.         if fast_mod(a, q, n) == 1:
  129.             return True
  130.         for j in range(0, k):
  131.             if fast_mod(a, (2 ** j) * q, n) == n - 1:
  132.                 return True
  133.         return False

  134. def ext_gcd(a, b):
  135.     if b == 0:
  136.         return 1, 0, a
  137.     else:
  138.         x, y, q = ext_gcd(b, a % b)
  139.         x, y = y, (x - (a // b) * y)
  140.         return x, y, q


  141. def fast_mod(b, n, m):

  142.     ret = 1
  143.     tmp = b
  144.     while n:
  145.         if n & 0x1:
  146.             ret = ret * tmp % m
  147.         tmp = tmp * tmp % m
  148.         n >>= 1
  149.     return ret

  150. def generate_d(ph_n, e):
  151.     (x, y, r) = ext_gcd(ph_n, e)
  152.     if y < 0:
  153.         return y + ph_n  
  154.     return y

  155. if __name__ == '__main__':
  156.     message = input("input your message:\n")
  157.     mess_num = mess2long(message)
  158.     mess_num_length = len(str(mess_num))
  159.     (n, e, d) = generate_key(mess_num_length*15)
  160.     cipher = fast_mod(mess_num,e, n)
  161.     print("-----------------------------------------------------------------")
  162.     print("cipher:"+str(cipher))











复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

15

帖子

71

积分

注册会员

Rank: 2

积分
71
 楼主| 发表于 2022-6-2 16:38:19 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

15

帖子

71

积分

注册会员

Rank: 2

积分
71
 楼主| 发表于 2022-6-2 16:40:45 | 显示全部楼层

ECC

本帖最后由 马璐 于 2022-6-2 16:44 编辑

ECC加密原理: 1、用户A选定一条适合加密的椭圆曲线Ep(a,b)(如:y2=x3+ax+b),并取椭圆曲线上一点,作为基点G。
 2、用户A选择一个私有密钥k,并生成公开密钥K=kG。
 3、用户A将Ep(a,b)和点K,G传给用户B。
 4、用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M,并产生一个随机整数r(r<n)。
 5、用户B计算点C1=M+rK;C2=rG。
 6、用户B将C1、C2传给用户A。
 7、用户A接到信息后,计算C1-kC2,结果就是点M。因为
          C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M
   再对点M进行解码就可以得到明文。

  密码学中,描述一条Fp上的椭圆曲线,常用到六个参量: T=(p,a,b,G,n,h)。
  (p 、a 、b 用来确定一条椭圆曲线,G为基点,n为点G的阶,h 是椭圆曲线上所有点的个数m与n相除的整数部分)

  这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件:

  1、p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求;
  2、p≠n×h;
  3、pt≠1 (mod n),1≤t<20;
  4、4a3+27b2≠0 (mod p);
  5、n 为素数;
  6、h≤4;









回复

使用道具 举报

7

主题

15

帖子

71

积分

注册会员

Rank: 2

积分
71
 楼主| 发表于 2022-6-2 16:41:04 | 显示全部楼层

  1. def get_inverse(mu, p):
  2.     """
  3.     获取y的负元
  4.     """
  5.     for i in range(1, p):
  6.         if (i*mu)%p == 1:
  7.             return i
  8.     return -1

  9. def get_gcd(zi, mu):
  10.     """
  11.     获取最大公约数
  12.     """
  13.     if mu:
  14.         return get_gcd(mu, zi%mu)
  15.     else:
  16.         return zi

  17. def get_np(x1, y1, x2, y2, a, p):
  18.     """
  19.     获取n*p,每次+p,直到求解阶数np=-p
  20.     """
  21.     flag = 1  # 定义符号位(+/-)

  22.     # 如果 p=q  k=(3x2+a)/2y1mod p
  23.     if x1 == x2 and y1 == y2:
  24.         zi = 3 * (x1 ** 2) + a  # 计算分子      【求导】
  25.         mu = 2 * y1    # 计算分母

  26.     # 若P≠Q,则k=(y2-y1)/(x2-x1) mod p
  27.     else:
  28.         zi = y2 - y1
  29.         mu = x2 - x1
  30.         if zi* mu < 0:
  31.             flag = 0        # 符号0为-(负数)
  32.             zi = abs(zi)
  33.             mu = abs(mu)

  34.     # 将分子和分母化为最简
  35.     gcd_value = get_gcd(zi, mu)     # 最大公約數
  36.     zi = zi // gcd_value            # 整除
  37.     mu = mu // gcd_value
  38.     # 求分母的逆元  逆元: ∀a ∈G ,ョb∈G 使得 ab = ba = e
  39.     # P(x,y)的负元是 (x,-y mod p)= (x,p-y) ,有P+(-P)= O∞
  40.     inverse_value = get_inverse(mu, p)
  41.     k = (zi * inverse_value)

  42.     if flag == 0:                   # 斜率负数 flag==0
  43.         k = -k
  44.     k = k % p
  45.     # 计算x3,y3 P+Q
  46.     """
  47.         x3≡k2-x1-x2(mod p)
  48.         y3≡k(x1-x3)-y1(mod p)
  49.     """
  50.     x3 = (k ** 2 - x1 - x2) % p
  51.     y3 = (k * (x1 - x3) - y1) % p
  52.     return x3,y3

  53. def get_rank(x0, y0, a, b, p):
  54.     """
  55.     获取椭圆曲线的阶
  56.     """
  57.     x1 = x0             #-p的x坐标
  58.     y1 = (-1*y0)%p      #-p的y坐标
  59.     tempX = x0
  60.     tempY = y0
  61.     n = 1
  62.     while True:
  63.         n += 1
  64.         # 求p+q的和,得到n*p,直到求出阶
  65.         p_x,p_y = get_np(tempX, tempY, x0, y0, a, p)
  66.         # 如果 == -p,那么阶数+1,返回
  67.         if p_x == x1 and p_y == y1:
  68.             return n+1
  69.         tempX = p_x
  70.         tempY = p_y

  71. def get_param(x0, a, b, p):
  72.     """
  73.     计算p与-p
  74.     """
  75.     y0 = -1
  76.     for i in range(p):
  77.         # 满足取模约束条件,椭圆曲线Ep(a,b),p为质数,x,y∈[0,p-1]
  78.         if i**2%p == (x0**3 + a*x0 + b)%p:
  79.             y0 = i
  80.             break

  81.     # 如果y0没有,返回false
  82.     if y0 == -1:
  83.         return False

  84.     # 计算-y(负数取模)
  85.     x1 = x0
  86.     y1 = (-1*y0) % p
  87.     return x0,y0,x1,y1

  88. def get_graph(a, b, p):
  89.     """
  90.     输出椭圆曲线散点图
  91.     """
  92.     x_y = []
  93.     # 初始化二维数组
  94.     for i in range(p):
  95.         x_y.append(['-' for i in range(p)])

  96.     for i in range(p):
  97.         val =get_param(i, a, b, p)  # 椭圆曲线上的点
  98.         if(val != False):
  99.             x0,y0,x1,y1 = val
  100.             x_y[x0][y0] = 1
  101.             x_y[x1][y1] = 1

  102.     print("椭圆曲线的散列图为:")
  103.     for i in range(p):              # i= 0-> p-1
  104.         temp = p-1-i        # 倒序

  105.         # 格式化输出1/2位数,y坐标轴
  106.         if temp >= 10:
  107.             print(temp, end=" ")
  108.         else:
  109.             print(temp, end="  ")

  110.         # 输出具体坐标的值,一行
  111.         for j in range(p):
  112.             print(x_y[j][temp], end="  ")
  113.         print("")   #换行

  114.     # 输出 x 坐标轴
  115.     print("  ", end="")
  116.     for i in range(p):
  117.         if i >=10:
  118.             print(i, end=" ")
  119.         else:
  120.             print(i, end="  ")
  121.     print('\n')

  122. def get_ng(G_x, G_y, key, a, p):
  123.     """
  124.     计算nG
  125.     """
  126.     temp_x = G_x
  127.     temp_y = G_y
  128.     while key != 1:
  129.         temp_x,temp_y = get_np(temp_x,temp_y, G_x, G_y, a, p)
  130.         key -= 1
  131.     return temp_x,temp_y

  132. def ecc_main():
  133.     while True:
  134.         a = int(input("请输入椭圆曲线参数a(a>0)的值:"))
  135.         b = int(input("请输入椭圆曲线参数b(b>0)的值:"))
  136.         p = int(input("请输入椭圆曲线参数p(p为素数)的值:"))   #用作模运算

  137.         # 条件满足判断
  138.         if (4*(a**3)+27*(b**2))%p == 0:
  139.             print("您输入的参数有误,请重新输入!!!\n")
  140.         else:
  141.             break

  142.     # 输出椭圆曲线散点图
  143.     get_graph(a, b, p)

  144.     # 选点作为G点
  145.     print("user1:在如上坐标系中选一个值为G的坐标")
  146.     G_x = int(input("user1:请输入选取的x坐标值:"))
  147.     G_y = int(input("user1:请输入选取的y坐标值:"))

  148.     # 获取椭圆曲线的阶
  149.     n = get_rank(G_x, G_y, a, b, p)

  150.     # user1生成私钥,小key
  151.     key = int(input("user1:请输入私钥小key(<{}):".format(n)))

  152.     # user1生成公钥,大KEY
  153.     KEY_x,kEY_y = get_ng(G_x, G_y, key, a, p)

  154.     # user2阶段
  155.     # user2拿到user1的公钥KEY,Ep(a,b)阶n,加密需要加密的明文数据
  156.     # 加密准备
  157.     k = int(input("user2:请输入一个整数k(<{})用于求kG和kQ:".format(n)))
  158.     k_G_x,k_G_y = get_ng(G_x, G_y, k, a, p)                         # kG
  159.     k_Q_x,k_Q_y = get_ng(KEY_x, kEY_y, k, a, p)                     # kQ

  160.     # 加密
  161.     plain_text = input("user2:请输入需要加密的字符串:")
  162.     plain_text = plain_text.strip()
  163.     #plain_text = int(input("user1:请输入需要加密的密文:"))
  164.     c = []
  165.     print("密文为:",end="")
  166.     for char in plain_text:
  167.         intchar = ord(char)
  168.         cipher_text = intchar*k_Q_x
  169.         c.append([k_G_x, k_G_y, cipher_text])
  170.         print("({},{}),{}".format(k_G_x, k_G_y, cipher_text),end="-")


  171.     # user1阶段
  172.     # 拿到user2加密的数据进行解密
  173.     # 知道 k_G_x,k_G_y,key情况下,求解k_Q_x,k_Q_y是容易的,然后plain_text = cipher_text/k_Q_x
  174.     print("\nuser1解密得到明文:",end="")
  175.     for charArr in c:
  176.         decrypto_text_x,decrypto_text_y = get_ng(charArr[0], charArr[1], key, a, p)
  177.         print(chr(charArr[2]//decrypto_text_x),end="")

  178. if __name__ == "__main__":
  179.     print("*************ECC椭圆曲线加密*************")
  180.     ecc_main()
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

教学服务系统

GMT+8, 2025-4-30 07:30 , Processed in 0.020675 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表