使用公钥加密字符串

时间:2009-06-25 11:19:47

标签: python encryption

我需要在Python中使用一个字符串并使用公钥对其进行加密。

有人可以给我一个关于如何做这个的例子或建议吗?

4 个答案:

答案 0 :(得分:3)

你需要一个Python加密库才能做到这一点。

看一下ezPyCrypto“作为对其他一些加密库的反应,ezPyCrypto的设计从一开始就设计得非常简单易用,不损害安全性。“

它有一个API:

encString(self, raw)

看起来像你所追求的:“高级函数。加密整个数据字符串,将加密的字符串作为二进制文件返回。”

答案 1 :(得分:2)

PyMeGPGME库提供了一个Python接口。

理论上,您应该能够使用它与Python中的GPG进行交互,以执行您需要进行的任何加密。

以下是来自documentation非常简单的代码示例:

此程序不适用于严重加密,仅用于示例目的!

import sys
from pyme import core, constants

# Set up our input and output buffers.

plain = core.Data('This is my message.')
cipher = core.Data()

# Initialize our context.

c = core.Context()
c.set_armor(1)

# Set up the recipients.

sys.stdout.write("Enter name of your recipient: ")
name = sys.stdin.readline().strip()
c.op_keylist_start(name, 0)
r = c.op_keylist_next()

# Do the encryption.

c.op_encrypt([r], 1, plain, cipher)
cipher.seek(0,0)
print cipher.read()

答案 2 :(得分:2)

我查看了另一个答案中推荐的ezPyCrypto库。 请不要使用此库。它非常不完整,在某些情况下是不正确和高度不安全的。公钥算法存在许多缺陷,需要谨慎实施。 例如,RSA消息应该使用诸如PKCS#1,OAEP等的填充方案是安全的。这个库没有填充。 DSA签名应使用SHA1哈希函数。这个库使用破碎的MD5哈希值,随机数生成中甚至会出现更大的错误。因此,DSA实现既不符合标准也不安全。 ElGamal的实施也不正确。

遵循标准确实使实施更加复杂。但不遵循任何不是一种选择。如果你关心安全,至少不会。

答案 3 :(得分:0)

如果不使用任何其他库,更简单的例子就是:

def rsa():
# Choose two prime numbers p and q
p = raw_input('Choose a p: ')
p = int(p)

while isPrime(p) == False:
    print "Please ensure p is prime"
    p = raw_input('Choose a p: ')
    p = int(p)

q = raw_input('Choose a q: ')
q = int(q)

while isPrime(q) == False or p==q:
    print "Please ensure q is prime and NOT the same value as p"
    q = raw_input('Choose a q: ')
    q = int(q)

# Compute n = pq
n = p * q

# Compute the phi of n
phi = (p-1) * (q-1)

# Choose an integer e such that e and phi(n) are coprime
e = random.randrange(1,phi)

# Use Euclid's Algorithm to verify that e and phi(n) are comprime
g = euclid(e,phi)
while(g!=1):
    e = random.randrange(1,phi)
    g = euclid(e,phi)

# Use Extended Euclid's Algorithm 
d = extended_euclid(e,phi)

# Public and Private Key have been generated
public_key=(e,n)
private_key=(d,n)
print "Public Key [E,N]: ", public_key
print "Private Key [D,N]: ", private_key

# Enter plain text to be encrypted using the Public Key
sentence = raw_input('Enter plain text: ')
letters = list(sentence)

cipher = []
num = ""

# Encrypt the plain text
for i in range(0,len(letters)):
    print "Value of ", letters[i], " is ", character[letters[i]]

    c = (character[letters[i]]**e)%n
    cipher += [c]
    num += str(c)
print "Cipher Text is: ", num

plain = []
sentence = ""

# Decrypt the cipher text    
for j in range(0,len(cipher)):

    p = (cipher[j]**d)%n

    for key in character.keys():
        if character[key]==p:
            plain += [key]
            sentence += key
            break
print "Plain Text is: ", sentence

# Euclid's Algorithm
def euclid(a, b):
if b==0:
   return a
else:
   return euclid(b, a % b)

# Euclid's Extended Algorithm
def extended_euclid(e,phi):
d=0
x1=0
x2=1
y1=1
orig_phi = phi
tempPhi = phi

while (e>0):
  temp1 = int(tempPhi/e)
  temp2 = tempPhi - temp1 * e
  tempPhi = e
  e = temp2

  x = x2- temp1* x1
  y = d - temp1 * y1

  x2 = x1
  x1 = x
  d = y1
  y1 = y

  if tempPhi == 1:
      d += phi
      break
return d

# Checks if n is a prime number
def isPrime(n):
for i in range(2,n):
    if n%i == 0:
        return False
return True

character = {"A":1,"B":2,"C":3,"D":4,"E":5,"F":6,"G":7,"H":8,"I":9,"J":10,
     "K":11,"L":12,"M":13,"N":14,"O":15,"P":16,"Q":17,"R":18,"S":19,
     "T":20,"U":21,"V":22,"W":23,"X":24,"Y":25,"Z":26,"a":27,"b":28,
     "c":29,"d":30,"e":31,"f":32,"g":33,"h":34,"i":35,"j":36,"k":37,
     "l":38,"m":39,"n":40,"o":41,"p":42,"q":43,"r":44,"s":45,"t":46,
     "u":47,"v":48,"w":49,"x":50,"y":51,"z":52, " ":53, ".":54, ",":55,
     "?":56,"/":57,"!":58,"(":59,")":60,"$":61,":":62,";":63,"'":64,"@":65,
     "#":66,"%":67,"^":68,"&":69,"*":70,"+":71,"-":72,"_":73,"=":74}