RSA 暗号化アルゴリズムの概要プロセス + 疑似コード

rsa暗号化アルゴリズム

序章:

RSA アルゴリズムは、非常に単純な数理論の事実に基づいています。つまり、2 つの大きな素数を掛けるのは非常に簡単ですが、その積を因数分解するのは非常に難しいため、その積は暗号化キーとして公開される可能性があります。
RSA アルゴリズムは、現在最も広く使用されている公開キー暗号化アルゴリズムであり、地球上で最も安全な暗号化アルゴリズムとしても知られています。RSA アルゴリズムを理解する前に、次の用語を理解してください
鍵の用途に応じて、パスワードは対称暗号化と公開鍵暗号化に分けられます 対称暗号化:同じ鍵を使用した暗号化と復号化 公開鍵暗号化
暗号化と復号化さまざまな暗号化方式が使用されるため、公開キー暗号化は非対称暗号化とも呼ばれることがあります。

1. 暗号化アルゴリズムの概要

2. アルゴリズム原理図

ここに画像の説明を挿入

フローチャート

ここに画像の説明を挿入

RSA に関連する数論の知識

素数:

素数とも呼ばれる、1 より大きい正の整数は、1 とそれ自体を除く他の整数では割り切れません。
互いに素な関係:
2 つの正の整数に 1 以外の共通約数がない場合、2 つの数値は互いに素であると言われます。

推論:

任意の 2 つの素数は互いに素の関係を形成します。
素数である 2 つの数値は互いに素の関係にある必要があります。

同余:

正の整数 m が与えられ、ab が m で割り切れる、つまり (ab) mod m = 0 を満たす 2 つの整数 a と b がある場合、整数 a と b は m を法として合同であると言われ、次のように記述されます。 a≡b (mod m) 、3 と同じ: a mod m = b

オイラー関数:

  • 定義: 与えられた正の整数 n について、n 以下の正の整数が n と互いに素の関係を形成する個数がいくつあるかを計算します。例: φ(8) = 4 。

推論:

  • n が、n = p × q のように、2 つの互いに素な正の整数の積に分割できる場合、次のようになります。 φ(n) = φ(pq) = φ§φ(q)
  • 素数 m の場合、 φ(m) = m-1 となります。

  • n を 2 つの素数 p と q の積に分解できる場合、次のようになります: φ(n) = (p-1)(q-1) 。

  • オイラーの定理: 2 つの正の整数 a と n が互いに素である場合、n のオイラー関数 φ(n) は次のようになります:
    φ ( n ) = φ ( pq ) = φ § φ ( q ) φ(n) = φ( pq ) = φ§φ(q)φ ( n )=φ ( pq )=
    素数 m に対してφ § φ ( q )とすると、 φ(m) = m-1 となります。

n を 2 つの素数 p と q の積に分解できる場合、次のようになります: φ(n) = (p-1)(q-1) 。

オイラーの定理: 2 つの正の整数 a と n が互いに素である場合、n のオイラー関数 φ(n) は次のようになります:
a φ ( n ) ≡ 1 ( modn ) a φ (n) ≡ 1(modn)φ ( n )1 ( mod n ) _ _

aのφ(n)乗をnで割った余りが1であることを意味します。

要素を反転する

2 つの正の整数 a と n が互いに素である場合、次のような整数 b が存在する必要があります: ab-1 が n で割り切れるか、または ab の n で割り切れる余りが 1 で、次のように記録されます: ab≡1(mod n )

原理:

ここに画像の説明を挿入

暗号化プロセス:

  1. 2 つの異なる大きな素数 p と q を選択し、それらの積 n=pq を計算し、オイラー関数 φ(n)=(p-1)(q-1) を求めます。

  2. φ(n) より小さく、φ(n) と互いに素な整数 e を公開鍵として選択します。つまり、公開鍵は (n, e) です。

  3. e 法 φ(n) と合同な整数 d を見つけます。つまり、d*e=1 mod φ(n)、d は秘密鍵、秘密鍵は (n,d) です。

  4. 平文 M を m<n となる整数 m に変換します。

  5. 平文を暗号化し、暗号文 C=m^e mod n を計算します。

  6. 暗号文Cを送信します。
    ここに画像の説明を挿入

復号化プロセス:

ここに画像の説明を挿入

疑似コード:

// 生成公钥和私钥
int p = 61;
int q = 53;
int n = p * q;
int phi = (p - 1) * (q - 1);
int e;
do {
    
    
e = random(2, phi - 1); // 生成一个与phi互质的整数e
} while (gcd(e, phi) != 1); // 判断e与phi是否互质
int d = modInverse(e, phi);

// 加密过程
int m = 123;
int c = modPow(m, e, n); // 计算密文

// 解密过程
int m2 = modPow(c, d, n); // 计算明文

// 辅助函数
int gcd(int a, int b) {
    
    
if (b == 0) {
    
    
return a;
} else {
    
    
return gcd(b, a % b);
}
}

int modInverse(int a, int m) {
    
    
int m0 = m;
int y = 0, x = 1;
if (m == 1) {
    
    
return 0;
}
while (a > 1) {
    
    
int q = a / m;
int t = m;
m = a % m;
a = t;
t = y;
y = x - q * y;
x = t;
}
if (x < 0) {
    
    
x += m0;
}
return x;
}

int modPow(int a, int b, int m) {
    
    
int res = 1;
while (b > 0) {
    
    
if ((b & 1) == 1) {
    
    
res = (res * a) % m;
}
a = (a * a) % m;
b >>= 1;
}
return res;
}

おすすめ

転載: blog.csdn.net/m0_68089732/article/details/130694677