需要将以下python签名验证码转换为Andorid吗?

问题描述 投票:1回答:1
我为python3应用程序创建了RSA密钥对。

from Crypto.PublicKey import RSA print("--Private Key Generate--") key = RSA.generate(2048) private_key = key.export_key() file_out = open("key/private.pem", "wb") file_out.write(private_key) file_out.close() print("--Public Key Generate--") public_key = key.publickey().export_key() file_out_1 = open("key/receiver.pem", "wb") file_out_1.write(public_key) file_out_1.close() print("key Generated")

我使用python对一些数据进行签名并创建签名。它还可以成功地使用python进行验证。

def sign(data): private_key = RSA.import_key(open('key/private.pem').read()) h = SHA256.new(data) signature = base64.b64encode(pss.new(private_key).sign(h)) print("signature generate") verify(data,signature) return signature def verify(recive_Data ,signature): public_key = RSA.import_key(open('key/receiver.pem').read()) h = SHA256.new(recive_Data) verifier = pss.new(public_key) try: verifier.verify(h, base64.b64decode(signature)) print("The signature is authentic") except (ValueError, TypeError): print ("The signature is not authentic.")

但是要在Andorid中使用我的验证工具(最低SDK 23,目标SDK 29)。因此,我需要将此验证码转换为Android。我尝试使用以下代码,但未成功。需要一些专家帮助。 

public class SecurityHelper { private static String getKey(InputStream filename) throws IOException { // Read key from file String strKeyPEM = ""; BufferedReader br = new BufferedReader(new InputStreamReader(filename)); String line; while ((line = br.readLine()) != null) { strKeyPEM += line + "\n"; } br.close(); // System.out.println(strKeyPEM); return strKeyPEM; } public static PublicKey getPublicKey(InputStream filename) throws IOException, GeneralSecurityException { String publicKeyPEM = getKey(filename); return getPublicKeyFromString(publicKeyPEM); } public static PublicKey getPublicKeyFromString(String key) throws IOException, GeneralSecurityException { String publicKeyPEM = key; publicKeyPEM = publicKeyPEM.replace("-----BEGIN PUBLIC KEY-----\n", ""); publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", ""); System.out.println(publicKeyPEM); byte[] encoded = Base64.decode(publicKeyPEM ,Base64.CRLF); // System.out.println(encoded); KeyFactory kf = KeyFactory.getInstance("RSA"); PublicKey pubKey = kf.generatePublic(new X509EncodedKeySpec(encoded)); System.out.println(pubKey); return pubKey; } public static boolean verify(PublicKey publicKey, String message, String signature) throws SignatureException, NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException, InvalidAlgorithmParameterException { Signature sign = Signature.getInstance("SHA256withRSA"); sign.initVerify(publicKey); sign.update(message.getBytes("UTF-8")); System.out.println(message); return sign.verify(Base64.decode(signature,Base64.CRLF)); } }

digital-signature java rsa python
1个回答
0
投票
在Python代码PSS和Android代码Pkcs#1 v1.5中使用了不同的填充,请参见区别RFC 8017。用SHA256withRSA替换Android代码SHA256withRSA/PSS
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.