RSA其实很简单

本文介绍了RSA加密算法的基本原理及步骤。通过选取两个大素数p和q,并计算n=pq,选择e使得e与(p-1)(q-1)互素,进而计算d=e^(-1)mod((p-1)(q-1))。n和e作为公钥对外公开,d作为私钥保密。加密过程为c=m^(e)(modn),解密过程为m=c^(d)(modn)。

RSA其实很简单

RSA其实很简单:
1. 选两个大素数p, q
2. 计算n=pq
3. 选取e,使得e与(p-1)(q-1)互素
4. 计算d=e^(-1)mod((p-1)(q-1))
n, e就是RSA的公钥,需要告诉每一个可能像你发送加密信息的人,
d就是私钥,只有你能知道。
但别人要想你发送信息m时,需要使用加密算法将明文m变成秘文c
c=m^(e) (mod n)
你收到秘文c后,使用解密算法变回明文m
m=c^(d) (mod n)

抄一个例子:
取:p=47 q=71
那么:n=pq=3337  (p-1)(q-1)=3220
取:e=79
那么:d=79^(-1) mod 3220 = 1019
加密明文m=688
c=688^(79) (mod 3337) = 1570
解密密文c=1570
m=1570^(1019) (mod 3337) = 688

就这么简单。不过为了足够安全,要求p, q都很大,一般至少要512bit,
这样生成的RSA密钥是1024bit。

可是如果你希望把它做成注册码算法,你肯定要把n, e, d都放到程序里去,
这样和普通的对称密钥算法没有任何区别。

这一段程序是为了选p, q和e的。这几个数字一般都是随机产生,然后
验证是否合法的。


e其实可以固定为65537,对加密效果没有影响

 

正像你看到的,RSA的密钥不是你随便挑的,是要从p, q两个大素数
计算得到的,p, q两个数在计算得到密钥后必须严格保密,最好丢弃。
RSA的安全性是基于大数分解的难度,也就是说从n要逆向得到p, q在目
前是没有什么好方法的,超过了目前计算机所拥有的计算能力。
一旦大数分解这个问题得到解决,RSA也就失去了存在的意义。

### 实现 RSA 加密算法 以下是基于 C++ 和 Python 的两种实现方式,分别展示了如何编写程序来完成 RSA 加密解密操作。 #### 使用 C++ 实现 RSA 加密算法 在 C++ 中可以按照以下逻辑实现: 1. **生成公钥和私钥** 需要选择两个大素数 \( p \) 和 \( q \),计算模数 \( n = pq \),以及欧拉函数 \( φ(n) = (p-1)(q-1) \)。接着选取一个小于 \( φ(n) \) 并与其互质的整数作为公开指数 \( e \),并得对应的私有指数 \( d \)[^3]。 2. **加密过程** 假设明文消息为 \( m \),则加密后的密文 \( c \) 可表示为: \[ c ≡ m^e \mod n \] 3. **解密过程** 解密时利用私钥 \( d \) 将密文还原成原始消息: \[ m ≡ c^d \mod n \] 下面是完整的 C++ 示例代码: ```cpp #include <iostream> #include <cmath> using namespace std; // 计算最大公约数 int gcd(int a, int b){ while(b != 0){ int t = b; b = a % b; a = t; } return a; } // 扩展欧几里得算法逆元 int modInverse(int e, int phi){ int r1 = phi, r2 = e; int t1 = 0, t2 = 1; while(r2 > 0){ int q = r1 / r2; int r = r1 - q * r2; r1 = r2; r2 = r; int t = t1 - q * t2; t1 = t2; t2 = t; } if(r1 == 1) return (t1 + phi) % phi; return -1; } void RSAEnc(int& num, int e, int n){ unsigned long temp = static_cast<unsigned long>(pow(num, e)) % n; num = static_cast<int>(temp); } void RSADec(int& num, int d, int n){ unsigned long temp = static_cast<unsigned long>(pow(num, d)) % n; num = static_cast<int>(temp); } int main(){ // 初始化参数 int p = 61, q = 53; // 大素数 int n = p * q; // 模数n int phi = (p-1)*(q-1); // 欧拉函数φ(n) int e = 17; // 公开指数e int d = modInverse(e, phi);// 私有指数d cout << "Public Key: (" << e << ", " << n << ")" << endl; cout << "Private Key: (" << d << ", " << n << ")" << endl; int message = 123; // 明文消息m cout << "Original Message: " << message << endl; // 加密 RSAEnc(message, e, n); cout << "Encrypted Message: " << message << endl; // 解密 RSADec(message, d, n); cout << "Decrypted Message: " << message << endl; return 0; } ``` --- #### 使用 Python 实现 RSA 加密算法 Python 提供更简洁的方式处理幂运算和取余操作,因此其实现有一定优势。 下面是一个简单示例: ```python import random def is_prime(n): """判断一个数是否为素数""" if n <= 1: return False for i in range(2, int(n**0.5)+1): if n % i == 0: return False return True def generate_keypair(p, q): """生成公钥和私钥""" if not (is_prime(p) and is_prime(q)): raise ValueError('Both numbers must be prime.') elif p == q: raise ValueError('p and q cannot be equal') n = p * q # 模数n phi = (p-1) * (q-1) # 欧拉函数φ(n) # 选择小于phi并与之互质的小整数e e = random.randrange(1, phi) g = gcd(e, phi) while g != 1: e = random.randrange(1, phi) g = gcd(e, phi) # 利用扩展欧几里得算法得到d d = multiplicative_inverse(e, phi) return ((e, n), (d, n)) def encrypt(pk, plaintext): """加密方法""" key, n = pk cipher = [(ord(char) ** key) % n for char in plaintext] return cipher def decrypt(pk, ciphertext): """解密方法""" key, n = pk plain = [chr((char ** key) % n) for char in ciphertext] return ''.join(plain) if __name__ == '__main__': print("RSA Encrypter/ Decrypter") p = 61 q = 53 public, private = generate_keypair(p, q) print(f"Public Key: {public}") print(f"Private Key: {private}") message = 'HELLO' encrypted_msg = encrypt(public, message) print(f'Encrypted Message: {encrypted_msg}') decrypted_msg = decrypt(private, encrypted_msg) print(f'Decrypted Message: {decrypted_msg}') ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值