ECC暗号化アルゴリズム+Python実装の詳細解説

I.はじめに

現在、一般的な暗号化アルゴリズムは 2 つあり、1 つは大整数因数分解問題 ( IFP)に基づくRSAアルゴリズム、もう 1 つは楕円曲線上の離散対数計算問題に基づくアルゴリズム ( ECDLP)ですECCRSAアルゴリズムについては以前にも詳しく説明しましたが、ECC暗号化アルゴリズムについてはまだ触れられていないため、ECC数学的な概念には立ち入らず、暗号化アルゴリズムの内容をできるだけシンプルにわかりやすく説明します。

2. 暗号化処理

ここで数学的な知識に触れることは避けられませんが、秘密を暗号化するプロセスを理解することはできません。対応するプロセスについては、説明の 3 番目の部分である乳母レベルの教育を参照してください。

1. 数学的原理

楕円曲線上に 2 つの点 P と Q があり、k は整数であると仮定します。現時点では次のようなものがあります。

Q = k P Q=kPQ=kP

与えられた k と P に対して、加算ルールに従って Q を計算するのは簡単ですが、与えられた P と Q から k を見つけるのは非常に困難です。

2. 暗号化と復号化

  • 楕円曲線 Ep(a,b) を選択し、楕円曲線上の点を基点 P とします。
  • 大きな数値 k を秘密鍵として選択し、公開鍵 Q (Q=kP) を生成します。
  • 暗号化: 乱数 r を選択して、平文 M から暗号文 C を生成します。暗号文は点のペアであり、C=(rP,M+rQ)
  • 復号化: M+rQ-k(rP)=M+r(kP)-K(rP)=M

3. 数学の補足

1. 楕円曲線を使用する理由

ECC暗号アルゴリズムであっても、他の暗号アルゴリズムであっても、暗号化の基礎は数学的な問題に基づいており、ECC暗号化は楕円曲線離散対数問題に基づいて設計されています。まず、この問題の数学的原理を見てみましょう。

楕円曲線上の 2 点を仮定しPQ次にk整数を仮定します。この時点で:Q=KP
与えられたk合計についてはP、加算の法則に従って計算はQ簡単ですが、与えられたP合計Qを見つけるのは非常に困難ですk

ここでの Q=KP は、皆さんが理解している数学の掛け算ではありません。KPQ が何であるかについては、後ほど説明します。

2. 楕円曲線とは

ここで、頭の中で考えている数学の楕円をまず捨ててください、楕円曲線は楕円ではありません。

あなたの頭の中の楕円は、x 2 /a 2 +y 2 /b 2 =1、

ここで、楕円曲線は次のようになります: y 2 = x 3 + ax +b、これも (4a 3 + 27b≠0)を満たします。

4a^3 + 27b^2 ≠ 0曲線内に特異点がないこと、つまり曲線上のすべての点に接線が存在することを確認することで満足されます

欠陥としても知られる特異点は、大学の高度な数学で導入されるべきでしたが、それを高等数学に変換することを忘れていました。もちろん、ここでは焦点を当てません。

これはインターネット上にある楕円曲線のグラフですので、参考にしてください。

ここに画像の説明を挿入

3. 有限体

まず、楕円曲線は連続であり、暗号化には適していないことがわかっていますが、楕円曲線を離散点に変換する必要があり、その離散点によって形成される領域は有限体になります。

注: 有限フィールドは単純なコレクションではありません。詳細なフィールドの紹介は、後でモノのインターネットの情報セキュリティについて書くときに参照します。

フィールドとは、結果がフィールドを超えることなく加算、減算、乗算、および除算の演算を実行できるセットです。たとえば、有理数のセット、実数のセット、および複素数のセットはすべてフィールドです。 、しかし整数のセットはそうではありません。(明らかに、除算で得られた分数または小数が整数のセットを超えています)

体 F に有限数の要素のみが含まれる場合、それは有限体と呼ばれ、有限体の要素の数は有限体の次数と呼ばれます。
各有限体の次数は素数のべき乗でなければなりません。つまり、有限体の次数は p n (p は素数、n は正の整数) として表すことができ、この有限体の次数は通常次のようになります。ガロア体 (Galois Fields) と呼ばれ、GF§ と表記されます。

ドメイン定義に基づいて、次の変更を加えます。

  • 1. モジュロ p 加算とモジュロ p 乗算を定義します (加算または乗算の結果が p を超える場合、p を法とする剰余が取られます。p は素数です)。
  • 2. セット内の要素は加算と乗算によって計算され、結果はセット内に残ります。
  • 3. 為替レート、拘束レート、分​​配レートの計算
  • 4. 加算と乗算には単位要素があります (セット内のすべての値には対応する負の数があり、セット内のすべての非ゼロ値には逆数があります)。

操作後、要素がまだ有限フィールド内にあることを確認するにはどうすればよいでしょうか? これにはモジュロ演算が必要です。

4. 楕円曲線の加算規則

楕円曲線のアルゴリズムは通常の演算と同じ加算と乗算を使用しますが、単純な 2 つの座標の加算または乗算ではありません。ここでは、まず楕円曲線のアルゴリズムがどのようなものであるかを紹介します。まず、次の図に示す加算ルールを見てみましょう。

ここに画像の説明を挿入

図を見て理解してください。ここには 2 つの点 A と B (楕円曲線上) があり、それらの接続線と楕円曲線の交点が x 軸に関して対称である点が点 A+ になります。 B 計算する必要があります。

ここでは、2 つの点 A と B によって決まる直線を選択する必要があります。この直線には 3 番目の交点があることを確認する必要があります。B=-A とした場合、描画されるグラフは次のようになります。
ここに画像の説明を挿入

この場合、直線は無限遠の点で楕円曲線と交わると考えることができます。

5. 楕円曲線の乗算

数学では、掛け算を足し算の重ね合わせとして理解しますか?ここでも同じです、A+A=2A。

先ほどの足し算をもとに、点Bを点Aに一致するまで限りなく近づけると、このときの接続線ABはAの接線に相当します。軸対称点XつまりA+A2A

ここに画像の説明を挿入

計算3AはA+2A計算結果で、A点と点を通る2A直線を作り、X楕円曲線の焦点を軸とした対称点は です3A

補足:後半のQ=KPですが、理解できましたか、Kは数字の2、3…ここで、Pはここで例として使用した点A、Qは計算結果です。

この時点で、冒頭で楕円曲線の数学的問題について言及した理由を誰もが理解できるはずです。Q=KP

与えられたk合計の場合、加算の法則に従ってP計算は簡単です。Q

ここでの K は非常に大きくなる可能性があります。単なる 2 や 3 であるとは考えないでください。例を次に示します。

6. 例を挙げる

楕円曲線の方程式: x 3 + x +1

GF(23)有限体上では、楕円曲線は次のようになります。

ここに画像の説明を挿入

4. 計算例

1. 運用ルール

ここに画像の説明を挿入

2. たとえば

ここで、y2 = x3 + x +1 mod(23)と仮定します。

成績評価点: A (0, 1)

A=B のとき、k=3*0 2 +1/2=1/2 mod(23) を計算に組み込みます。

これには分数モジュロ演算が含まれます。合同置換を使用して以下を計算できます。

ここに画像の説明を挿入

したがって、ここでの x3 は 6 と計算されます。

同時に、y3も19と計算できます。

ここでは x3 と y3 の両方が出てくるので、x 軸の対称性については話さないことにします。

3. 先生の授業例

5.pythonの実装

def get_points(a, b, p):
    """
     获取有限域下的散点集
    """
    # 计算所有可能的点坐标
    points = []
    for x in range(p):
        y_square = (x ** 3 + a * x + b) % p
        for y in range(p):
            if (y ** 2) % p == y_square:
                points.append((x, y))
    return points


def cal_k(point_A, point_B, p):
    """
    计算斜率k
    """
    if point_A == point_B:
        son = 3 * pow(point_A[0], 2) + a
        mother = 2 * point_A[1]
        # 费马小定理求分数取模
        return (son * pow(mother, p - 2)) % p

    else:
        son = point_B[1] - point_A[1]
        mother = point_B[0] - point_A[0]
        # 费马小定理求分数取模
        return (son * pow(mother, p - 2)) % p


def cal_add(point_A, point_B, p, k):
    """
     椭圆曲线加法
     计算A+B的结果坐标
    :param k: 斜率
    """
    # A+B=C,计算c的坐标
    cx = (k ** 2 - point_A[0] - point_B[0]) % p
    cy = (k * (point_A[0] - cx) - point_A[1]) % p
    return cx, cy


def cal_NA(key, point_A, point_B, p):
    """
    椭圆曲线乘法
    计算NA
    """
    # 执行0~key-1共key次
    for i in range(key - 1):
        k = cal_k(point_A, point_B, p)
        point_B = cal_add(point_A, point_B, p, k)

    return point_B


def encryption(r, Q, m, p):
    """
   加密
    """
    cx = cal_NA(r, A, B, p)
    rQ = cal_NA(r, Q, Q, p)
    k = cal_k(m, rQ, p)
    cy = cal_add(m, rQ, p, k)
    return cx, cy


def decryption(cplantext, key, p):
    """
    解密
    """
    kc2 = cal_NA(key, cplantext[0], cplantext[0], p)
    # 减法即关于x轴对称点的坐标
    kc2 = (kc2[0], -kc2[1])
    k = cal_k(cplantext[1], kc2, p)
    result = cal_add(cplantext[1], kc2, p, k)
    return result


# 测试-------------------------------------------------------------------
# 椭圆曲线的a,b
a = 1
b = 6
# 有限域的阶
p = 11
# 私钥k
key = 7
# 散点表
points = get_points(a, b, p)
print("散点表中的元素:")
print(points, end='')
print("\n-------------------------------------------------------------------")
# ------------------------------------------------------------------------
# A是基点,为散点表中的一点,B是另一个交点,这里初始时相同
A = (2, 7)
B = (2, 7)
# 公钥Q=7A
Q = cal_NA(key, A, B, p)
# 随机数r
r = 3
# --------------------------------------------------------------------------
# 消息
message = (10, 9)
print(f"原始消息:{
      
      message}")
# 密文
c = encryption(r, Q, message, p)
print(f"加密后的结果:{
      
      c}")
# 解密
result = decryption(c, key, p)
print(f"解密后的结果:{
      
      result}")


6. 走行結果

ここに画像の説明を挿入

私も勉強中です。

参考リンク:

おすすめ

転載: blog.csdn.net/weixin_51496226/article/details/131320249