密码学—RSA学习

密码学

非对称加密:

RSA:

数论基础:

欧拉函数:

定义:

欧拉函数(Euler's totient function),即 φ(n) ,表示的是小于等于 n 和 n 互质的数的个数。

比如说 φ(1)=1。

当n是质数的时候,显然有φ(n)=n-1 \varphi(n) = n - 1

性质:

欧拉函数是积性函数。

即对任意满足gcd(a,b)=1的整数a,b,有φ(ab)=φ(a)φ(b)。

欧拉定理:

定义:

若gcd(a,m)=1,则aφ(m)≡1(mod m)。

乘法逆元:

定义:

如果一个线性同余方程ax≡1(mod b),则x称为a mod b的逆元,记作a-1

基本原理:

公钥与私钥的产生 :

  1. 随机选择两个不同大质数 p 和 q,计算 N=p×q
  2. 根据欧拉函数,求得 φ(N)=φ(p)φ(q)=(p−1)(q−1)
  3. 选择一个小于 φ(N)的整数 e,使 e 和 φ(N) 互质。并求得 e 关于 φ(N) 的模反元素,命名为 d,有 ed≡1(modφ(N))
  4. 将 p 和 q 的记录销毁

此时,(N,e) 是公钥,(N,d) 是私钥。

消息加密:

首先需要将消息 以一个双方约定好的格式转化为一个小于 N,且与 N 互质的整数 m。如果消息太长,可以将消息分为几段,这也就是我们所说的块加密,后对于每一部分利用如下公式加密:

c = me % N

消息解密:

利用私钥 d 进行解密。

m = cd % N

正确性证明:

即我们要证 med%N=m ( (me%N)d%N=m 再由模运算原理得),已知ed≡1modφ(N),那么 ed=kφ(N)+1,即需要证明

mkϕ(N)+1 ≡ m mod N

这里我们分两种情况证明

第一种情况 gcd(m,N)=1,那么 mφ(N)≡1modN,因此原式成立。

第二种情况 gcd(m,N)≠1,那么 m 必然是 p 或者 q 的倍数,并且 m 小于 N。我们假设

m=xp

那么 x 必然小于 q,又由于 q 是素数。那么

mφ(q)≡1modq

进而

mkφ(N)=mk(p−1)(q−1)=(mφ(q))k(p−1)≡1modq

那么

mkφ(N)+1=m+uqm

进而

mkφ(N)+1=m+uqxp=m+uxN

所以原式成立。

Python代码实现:

以下是RSA算法的一个简单Python实现示例:

import random
from gmpy2 import *

# 生成RSA密钥对
def generate_keys(p, q):
    n = p * q
    phi = (p - 1) * (q - 1)

    # 选择一个e,使得1 < e < phi且e与phi互质
    e = random.randrange(1, phi)
    g = gcd(e, phi)
    while g != 1:
        e = random.randrange(1, phi)
        g = gcd(e, phi)

    # 计算d,使得d是e关于phi的乘法逆元
    d = invert(e, phi)

    return ((e, n), (d, n))


# 加密函数
def encrypt(pk, plaintext):
    key, n = pk
    cipher = [pow(ord(char), key, n) for char in plaintext]
    return cipher


# 解密函数
def decrypt(pk, ciphertext):
    key, n = pk
    plain = [chr(pow(char, key, n)) for char in ciphertext]
    return ''.join(plain)


# 主函数
if __name__ == "__main__":
    # 选择两个大质数p和q
    p = 61
    q = 53  # 在实际应用中,这些数应该非常大

    # 生成密钥对
    public, private = generate_keys(p, q)
    print("Public Key:", public)
    print("Private Key:", private)

    # 原始消息
    message = "HELLO"
    print("Message:", message)

    # 加密消息
    encrypted_msg = encrypt(public, message)
    print("Encrypted Message:", encrypted_msg)

    # 解密消息
    decrypted_msg = decrypt(private, encrypted_msg)
    print("Decrypted Message:", decrypted_msg)
posted @   C0E1  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示