我正在尝试创建一个将用户登录到基于Django的服务器的Android应用程序。我试图通过加密用户名和密码来提高安全性,但由于某种原因,它不能在服务器端正确解密。
我怀疑它与Java加密有关,PyCrypto加密略有不同并导致兼容性问题,但我太绿了,不知道出了什么问题。
以下是应用程序上的加密代码(遵循this教程):
public String encrypt_rsa(String original) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
Resources res = getResources();
InputStream is = res.openRawResource(R.raw.public_key);
byte[] encodedKey = new byte[is.available()];
is.read(encodedKey);
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pkPublic = kf.generatePublic(publicKeySpec);
Cipher pkCipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
pkCipher.init(Cipher.ENCRYPT_MODE, pkPublic);
byte[] encryptedInByte = pkCipher.doFinal(original.getBytes());
String encryptedInString = new String(Base64Coder.encode(encryptedInByte));
is.close();
return encryptedInString;
}
这是我的Python代码
from Cryto.PublicKey import RSA
def decrypt(encoded_text):
f = open("/path_to_file/private_key.pem", 'r')
priv_key = RSA.importKey(f)
encrypted_text = base64.b64decode(encoded_text)
plain_text = priv_key.decrypt(encrypted_text)
return plain_text
非常感谢任何帮助!
答案 0 :(得分:0)
Java代码使用的是PKCS#1 v1.5 RSA加密,这是一种严重破坏且不安全的协议。
话虽如此,解密是在Python中使用适当的模块完成的:
from Crypto.Cipher import PKCS1_v1_5
priv_key = RSA.importKey(f)
cipher = PKCS1_v1_5.new(priv_key)
plain_text = cipher.decrypt(encrypted_text)
更多信息,请参阅the module documentation。