Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在Py4A脚本中使用公钥加密?_Android_Encryption_Public Key Encryption_Sl4a - Fatal编程技术网

Android 如何在Py4A脚本中使用公钥加密?

Android 如何在Py4A脚本中使用公钥加密?,android,encryption,public-key-encryption,sl4a,Android,Encryption,Public Key Encryption,Sl4a,我正在开发一个运行在Android手机上的Py4a(Python in SL4a)应用程序。 应用程序收集一些敏感数据,然后使用smtplib模块通过电子邮件发送。 为了确保必要的保护,我需要加密这些信息。 由于手机被认为是不安全的设备,我必须使用公钥加密,只有收件人的公钥应该存储在手机中 标准Py4a发行版包含两个支持公钥加密的软件包: ssl和gdata。 不幸的是,它们都没有提供一个随时可用的函数,允许我用私钥加密更长的信息。 我知道实际上我应该生成一个随机的临时对称密钥,用这个密钥加密我

我正在开发一个运行在Android手机上的Py4a(Python in SL4a)应用程序。 应用程序收集一些敏感数据,然后使用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

也许这个解决方案远不是最优的,但至少是可行的。

因为手机是一个不安全的设备,你不能相信手机上计算的任何东西。如果您希望安全地完成某些操作,请在服务器上执行


至于您的问题,这就是公共加密(至少RSA)的工作原理:您不能加密任何长度超过密钥的数据。没有图书馆的原因是这是不可能的。如果您需要安全电子邮件,请使用S/MIME或GPG,不要试图重新发明轮子。还请注意,由于密钥需要在应用程序中,任何人都可以提取它并解密您的数据。如果您只是想安全地发送数据,更好的方法可能是通过HTTPS发送数据。这样,您就不需要管理客户端密钥,您的数据将在传输过程中得到保护。

我同意,手机是不安全的。但是,如果数据是在这个设备中收集的,那么当数据通过网络传输时,我至少需要保护它们。由于项目中的其他限制。这些数据不能通过专用服务器传输,必须以受保护的形式通过电子邮件发送。在我正在寻找的解决方案中,只有收件人的公钥存储在手机中——这根本不是秘密,也不会影响安全性。我希望我可以使用GPG,但它在Py4A中似乎不可用。在任何情况下,您都不能单独使用公钥进行加密。您需要使用对称加密来加密数据,然后发送加密密钥。要做到这一点并非易事,因此最好使用S/MIME这样的成熟解决方案。您可以直接使用Java或扩展Py4a(假设有可能)。这就是我在最初的问题“好吧,我知道事实上我应该生成一个随机临时对称密钥,用该密钥加密我的信息,最后用接收方的公钥只加密该密钥。”非常感谢。我会继续寻找正确的解决办法。啊,我现在明白你的意思了。除了在S/MIME库中,您不会找到一个函数可以完全实现这一点。如果不能使用其他库,则必须从现有的原语(密码、公钥等)构建它。请注意:您应该使用适当的加密填充,您的库应该支持一个(PKCS#1/7填充,等等)。无需加密IV,您可以将其与密文一起发送。理想情况下,您应该使用具有不同密钥的HMAC(或经过身份验证的加密,但这可能不受支持),以确保密文未被篡改(谷歌“填充oracle”)。