日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前幾天我發表一片關于RSA的加密算法,很多人留言讓我講解一下ECC 橢圓加密算法。首先我在這里聲明一下 橢圓加密算法不像RSA 用中學的數學知識就可以解決。本文中也是參考了網上的很多資料,

橢圓曲線加密算法,即:Elliptic Curve Cryptography,簡稱ECC,是基于橢圓曲線數學理論實現的一種非對稱加密算法。相比RSA,ECC優勢是可以使用更短的密鑰,來實現與RSA相當或更高的安全。據研究,160位ECC加密安全性相當于1024位RSA加密,210位ECC加密安全性相當于2048位RSA加密。

橢圓曲線在密碼學中的使用,是1985年由Neal Koblitz和Victor Miller分別獨立提出的。

橢圓曲線

一般情況下,橢圓曲線可用下列方程式來表示,其中a,b,c,d為系數。

 

比RSA加密更快更安全的加密算法ECC

 

例如,當a=1,b=0,c=-2,d=4時,所得到的橢圓曲線為:

比RSA加密更快更安全的加密算法ECC

 

該橢圓曲線E的圖像如圖X-1所示,可以看出根本就不是橢圓形。

比RSA加密更快更安全的加密算法ECC

 

定義橢圓曲線的運算規則

加法

過曲線上的兩點A、B畫一條直線,找到直線與橢圓曲線的交點,交點關于x軸對稱位置的點,定義為A+B,即為加法。如下圖所示:A + B = C

比RSA加密更快更安全的加密算法ECC

 

二倍運算

上述方法無法解釋A + A,即兩點重合的情況。因此在這種情況下,將橢圓曲線在A點的切線,與橢圓曲線的交點,交點關于x軸對稱位置的點,定義為A + A,即2A,即為二倍運算。

比RSA加密更快更安全的加密算法ECC

 

正負取反

將A關于x軸對稱位置的點定義為-A,即橢圓曲線的正負取反運算。如下圖所示:

比RSA加密更快更安全的加密算法ECC

 

無窮遠點

如果將A與-A相加,過A與-A的直線平行于y軸,可以認為直線與橢圓曲線相交于無窮遠點。

綜上,定義了A+B、2A運算,因此給定橢圓曲線的某一點G,可以求出2G、3G(即G + 2G)、4G......。即:當給定G點時,已知x,求xG點并不困難。反之,已知xG點,求x則非常困難。此即為橢圓曲線加密算法背后的數學原理。

有限域上的橢圓曲線運算

橢圓曲線要形成一條光滑的曲線,要求x,y取值均為實數,即實數域上的橢圓曲線。但橢圓曲線加密算法,并非使用實數域,而是使用有限域。按數論定義,有限域GF(p)指給定某個質數p,由0、1、2......p-1共p個元素組成的整數集合中定義的加減乘除運算。

假設橢圓曲線為y² = x³ + x + 1,其在有限域GF(23)上時,寫作:  y² ≡ x³ + x + 1 (mod 23)

此時,橢圓曲線不再是一條光滑曲線,而是一些不連續的點,如下圖所示。以點(1,7)為例,7² ≡ 1³ + 1 + 1 ≡ 3 (mod 23)。如此還有如下點:

(0,1) (0,22)  (1,7) (1,16)  (3,10) (3,13)  (4,0)  (5,4) (5,19)  (6,4) (6,19)  (7,11) (7,12)  (9,7) (9,16)  (11,3) (11,20)  等等。

另外,如果P(x,y)為橢圓曲線上的點,則-P即(x,-y)也為橢圓曲線上的點。如點P(0,1),-P=(0,-1)=(0,22)也為橢圓曲線上的點。

比RSA加密更快更安全的加密算法ECC

 

計算xG

相關公式如下:  有限域GF(p)上的橢圓曲線y² = x³ + ax + b,若P(Xp, Yp), Q(Xq, Yq),且P≠-Q,則R(Xr,Yr) = P+Q 由如下規則確定:

Xr = (λ² - Xp - Xq) mod p  Yr = (λ(Xp - Xr) - Yp) mod p  其中λ = (Yq - Yp)/(Xq - Xp) mod p(若P≠Q), λ = (3Xp² + a)/2Yp mod p(若P=Q)

因此,有限域GF(23)上的橢圓曲線y² ≡ x³ + x + 1 (mod 23),假設以(0,1)為G點,計算2G、3G、4G...xG等等,方法如下:

計算2G:  λ = (3x0² + 1)/2x1 mod 23 = (1/2) mod 23 = 12  Xr = (12² - 0 - 0) mod 23 = 6  Yr = (12(0 - 6) - 1) mod 23 = 19  即2G為點(6,19)

計算3G:  3G = G + 2G,即(0,1) + (6,19)  λ = (19 - 1)/(6 - 0) mod 23 = 3  Xr = (3² - 0 - 6) mod 23 = 3  Yr = (3(0 - 3) - 1) mod 23 = 13  即3G為點(3, 13)

比RSA加密更快更安全的加密算法ECC

 

橢圓曲線加解密算法原理

建立基于橢圓曲線的加密機制,需要找到類似RSA質因子分解或其他求離散對數這樣的難題。而橢圓曲線上的已知G和xG求x,是非常困難的,此即為橢圓曲線上的的離散對數問題。此處x即為私鑰,xG即為公鑰。

橢圓曲線加密算法原理如下:

設私鑰、公鑰分別為k、K,即K = kG,其中G為G點。

公鑰加密:  選擇隨機數r,將消息M生成密文C,該密文是一個點對,即:  C = {rG, M+rK},其中K為公鑰

私鑰解密:  M + rK - k(rG) = M + r(kG) - k(rG) = M  其中k、K分別為私鑰、公鑰。

橢圓曲線簽名算法原理

橢圓曲線簽名算法,即ECDSA。  設私鑰、公鑰分別為k、K,即K = kG,其中G為G點。

私鑰簽名:  1、選擇隨機數r,計算點rG(x, y)。  2、根據隨機數r、消息M的哈希h、私鑰k,計算s = (h + kx)/r。  3、將消息M、和簽名{rG, s}發給接收方。

公鑰驗證簽名:  1、接收方收到消息M、以及簽名{rG=(x,y), s}。  2、根據消息求哈希h。  3、使用發送方公鑰K計算:hG/s + xK/s,并與rG比較,如相等即驗簽成功。

原理如下:  hG/s + xK/s = hG/s + x(kG)/s = (h+xk)G/s  = r(h+xk)G / (h+kx) = rG

簽名過程

假設要簽名的消息是一個字符串:“Hello World!”。DSA簽名的第一個步驟是對待簽名的消息生成一個消息摘要。不同的簽名算法使用不同的消息摘要算法。而ECDSA256使用SHA256生成256比特的摘要。
摘要生成結束后,應用簽名算法對摘要進行簽名:
產生一個隨機數k
利用隨機數k,計算出兩個大數r和s。將r和s拼在一起就構成了對消息摘要的簽名。
這里需要注意的是,因為隨機數k的存在,對于同一條消息,使用同一個算法,產生的簽名是不一樣的。從函數的角度來理解,簽名函數對同樣的輸入會產生不同的輸出。因為函數內部會將隨機值混入簽名的過程。

驗證過程

關于驗證過程,這里不討論它的算法細節。從宏觀上看,消息的接收方從簽名中分離出r和s,然后利用公開的密鑰信息和s計算出r。如果計算出的r和接收到的r值相同,則表示驗證成功。否則,表示驗證失敗。

這個是網上ecc 的demo

# -*- coding:utf-8 -*-

def get_inverse(value, p):
    """
    求逆元
    :param value: 待求逆元的值
    :param p: 模數
    """
    for i in range(1, p):
        if (i * value) % p == 1:
            return i
    return -1

def get_gcd(value1, value2):
    """
    輾轉相除法求最大公約數
    :param value1:
    :param value2:
    """
    if value2 == 0:
        return value1
    else:
        return get_gcd(value2, value1 % value2)

def get_PaddQ(x1, y1, x2, y2, a, p):
    """
    計算P+Q
    :param x1: P點橫坐標
    :param y1: P點縱坐標
    :param x2: Q點橫坐標
    :param y2: Q點縱坐標
    :param a: 曲線參數
    :param p: 曲線模數
    """
    flag = 1 # 定義符號位(+/-)

    # 如果P=Q,斜率k=(3x^2+a)/2y mod p
    if x1 == x2 and y1 == y2:
        member = 3 * (x1 ** 2) + a # 分子
        denominator = 2 * y1 # 分母

    # 如果P≠Q, 斜率k=(y2-y1)/(x2-x1) mod p
    else:
        member = y2 - y1
        denominator = x2 - x1

        if member * denominator < 0:
            flag = 0 # 表示負數
            member = abs(member)
            denominator = abs(denominator)

    # 化簡分子分母
    gcd = get_gcd(member, denominator) # 最大公約數
    member = member // gcd
    denominator = denominator // gcd
    # 求分母的逆元
    inverse_deno = get_inverse(denominator, p)
    # 求斜率
    k = (member * inverse_deno)
    if flag == 0:
        k = -k
    k = k % p

    # 計算P+Q=(x3,y3)
    x3 = (k ** 2 - x1 - x2) % p
    y3 = (k * (x1-x3) -y1) % p

    return x3, y3

def get_order(x0, y0, a, b, p):
    """
    計算橢圓曲線的階
    """
    x1 = x0 # -P的橫坐標
    y1 = (-1 * y0) % p # -P的縱坐標
    temp_x = x0
    temp_y = y0
    n = 1
    while True:
        n += 1
        # 累加P,得到n*P=0∞
        xp, yp = get_PaddQ(temp_x, temp_y, x0, y0, a, p)
        # 如果(xp,yp)==-P,即(xp,yp)+P=0∞,此時n+1為階數
        if xp == x1 and yp == y1:
            return n+1
        temp_x = xp
        temp_y = yp

def get_dot(x0, a, b, p):
    """
    計算P和-P
    """
    y0 = -1
    for i in range(p):
        # 滿足適合加密的橢圓曲線條件,Ep(a,b),p為質數,x,y∈[0,p-1]
        if i**2 % p == (x0**3 + a*x0 + b) % p:
            y0 = i
            break
    # 如果找不到合適的y0返回False
    if y0 == -1:
        return False
    # 計算-y
    x1 = x0
    y1 = (-1*y0) % p
    return x0, y0, x1, y1

def get_graph(a, b, p):
    """
    畫出橢圓曲線散點圖
    """
    xy = []
    # 初始化二維數組
    for i in range(p):
        xy.Append(['-' for i in range(p)])

    for i in range(p):
        value = get_dot(i, a, b, p)
        if (value != False):
            x0,y0,x1,y1 = value
            xy[x0][y0] = 1
            xy[x1][y1] = 1

    print('橢圓曲線散點圖:')
    for i in range(p):
        temp = p - 1 -i
        if temp >= 10:
            print(temp, end='')
        else:
            print(temp, end='')

        # 輸出具體坐標值
        for j in range(p):
            print(xy[j][temp], end='')
        print()

    print(' ', end='')
    for i in range(p):
        if i >= 10:
            print(i, end='')
        else:
            print(i, end='')

    print()

def get_nG(xG, yG, priv_key, a, p):
    """
    計算nG
    """
    temp_x = xG
    temp_y = yG
    while priv_key != 1:
        temp_x, temp_y = get_PaddQ(temp_x, temp_y, xG, yG, a, p)
        priv_key -= 1
    return temp_x, temp_y

def get_KEY():
    """
    生成公鑰私鑰
    """
    # 選擇曲線方程
    while True:
        a = int(input('輸入橢圓曲線參數a(a>0)的值:'))
        b = int(input('輸入橢圓曲線參數b(b>0)的值:'))
        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('在上圖坐標系中選擇基點G的坐標')
    xG = int(input('橫坐標xG:'))
    yG = int(input('縱坐標yG:'))

    # 獲取曲線的階
    n = get_order(xG, yG, a, b, p)

    # 生成私鑰key,且key<n
    priv_key = int(input('輸入私鑰key(<%d):'%n))
    #生成公鑰KEY
    xK, yK = get_nG(xG, yG, priv_key, a, p)
    return xK, yK, priv_key, a, b, p, n, xG, yG

def encrypt(xG, yG, xK, yK,priv_key, a, p, n):
    """
    加密
    """
    k = int(input('輸入一個整數k(<%d)用于計算kG和kQ:' % n))
    kGx, kGy = get_nG(xG, yG, priv_key, a, p) # kG
    kQx, kQy = get_nG(xK, yK, priv_key, a, p) # kQ
    plain = input('輸入需要加密的字符串:')
    plain = plain.strip()
    c = []
    print('密文為:', end='')
    for char in plain:
        intchar = ord(char)
        cipher = intchar * kQx
        c.append([kGx, kGy, cipher])
        print('(%d,%d),%d' % (kGx, kGy, cipher), end=' ')

    print()
    return c

def decrypt(c, priv_key, a, p):
    """
    解密
    """
    for charArr in c:
        kQx, kQy = get_nG(charArr[0], charArr[1], priv_key, a, p)
        print(chr(charArr[2] // kQx), end='')
    print()


if __name__ == '__main__':
    xK, yK, priv_key, a, b, p, n, xG, yG = get_KEY()
    c = encrypt(xG, yG, xK, yK, priv_key, a, p, n)
    decrypt(c, priv_key, a, p)


由于本人水平有限,文章出現紕漏,還請大佬們斧正。

分享到:
標簽:加密算法
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定