簡體   English   中英

RSA(Python)中的解密問題

[英]Problems with decrypting in RSA (Python)

我剛剛編寫了一個使用 RSA 加密和解密的小型 python 程序。 這只是為了好玩。 我的問題是它從未完成解密,女巫顯然不是故意的。 d 漿果很大,我不確定它是否能夠解密。 有沒有邏輯錯誤? 我錯過了什么? generatePrimes 函數生成位長為 512 的素數。

from generatePrime import generatePrime


from math import gcd as bltin_gcd

def coprime(a, b):
    return bltin_gcd(a, b) == 1

def encript(msg,e,N):
    print("encripting :")
    return msg**e % N

#THIS HERE IS THE PROBLEM!
def decript(en,d,N):
    print("decripting :")
    pow(en, d, N) #Like this?


def RSA():
    print("generating P     ")
    P = generatePrime()
    print("generating Q ")
    Q = generatePrime()
    print("calculating N ")
    N = P* Q
    print("calculating phi ")
    phi = (Q-1)*(P-1)
    e = 65537
    if not coprime(e,P) and not coprime(e,Q):
        RSA()
    d = int((1+ phi)/e)
    #print(d)

    encripted = encript(16468,e,N)
    print(encripted)
    decripted = decript(encripted,d,N)
    print(decripted)
    print("sucsess!")

RSA()
print("Done!")

d 很大,但它必須是,不是嗎? 我沒有任何線索。

這是 generatePrime Funktion(我偷的女巫)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
import random
import math


def fermat_primality_test(p, s=5):
    """
    a^(p-1) ≡ 1 mod p
    Input: prime candidate p and security paramter s
    Output: either p is a composite (always trues), or
            p is a prime (with probability)
    """
    if p == 2:
        return True
    if not p & 1: # if p is even, number cant be a prime
        return False

    for i in range(s):
        a = random.randrange(2, p-2)
        x = pow(a, p-1, p) # a**(p-1) % p
        if x != 1:
            return False
    return True

def square_and_multiply(x, k, p=None):
    """
    Square and Multiply Algorithm
    Parameters: positive integer x and integer exponent k,
                optional modulus p
    Returns: x**k or x**k mod p when p is given
    """
    b = bin(k).lstrip('0b')
    r = 1
    for i in b:
        r = r**2
        if i == '1':
            r = r * x
        if p:
            r %= p
    return r

def miller_rabin_primality_test(p, s=5):
    if p == 2: # 2 is the only prime that is even
        return True
    if not (p & 1): # n is a even number and can't be prime
        return False

    p1 = p - 1
    u = 0
    r = p1  # p-1 = 2**u * r

    while r % 2 == 0:
        r >>= 1
        u += 1

    # at this stage p-1 = 2**u * r  holds
    assert p-1 == 2**u * r

    def witness(a):
        """
        Returns: True, if there is a witness that p is not prime.
                False, when p might be prime
        """
        z = square_and_multiply(a, r, p)
        if z == 1:
            return False

        for i in range(u):
            z = square_and_multiply(a, 2**i * r, p)
            if z == p1:
                return False
        return True

    for j in range(s):
        a = random.randrange(2, p-2)
        if witness(a):
            return False

    return True

def generatePrime(n=512, k=1):
    """
    Generates prime numbers with bitlength n.
    Stops after the generation of k prime numbers.
    Caution: The numbers tested for primality start at
    a random place, but the tests are drawn with the integers
    following from the random start.
    """
    assert k > 0
    assert n > 0 and n < 4096

    # follows from the prime number theorem
    necessary_steps = math.floor( math.log(2**n) / 2 )
    # get n random bits as our first number to test for primality
    x = random.getrandbits(n)

    primes = []

    while k>0:
        if miller_rabin_primality_test(x, s=7):
            primes.append(x)
            k = k-1
        x = x+1

    return primes[0]

我確實嘗試過:

from Crypto.Util import number
def generatePrime(len=512):
    return number.getPrime(len)

但這並沒有解決問題。

過了一段時間,我開始工作了。 這是我的最終代碼:

om RSAresources import *

class RSA:

    def __init__(self,msg,e=65537,P=generatePrime(),Q = generatePrime()):

        self.e = e
        self.P = P
        self.Q = Q
        self.msg = msg

        while not coprime(e,P) and not coprime(e,Q):
            self.P = generatePrime()
            self.Q = generatePrime()

        self.N = P * Q
        self.phi = (Q-1)*(P-1)
        self.d = mod_inverse(self.e,self.phi)

    def encript(self):
        return pow(self.msg,self.e, self.N)

    def decript(self):
        return pow(self.msg,self.d,self.N)

這是 RSAresources.py:

from Crypto.Util import number

def generatePrime(leng=1024):
    return number.getPrime(leng)

def mod_inverse(x,y):

    def eea(a,b):
        if b==0:return (1,0)
        (q,r) = (a//b,a%b)
        (s,t) = eea(b,r)
        return (t, s-(q*t) )

    inv = eea(x,y)[0]
    if inv < 1: inv += y
    return inv


from math import gcd as bltin_gcd

def coprime(a, b):
    return bltin_gcd(a, b) == 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM