2014-01-14 46 views
0

嗨我想创建一个有效的RSA程序,但在一个非常小的级别上,我遇到了使用此代码进行加密和解密的问题,有人可以帮我弄清楚什么是错误的?我尝试过很多不同的方式,但这种方式似乎是正确的数学方法,所以我相信这可能只是我缺乏编码技能?由于简单的RSA代码

import random, math 

def RandomPrime(): 
    prime = False 
    while prime == False: 
    n = 2 
    while n % 2 == 0: 
     n = random.randint(10000, 100000) 
    s = math.trunc(n**0.5) 
    s = int(s) 
    x = 3 
    # While n doesn't exactly divide to equal 0, and x is less then the sqrt of n 
    while (n % x != 0) and (x <= s): 
     x = x + 2 
    # if n is greater than s, it means it has run out of numbers to test, so is prime 
    if x > s: 
     prime = True 




    return n 

def Modulus(p, q): 
    M = p * q 
    return M 

def Totient(p, q): 
    T = ((p-1) * (q-1)) 
    return T 

def Pubkey(T): 
    prime = False 
    while prime == False: 
    n = 2 
    while n % 2 == 0: 
     n = random.randint(3, T) 
    s = math.trunc(n**0.5) 
    s = int(s) 
    x = 3 
    # While 
    while (n % x != 0) and (x <= s): 
     x = x + 2 
    if x > s: 
     prime = True 
    return n 

def privkey(T, n): 
    y = math.fmod(1, T) 
    d = float((y/n)) 
    return d 


# z is my encyption in this scenario 
z = 8 
# I generate p and q, using my random prime generator, i used low primes in 
# this example just to see if it would work but it is still not showing reults 
p = RandomPrime() 
q = RandomPrime() 
print(p, q) 
#This creates the modulus 
M = Modulus(p, q) 
print(M) 
# Eulier's totient 
T = Totient(p, q) 
print(T) 
#Pub key creation 
n = Pubkey(T) 
print(n) 
#Priv key creation 
d = privkey(n, T) 
print(d) 


enc = (pow(z, n)) % M 
print('enc: ', enc) 


dec = (pow(enc, d)) % M 
print('dec: ', dec) 
+0

你错过了告诉我们您所使用的编程语言。编辑您的问题并至少将其添加为标签。 – Robert

+0

其蟒蛇,对不起伙伴 – user3181295

+0

你的错误是什么?你能计算(pow(z,n))吗?它应该是一个任意n的巨大数字。 – alko

回答

0

privkey功能似乎错了 - 我猜你看到RSA私钥值的定义是这样的:

the value "e" such that e * d = 1 mod Phi(N)

然而,在这种情况下,1 mod Phi(N)意味着The remainder when 1 is divided by Phi(N) (这似乎是你将它翻译成代码的方式,根据你使用的math.fmod(1, T),但实际上应该看起来更像:

the value "e" such that (e * d) mod Phi(N) = 1

该值通常使用Extended Euclidean Algorithm来计算。 Python实现的一个示例是here

同样值得注意的是,您似乎将privkey(T, n)定义为privkey(n, T)

+0

我应该如何重新排列该公式才能得到d? – user3181295

+0

@ user3181295您将需要使用算法,如扩展欧几里德算法(在上面的答案中链接)来执行计算。 – Iridium

+0

我在python中这样做很困难,你能帮助吗? – user3181295

0

检查我的博客里面详细包含以下使用python的实现:

MD5安全散列算法RFC 1321,RSA公钥加密RFC 3447,OpenPGP的RFC 4880

def keyGen(): 
    ''' Generate Keypair ''' 
    i_p=randint(0,20) 
    i_q=randint(0,20) 
    # Instead of Asking the user for the prime Number which in case is not feasible, 
    # generate two numbers which is much highly secure as it chooses higher primes 
    while i_p==i_q: 
     continue 
    primes=PrimeGen(100) 
    p=primes[i_p] 
    q=primes[i_q] 
    #computing n=p*q as a part of the RSA Algorithm 
    n=p*q 
    #Computing lamda(n), the Carmichael's totient Function. 
    # In this case, the totient function is the LCM(lamda(p),lamda(q))=lamda(p-1,q-1) 
    # On the Contrary We can also apply the Euler's totient's Function phi(n) 
    # which sometimes may result larger than expected 
    lamda_n=int(lcm(p-1,q-1)) 
    e=randint(1,lamda_n) 
    #checking the Following : whether e and lamda(n) are co-prime 
    while math.gcd(e,lamda_n)!=1: 
     e=randint(1,lamda_n) 
    #Determine the modular Multiplicative Inverse 
    d=modinv(e,lamda_n) 
    #return the Key Pairs 
    # Public Key pair : (e,n), private key pair:(d,n) 
    return ((e,n),(d,n)) 

博客链接: Python Cryptography

Github上链接:Python Cryptography

+0

博客链接:[Python密码学](http://crypto-python.blogspot.com) –