Rabin加解密算法(python3)

Rabin加解密算法

详细代码如下:

# 空空
# dahouzi.cn
import random
from sympy import isprime


def decrypt_rabin(c, p, q):
    """
    解密 Rabin 密文

    Args:
        c (int): 密文
        p (int): 素数 p
        q (int): 素数 q

    Returns:
        tuple: 解密结果 M1, M2, M3, M4
    """
    n = p * q
    # 计算 m1, m2, m3, m4
    m1 = pow(c, (p + 1) // 4, p)
    m2 = (-m1) % p
    m3 = pow(c, (q + 1) // 4, q)
    m4 = (-m3) % q

    # 计算 a, b
    a = q * ModReverse(q, p)
    b = p * ModReverse(p, q)

    # 计算解密结果 M1, M2, M3, M4
    M1 = (a * m1 + b * m3) % n
    M2 = (a * m1 + b * m4) % n
    M3 = (a * m2 + b * m3) % n
    M4 = (a * m2 + b * m4) % n

    return M1, M2, M3, M4


def ModReverse(a, n):
    """
    计算模逆

    Args:
        a (int): 整数
        n (int): 模数

    Returns:
        int: a 在模 n 下的逆
    """
    arr = [0, 1]
    gcd = EX_GCD(a, n, arr)
    if gcd == 1:
        return (arr[0] % n + n) % n
    else:
        return -1


def EX_GCD(a, b, arr):
    """
    计算扩展欧几里得算法

    Args:
        a (int): 整数 a
        b (int): 整数 b
        arr (list): 结果数组

    Returns:
        int: 最大公约数
    """
    if b == 0:
        arr[0] = 1
        arr[1] = 0
        return a
    g = EX_GCD(b, a % b, arr)
    t = arr[0]
    arr[0] = arr[1]
    arr[1] = t - a // b * arr[1]
    return g


def rabin_encrypt(plaintext, p, q):
    """
    Rabin 加密

    Args:
        plaintext (int): 明文
        p (int): 素数 p
        q (int): 素数 q

    Returns:
        int: 密文
    """
    # 计算公钥 n
    n = p * q
    # 计算密文
    ciphertext = pow(plaintext, 2, n)
    return ciphertext


# 示例用法

p = 19
q = 23
plaintext = 183
ciphertext = rabin_encrypt(plaintext, p, q)
print("---------message-----------")
print("plaintext:", plaintext)
print("ciphertext:", ciphertext)

print("---------public key[n]、private key[p、q]------------")
print("p:", p)
print("q:", q)
print("n:", p * q)
#print("---------公钥n、私钥p、q------------")

# 解密
M1, M2, M3, M4 = decrypt_rabin(ciphertext, p, q)
print("---------Decrypt------------")
print("M1:", M1)
print("M2:", M2)
print("M3:", M3)
print("M4:", M4)
#print("---------解密------------")

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Rabin算法是一种非对称加密算法,其加解密过程与RSA算法类似。下面是Python实现Rabin算法加解密过程: 1. 生成公私钥对 ```python import random from math import gcd def generate_key_pair(): # 生成两个随机质数p和q p = generate_prime_number() q = generate_prime_number() # 计算n和phi(n) n = p * q phi_n = (p - 1) * (q - 1) # 选择一个随机数e,要求e与phi(n)互质 e = random.randint(2, phi_n - 1) while gcd(e, phi_n) != 1: e = random.randint(2, phi_n - 1) # 计算d,使得d为e模phi(n)的逆元 d = mod_inverse(e, phi_n) # 返回公私钥对 return ((n, e), (n, d)) def generate_prime_number(): # 生成一个随机数,检查是否为质数 while True: p = random.randint(2**15, 2**16) if is_prime(p): return p def is_prime(n): # 判断一个数是否为质数 if n <= 1: return False elif n <= 3: return True elif n % 2 == 0 or n % 3 == 0: return False i = 5 while i * i <= n: if n % i == 0 or n % (i + 2) == 0: return False i += 6 return True def mod_inverse(a, m): # 计算a模m的逆元 for x in range(1, m): if (a * x) % m == 1: return x return -1 ``` 2. 加密数据 ```python def encrypt(plaintext, public_key): # 将明文转换为整数 plaintext_int = int.from_bytes(plaintext.encode(), 'big') # 获取公钥n和e n, e = public_key # 加密数据 ciphertext_int = pow(plaintext_int, 2, n) # 返回密文 return ciphertext_int.to_bytes((ciphertext_int.bit_length() + 7) // 8, 'big') ``` 3. 解密数据 ```python def decrypt(ciphertext, private_key): # 获取私钥n和d n, d = private_key # 解密数据 plaintext_int = pow(ciphertext, (p + 1) // 4, p) # 对p取模 plaintext_int += pow(ciphertext, (q + 1) // 4, q) * n % p # 对q取模 plaintext_int %= n # 合并结果 # 将整数转换为明文 plaintext = plaintext_int.to_bytes((plaintext_int.bit_length() + 7) // 8, 'big').decode() # 返回明文 return plaintext ``` 注意:Rabin算法的安全性存在争议,不建议在生产环境中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值