Help verifying RSA signed text with Python
Question: Using Java I have created RSA keypairs. Using Java I can use these keys to
sign and verify some text. I can also "export" these keys in PEM format and
load them into a Python test script. Once in the Python script, I can use
these keys to sign and verify some text using M2Crypto.

I have not yet been able to verify in Python the signature I created in Java.

Right now I am just trying to get cross-platform signing and verifying to
work.

Here is Java snippet:

    
    
    Signature sig = Signature.getInstance("MD5WithRSA");
    sig.initSign(key.getPrivate());
    sig.update("This is a message.".getBytes("UTF8"));
    byte[] signatureBytes = sig.sign();     
    return Base64.encodeBytes(signatureBytes, Base64.DO_BREAK_LINES);
    

Which generates:

    
    
    PIp4eLhA941xmpdqu7j60731R9oWSNWcHvwoVADKxABGoUE02eDS0qZ4yQD2vYBdRDXXxHV4UjtW
    YQwv9nsOzCBWeDQ0vv6W0dLVfTBuk79On7AALuwnTFr8s0y5ZN5RINvPPR60mwONav26ZbPj4ub3
    NZqUS/zkqyO8Z8D2zUjk0pqAhWDGbFBaWPQJBPOY9iRt8GlsAUkGfYGeIx9DNU8aiJmQ3NnUHbs4
    5NEr3xydbNJjwK96kkNJ9vyKZRfnNd4eW2UllPiwJSRQgefCQfh79ZuiYeQEuk3HMh7Si4iYl7uU
    rWCgYFl4fGV1X/k+BSHR4ZZFWGQ3IPfafYHyNw==
    

And here is the public key:

    
    
    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg+N7xQHVHU3VHMZ9VGFdUf6ud3rAL8YS
    sfWv2zFMnKAjh6XacwDGX6jJR/0/pyDriRGw/uodBDSFvgn9XEM/srMYtbJ1KQ9R9ChDifixF3Hx
    yzbzPRvFoEfZnS/63+d1r0wnafz7xx0eDEYE3TgRKTMikwOsuIOFWa7GhA4BvP7ad79bI5ORJdLu
    9Je+k+4dbt0xk2t7YopxYmyU+4zhZMxuthJTr69rXgqhgsCRdK6kFIGm3YuJ1WQcci8OVwH+3o7F
    XzJHpSTxH57m6PX5lXaywIDCbUauTpBV3w+0vTeGI/2o+U40qhLBkpZT9GSVKxgXl5a0XxrkwTGn
    61XZqQIDAQAB
    -----END PUBLIC KEY-----
    

Then in Python the key is loaded and the signature is attempted to be
verified:

    
    
    from M2Crypto import RSA, EVP
    pub_key = RSA.load_pub_key('public_key.pem')
    verify_evp = EVP.PKey()
    verify_evp.assign_rsa(pub_key)
    verify_evp.verify_init()
    verify_evp.verify_update("This is a message.")
    if verify_evp.verify_final(sig_string.decode('base64')) == 1:
        print "Good"
    else:
        print "Bad"
    

And this does not verify. I suspect it is some leading or trailing characters
or encoding weirdness that I don't understand.

I have no particular attachement to M2Crypto and have played a bit with the
gdata.tlslite modules as well.

Please note that the keys are working, and that the text and signature above
verify in Java, and the keys (public and private) can be used within Python to
sign and verify text. The problem is somewhere in how Java-generated signature
and/or the message text is getting into the Python code.

What am I doing wrong?


Answer: `M2Crypto.EVP` defaults to 'sha1' (SHA1) and you're using `MD5WithRSA`. I
think you should switch `SHA1WithRSA` (MD5 is a **very** weak algorithm).

