我正在开发在Android手机上运行的Py4a(SL4a中的Python)应用程序。 应用程序收集一些敏感数据,然后使用smtplib模块通过电子邮件发送。 为了确保必要的保护,我需要加密这些信息。 由于手机被认为是不安全的设备,我必须使用公钥加密,只有收件人的公钥才能存储在手机中。
标准Py4a发行版包含两个支持公钥加密的软件包:
ssl
和gdata
。
不幸的是,它们都没有提供随时可用的功能,允许我使用私钥加密更长的信息。
好吧,我知道实际上我应该生成一个随机的临时对称密钥,用该密钥加密我的信息,最后只用接收者的公钥加密这个密钥。但是,为了获得安全的解决方案,必须考虑一些细节......
所以我的问题来了。是否有任何简单的加密库,非常适合Py4a(即基于Py4a中已有的加密库,如ssl和gdata.Crypto),提供易于使用的公钥加密?
更新2013.06.13
我在Py4a中使用gdata库进行了一些实验。 最后,我得到了以下“快速和肮脏”的解决方案:
import gdata.tlslite.utils.keyfactory as rk
#Generate the recipient's RSA key
sec=rk.generateRSAKey(1024)
#obtain the publickey, which will be stored
#in the sender mobile phone
pubxml=sec.writeXMLPublicKey()
print pubxml
#Create the public key from XML
pub=rk.parseXMLKey(pubxml)
#
#Now lets simulate the sender
#It has only access to "pub"
#
import gdata.tlslite.utils.PyCrypto_AES as sk
import gdata.tlslite.utils.cipherfactory as cf
#Generate random key and initioalization vectors
key=sk.getRandomBytes(32)
iv=sk.getRandomBytes(16)
#Here we should check if the key and iv are reasonable
#Now we accept them as they are
#Text to encrypt
txt1="Strictly secret unknown text!"
#Pad the text to the length N*16
padlen=16-(len(txt1) % 16)
if padlen:
txt1=txt1.ljust(len(txt1)+padlen, " ")
#Create the AES key
ak=cf.createAES(key.tostring(),iv.tostring())
#Encrypt text
ctxt1=ak.encrypt(txt1)
#Encrypt key and initialization vector with recipients publickey
ckey1=pub.encrypt(key+iv)
#
# Now we simulate the recipient
# It has its secret key 'sec', and received encrypted key
# and iv from the sender in ckey1. It also receives ctxt1
#
pkey1=sec.decrypt(ckey1)
pkey=pkey1[0:32]
piv=pkey1[32:48]
# Now we decipher the text
pak=cf.createAES(pkey.tostring(),piv.tostring())
ptxt1=pak.decrypt(ctxt1)
# Print the deciphered text
print ptxt1
这个解决方案可能远不是最佳解决方案,但至少可行。
答案 0 :(得分:0)
由于手机是不安全的设备,因此您无法信任手机上计算的任何内容。如果您想要安全地完成某些事情,请在您的服务器上执行。
至于你的问题,这就是公共密码术(至少是RSA)的工作原理:你不能加密任何比密钥长的数据。没有图书馆的原因是它是不可能的。如果您需要使用S / MIME或GPG的安全电子邮件,请不要尝试重新发明轮子。另请注意,由于密钥需要位于应用程序中,因此任何人都可以提取密钥并解密您的数据。如果您只想安全地发送数据,更好的方法可能是通过HTTPS发送数据。然后,您无需管理客户端密钥,您的数据将在传输过程中受到保护。