我正在开发一个在 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
可能这个解决方案远非最佳,但它至少有效。