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)); } }
SHA256withRSA
替换Android代码SHA256withRSA/PSS
。