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 )
原理:
暗号化プロセス:
-
2 つの異なる大きな素数 p と q を選択し、それらの積 n=pq を計算し、オイラー関数 φ(n)=(p-1)(q-1) を求めます。
-
φ(n) より小さく、φ(n) と互いに素な整数 e を公開鍵として選択します。つまり、公開鍵は (n, e) です。
-
e 法 φ(n) と合同な整数 d を見つけます。つまり、d*e=1 mod φ(n)、d は秘密鍵、秘密鍵は (n,d) です。
-
平文 M を m<n となる整数 m に変換します。
-
平文を暗号化し、暗号文 C=m^e mod n を計算します。
-
暗号文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;
}