java和python互通吗_与JAVA版RSA签名验签互通的Python3程序

1 from binascii importunhexlify2 from Crypto.PublicKey importRSA3 from Crypto.Cipher importPKCS1_OAEP, PKCS1_v1_54 importbase645 from Crypto.Hash importSHA1,MD56 from Crypto.Signature importpkcs1_157

8 def create_rsa_key(password="123456"):9 """

10 创建RSA密钥,步骤说明:11 1、从 Crypto.PublicKey 包中导入 RSA,创建一个密码(此密码不是RSA秘钥对)12 2、生成 1024/2048 位的 RSA 密钥对(存储在私钥文件和公钥文件)13 3、调用 RSA 密钥实例的 exportKey 方法(传入"密码"、"使用的 PKCS 标准"、"加密方案"这三个参数)得到私钥。14 4、将私钥写入磁盘的文件。15 5、使用方法链调用 publickey 和 exportKey 方法生成公钥,写入磁盘上的文件。16 """

17 key = RSA.generate(1024)18 encrypted_key = key.exportKey(passphrase=password, pkcs=8,protection="scryptAndAES128-CBC")19 #encrypted_key = key.exportKey(pkcs=1)

20 print('encrypted_key:',encrypted_key)21 with open("my_private_rsa_key.pem", "wb") as f:22 f.write(encrypted_key)23 with open("my_rsa_public.pem", "wb") as f:24 f.write(key.publickey().exportKey())25

26 def get_private_key(filepath,password="123456"):27 return RSA.import_key(open(filepath).read(),passphrase=password)28

29 defget_public_key(filepath):30 returnRSA.importKey(open(filepath).read())31

32 def rsa_MD5sign(message,privatekey_filepath,password="123456"):33 #读取私钥信息用于加签

34 private_key =get_private_key(privatekey_filepath)35 hash_obj =MD5.new(message)36 #print(pkcs1_15.new(private_key).can_sign()) #check wheather object of pkcs1_15 can be signed

37 #base64编码打印可视化

38 signature =base64.b64encode(pkcs1_15.new(private_key).sign(hash_obj))39 returnsignature40

41 defrsa_MD5signverify(message,signature,publickey_filepath):42 #读取公钥信息用于验签

43 public_key =get_public_key(publickey_filepath)44 #message做“哈希”处理,RSA签名这么要求的

45 hash_obj =MD5.new(message)46 try:47 #因为签名被base64编码,所以这里先解码,再验签

48 pkcs1_15.new(public_key).verify(hash_obj,base64.b64decode(signature))49 print('The signature is valid.')50 returnTrue51 except(ValueError,TypeError):52 print('The signature is invalid.')53

54

55 if __name__ == '__main__':56 private_key = """-----BEGIN ENCRYPTED PRIVATE KEY-----57 MIICXAIBAAKBgQDUrqmJYNpui84QJR/cdSjBDsLEqlNTpi0c9WlEo6uIuz7P4FFvbobY2P7MXKE4/qNQCJJB7GMf6LAjP3RE7WdgrgwSbFbppIO2IC6YmZcuYbA2lPJLeFolTMRVterY2vNTKb18oGR9kimqJPtQ0lrgTGRfhyn8HnVyZu+TQMqP6wIDAQABAoGAbMAu8o8ywgn8wSaqhwjlYOpST0uktgYn1UHrpOxn3s+YC6VxHqCOlT1H9Gl9Cu6xxU/MsabU/ND3l95vbntSOx90YTc4NOOjezRxy38obPaaGlNQM6E6R/eTYQfePbGIVlJvauTLJpKcVtBcN36SQe2+QcGfXFqkJ4ZdKoufzkECQQD1fBAz2SavG9r08wOzGUlUViciEXmts3KIEAnl44xMIAyVn4CKqaxxbm4QhREa07DElZqhtd9MRvRdPtt7AAnLAkEA3crlEIjaW+JC9OzSMsVGd9Peh/8trmba96XkNuOuMI5qk51rs2luzfH1kld+h1lYnVN9fito4qXkny+PqwFOYQJBAPCyk6Ry4AZEVr1kZhU+zvK9gqNZ5SfW0o7swvfA1Hhz2EMA4OWVFnsmHw9dmfbm5+TpF3RFwsukqsee8U86K18CQEDSVdRZSwhjvpH6zQxNn+TRpU42BFHeecy7TVHFhVlnpjpyXdHX1KyYNN+Kds50DHQevKStZ0AmoATuT5z5CsECQFGLa3X5nhpc7E5ZboUkNtmrguN43BE2aIdr0crbu56HhFEOZQ/vWxa/Jnu8o+RcsmNlNGcpf5oFTznmiz5eTWQ=58 -----END ENCRYPTED PRIVATE KEY-----"""

59 public_key = """-----BEGIN PUBLIC KEY-----60 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUrqmJYNpui84QJR/cdSjBDsLEqlNTpi0c9WlEo6uIuz7P4FFvbobY2P7MXKE4/qNQCJJB7GMf6LAjP3RE7WdgrgwSbFbppIO2IC6YmZcuYbA2lPJLeFolTMRVterY2vNTKb18oGR9kimqJPtQ0lrgTGRfhyn8HnVyZu+TQMqP6wIDAQAB61 -----END PUBLIC KEY-----"""

62 message = b'123456'

63 privatekey_filepath = "my_private_rsa_key.pem"

64 publickey_filepath = "my_rsa_public.pem"

65

66 #create_rsa_key()

67 #signature = rsa_MD5sign(message,privatekey_filepath)

68 #print('signature:',signature)

69 #signature是java程序使用相同公钥对字符串"123456"的MD5withRSA签名结果

70 signature='n6iuYyfl4vVvOWSVCAlLpK/1ZWscRIYn2Gaql6DcozkXgtfn2r3CnWQPMB4gt+GW2HT7G7ML+B0wMpRPMWwo9VHh5EJzghTiMkRqgjoOAfDNC0gg7fvZVW4XwUv9NdRDh9ij2DO4PmwvQG6JV7mMp1+y6ox89r0MA2w9O5oKaeY='

71 print(rsa_MD5signverify(message,signature,publickey_filepath))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值