密码学中的 RSA 算法
RSA算法是非对称密码算法。非对称实际上意味着它适用于两个不同的密钥,即公钥和私钥。顾名思义,公钥是给每个人的,而私钥是保密的。
非对称密码学的一个例子:
- 客户端(例如浏览器)将其公钥发送到服务器并请求一些数据。
- 服务器使用客户端的公钥加密数据并发送加密数据。
- 客户端接收此数据并对其进行解密。
由于这是非对称的,即使第三方拥有浏览器的公钥,除了浏览器之外没有其他人可以解密数据。
这个想法! RSA 的想法是基于难以分解大整数的事实。公钥由两个数字组成,其中一个数字是两个大素数的乘积。而私钥也是由同样的两个素数派生而来的。因此,如果有人可以分解大数字,那么私钥就会受到损害。因此,加密强度完全取决于密钥大小,如果我们将密钥大小加倍或三倍,加密强度会呈指数级增长。 RSA 密钥的长度通常为 1024 或 2048 位,但专家认为 1024 位密钥可能在不久的将来被破解。但到目前为止,这似乎是一项不可行的任务。
让我们学习 RSA 算法背后的机制:
- >> 生成公钥:
- 一个整数。
- 不是n的因数。
- 1 < e < Φ(n) [Φ(n) 将在下面讨论],现在让我们认为它等于 3。
>> 生成私钥:
现在我们准备好我们的 – 公钥(n = 3127 和 e = 3)和私钥(d = 2011)
现在我们将加密“HI” :
下面是小值的 RSA 算法的 C 实现:
// C program for RSA asymmetric cryptographic
// algorithm. For demonstration values are
// relatively small compared to practical
// application
#include
#include
// Returns gcd of a and b
int gcd(int a, int h)
{
int temp;
while (1)
{
temp = a%h;
if (temp == 0)
return h;
a = h;
h = temp;
}
}
// Code to demonstrate RSA algorithm
int main()
{
// Two random prime numbers
double p = 3;
double q = 7;
// First part of public key:
double n = p*q;
// Finding other part of public key.
// e stands for encrypt
double e = 2;
double phi = (p-1)*(q-1);
while (e < phi)
{
// e must be co-prime to phi and
// smaller than phi.
if (gcd(e, phi)==1)
break;
else
e++;
}
// Private key (d stands for decrypt)
// choosing d such that it satisfies
// d*e = 1 + k * totient
int k = 2; // A constant value
double d = (1 + (k*phi))/e;
// Message to be encrypted
double msg = 20;
printf("Message data = %lf", msg);
// Encryption c = (msg ^ e) % n
double c = pow(msg, e);
c = fmod(c, n);
printf("\nEncrypted data = %lf", c);
// Decryption m = (c ^ d) % n
double m = pow(c, d);
m = fmod(m, n);
printf("\nOriginal Message Sent = %lf", m);
return 0;
}
// This code is contributed by Akash Sharan.
输出 :
Message data = 12.000000
Encrypted data = 3.000000
Original Message Sent = 12.000000