Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不支持使用python中提供RSA密钥格式的pem文件加密json_Python_Python 3.x_Rsa_Pycrypto - Fatal编程技术网

不支持使用python中提供RSA密钥格式的pem文件加密json

不支持使用python中提供RSA密钥格式的pem文件加密json,python,python-3.x,rsa,pycrypto,Python,Python 3.x,Rsa,Pycrypto,我正在开发一个加密模块,其中请求采用加密JSON格式的参数。此加密由服务器提供的公钥完成,如下所示: def encrypt_bank_request(request_payload): key = "" url = "http://localhost/payment/gateways/mybank.pem" file = urllib.request.urlopen(url) decoded_file = file.rea

我正在开发一个加密模块,其中请求采用加密JSON格式的参数。此加密由服务器提供的公钥完成,如下所示:

def encrypt_bank_request(request_payload):
    key = ""
    url = "http://localhost/payment/gateways/mybank.pem"
    file = urllib.request.urlopen(url)
    decoded_file = file.read().decode("utf-8")
    for line in decoded_file:
        key += line

    keyDER = base64.b64decode(key)
    keyPub = RSA.importKey(keyDER)
    cipher = Cipher_PKCS1_v1_5.new(keyPub)
    cipher_text = cipher.encrypt(request_payload.encode())
    emsg = base64.b64encode(cipher_text)
    print(emsg);
$pemKey = file_get_contents("http://localhost/payment/gateways/mybank.pem");
openssl_public_encrypt($request_payload, $encrypted, $pemKey);
但是当我执行代码时,我会在
keyPub=RSA.importKey(keyDER)
上看到以下内容:

值错误在/

不支持RSA密钥格式

我试图实现的PHP等价物如下所示:

def encrypt_bank_request(request_payload):
    key = ""
    url = "http://localhost/payment/gateways/mybank.pem"
    file = urllib.request.urlopen(url)
    decoded_file = file.read().decode("utf-8")
    for line in decoded_file:
        key += line

    keyDER = base64.b64decode(key)
    keyPub = RSA.importKey(keyDER)
    cipher = Cipher_PKCS1_v1_5.new(keyPub)
    cipher_text = cipher.encrypt(request_payload.encode())
    emsg = base64.b64encode(cipher_text)
    print(emsg);
$pemKey = file_get_contents("http://localhost/payment/gateways/mybank.pem");
openssl_public_encrypt($request_payload, $encrypted, $pemKey);
openssl\u public\u encrypt
按照建议使用公钥加密数据,并将结果存储到
$encrypted

我做错了什么?是否因为函数需要RSA key对象,而我提供的是字符串,在这种情况下,如何将字符串转换为RSA key对象

我指的是,,

谢谢你的建议

另外,我的钥匙如下:

MIIGPjCCBSagAwIBAgIRAJig5hCghJQ8AAAAAFDbeaEwDQYJKoZIhvcNAQELBQAwgboxCzAJBgNV
BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu
bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1
dGhvcml6ZWQgdXNlIG9ubHkxLjAsBgNVBAMTJUVudHJ1c3QgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
dHkgLSBMMUswHhcNMTcwMjE1MDYyMzM5WhcNMTgwMjE0MDY1MzM3WjBxMQswCQYDVQQGEwJJTjEO
MAwGA1UECBMFVGhhbmUxEjAQBgNVBAcTCVBhdGxpcGFkYTEbMBkGA1UEChMSSUNJQ0kgQmFuayBM
aW1pdGVkMSEwHwYDVQQDExhlYXp5cGF5YXBpLmljaWNpYmFuay5jb20wggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQDMzgMIqYh4HJScGoIguQFDg7+dcNY7V9BJRWdxE0L5BVHf83vGi36k
9jXXBFB7n16opD4QBEUV4uRrOisZeWA6cMGG7NTqwx1sCXxVdz/rXNqiAiWUXa+p7SsRqnbroK4k
st0mvLRI0bWvBDLw6AHhVF7+xdFRrR+d3zChM8Y3n58ZHiTMgeFf5gBFNC36frdwGR/Fp/naAu/G
1ntRa7rHLS/wuMjNg+j10ka8jfrkRf6Uxi3ogt/FjnEE0/k+xVqvMp2tlPi1mZlUb08CT2/ulfEb
lg6wBoWvipabnp8plK05L+vt1E4MXLkIbdu2WXuUNGSY5AREbWQRO6zmS12i2i3kdQHgq9bIsvMu
FzIbWuvG19btL+Vs/UtBa6FoHyLrbT+h3UDt4insSwxd0Lsxze/G91wFR8w9xGrcmGv5m2yCQuhz
6bDREiV0u6xNMn8FpTph63zU39OcdE0RQXpkAVRy6c/A2YKlAFLkaeOODDTfMbSohOQLV3DT/2Kr
wQ6o0QkT+WAC4z7RCnbhPujhop5mIzyMWtSIVx/+50fmJOQvF+QqifXOb0/XzJnhtNy8vgw8C7k7
xRMGwcgHEtxVJCU162UU3rjVtA7/DKFDoK/P47DLf4c2VT5OY98jLgz5Ez+GDCquQjY/zocYp4bA
sG/I+LCqnEAxQA2S2lNg4wIDAQABo4IBhTCCAYEwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoG
CCsGAQUFBwMCMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvbGV2ZWwx
ay5jcmwwSwYDVR0gBEQwQjA2BgpghkgBhvpsCgEFMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cu
ZW50cnVzdC5uZXQvcnBhMAgGBmeBDAECAjBoBggrBgEFBQcBAQRcMFowIwYIKwYBBQUHMAGGF2h0
dHA6Ly9vY3NwLmVudHJ1c3QubmV0MDMGCCsGAQUFBzAChidodHRwOi8vYWlhLmVudHJ1c3QubmV0
L2wxay1jaGFpbjI1Ni5jZXIwIwYDVR0RBBwwGoIYZWF6eXBheWFwaS5pY2ljaWJhbmsuY29tMB8G
A1UdIwQYMBaAFIKicHTdvFM/z3vU981/p2DGCky/MB0GA1UdDgQWBBSG2RKU6li1ezRacfLkf5Tr
kECMPjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBvVGUQGLBhs9GNpNjLTVdc3WY5pYQE
5fP/otaX7GBx4bRrRZlPPh/vzIg79Ry9vs/GdvZIiyVczKZeB2ih9PKJySWEPXPgnR+aroHnQMVK
hOhBoKcohtpUmjnQLgL400h6NkQ9GS0yDebLlbJxicGIAhq+OSJhUXeYKLIk38ngPCYwL+PjHPn9
1ds0ehCuOFMuKKaY4e+hsKzc8KZPyTM7hbtw86kbheOizTGQ8M9s8ZTRnTYblSPk5w5A3fqaikG7
bAYKNWcdBGgdOCnHHCDPSP0ghtf4klR1tT99PSW1HHZ/VL8tmvw+/YNXzIdNxB+MPm3OM/A8Dz6i
khpZKNeP
您需要使用,而不是PyCrypto,并且密钥必须是base-64并带有适当的
----BEGIN…
----END…
行,或者您必须自己对base64编码的blob进行base64解码并将结果字节提供给

从Cryptodome.PublicKey导入RSA
证书=''MIIGPJCCBSAGAWIBAGIRAJIG5HCGHJQ8AAAAAFDBEAEWDQYJKOZHIVCNAQELBQAWGBOXCZAJBGNV
BaytalVTMrywfaydvqkew1fbnrydxn0lcbjbmmumsgwjgydvqlex9tzwugd3lmvudhj1c3qu
BMV0L2XLZ2FSLXRLCM1ZMTKWNWYDVQLEZAOYYKGMJAXMIBFBNRYDXN0LCBJBMMUIC0GZM9YIGF1
DGHVCML6ZWQGDXNLIG9UBHKXLJASBGNBAMTJUVUDHJ1C3QGQ2VydglmawnhdglvbibbdxRob3JP
DHKGLSBMUSWHHCNMTCWMJE1MDYYMZM5WHCNMTGWMJE0MDY1MZM3WJBXMQSWCQYDVQGEWJJTJEO
MAWGA1UECBMFGHHBMUXEJAQBGNVBACTCVBHDGXPCGFKYTEBMBKGA1UECHMSUNQ0KGQMFUAYBM
AW1PDGVKMSEWHYDVQDxEXPLYXP5CGF5YXBPLMLJAWNPYUAY5JB20WGGIIMA0GCSQGSIB3DQEB
AQUAA4ICDwAwggIKAoICAQDMzgMIqYh4HJScGoIguQFDg7+dcNY7V9BJRWdxE0L5BVHf83vGi36k
9JXXBFB7N16 OPD4QBEUV4URROISZEWA6CMGG7NTQWX1SCXXVDZ/rXNqiAiWUXa+p7SsRqnbroK4k
st0mvLRI0bWvBDLw6AHhVF7+xdFRrR+d3zChM8Y3n58ZHiTMgeFf5gBFNC36frdwGR/Fp/naAu/G
NTRA7RHLS/wuMjNg+j10ka8jfrkRf6Uxi3ogt/FjnEE0/k+xVqvMp2tlPi1mZlUb08CT2/ulfEb
lg6wBoWvipabnp8plK05L+VT1E4MXLKIBDU2WXUNGSY5AREBWQRO6ZMS12I3KDQHGQ9BISVMU
FzibWwG19BTL+Vs/UtBa6FoHyLrbT+h3UDt4insSwxd0Lsxze/G91WFR8W9GRCMGV5M2YCQUHz
6bDREiV0u6xNMn8FpTph63zU39OcdE0RQXpkAVRy6c/A2YKLAFKAEOODDTFMBSOQLV3DT/2Kr
wQ6o0QkT+WAC4z7RCnbhPujhop5mIzyMWtSIVx/+50fmJOQvF+QqifXOb0/XzJnhtNy8vgw8C7k7
XRMGWCHETXVJCU162UU3RJVTA7/DKFDoK/P47DLf4c2VT5OY98jLgz5Ez+GDCquQjY/zocYp4bA
sG/I+LCQNEAXQA2S2LNG4WIDAQABO4IBHTCCayewDvR0PAQH/BAQDAGWGMBGA1UDJQQMAOG
CCsGAQUFBwMCMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvbGV2ZWwx
AY5JCMWWSWYDVR0GBEQWQJA2BGGHKGBHPSCGEFMCGWJGYIKWYBBQUHAGEWGMH0DHA6LY93D3CU
ZW50CNVZDC5UZXQVCNBHMAGGBMEBDAECAJBOBGGRBGEFBQCBAQRCMFOWIWYKWYBBQUHMAGGF2H0
Dha6ly9Vy3NWUDHJ1C3QUBMV0MDBMCCCSGAQUFBZACHIDHRWOI8VYWLHMVUDHJ1C3QUBMV0
l2wxay1jagfpbji1ni5jzxiwiwydvr0rbbwgoiyzwf6exbhewwas5p2ljawjhbmsuy29tmb8g
A1UdIwQYMBaAFIKicHTdvFM/z3vU981/p2DGCky/MB0GA1UDGQWBBSG2RKU6LI1ZRACFLKF5TR
KECMPJAJBGNVHRMEAJAMA0GCSQGSIB3DQEBCWUAA4 IBAQBVVGUQGLBHS9GNPNJLTVDC3WY5PYQE
5fP/otaX7GBx4bRrRZlPPh/vzIg79Ry9vs/GDVZIYVCZK2IH9PKJYSWEPXPGNR+aroHnQMVK
HohbokCohtpumJNQLGL400H6NKQ9GS0YDEBLJXICGIAHQ+OSJhUXeYKLIk38ngPCYwL+PjHPn9
1ds0ehCuOFMuKKaY4e+hsKzc8KZPyTM7hbtw86kbheOizTGQ8M9s8ZTRnTYblSPk5w5A3fqaikG7
bAYKNWcdBGgdOCnHHCDPSP0ghtf4klR1tT99PSW1HHZ/VL8tmvw+/YNxZINXB+MPm3OM/A8Dz6i
khpZKNeP“
证书='----开始证书------\n'+cert+'\n-----结束证书------
r=RSA.importKey(证书)
印刷品(r.n)
打印出模数

835530417319735322904421462459451063654010910036490131542528939590706305612565738190465258970018362442504314027037982757378964476628610126628643741295376455983157717853926501344173174543509081666215334337886432121330318119586463591986644236407155160633403615394726359135900210267964618093240043978235544727335109686553571844741498488578037894004729516832328328853475766210938149668579224549929585498616511012055116486617256405348752281221841113593203898211327673790225447988279497436707544397419647915422702720143667984437532004226144606948907602116888194895153345334011560415740885466004583157439110458828130795408434017885187061379936745660293815100292079970030432352403962499538301054633885062147509036462581226410523337358445683232465510709519096907784307249725979290562163532705329623550196710312110800265447584580251840590731044582860060553698109052225806921430613417139832332963970234067131600542381764969722189768692969004592637189607748143035304212536331626692025074578149324603263114533612082445070491074737755256358022645183110670751682994979892626789172684974128522083229506601674218910572247739238520579221342029941195041299137018203411248036919473974612176366220589057599358170063558334757947393372489019738067582542051

键字符串。您显示的缺少
----BEGIN…
----END
行,我希望类似这样:
----BEGIN RSA PRIVATE KEY------
然后是字符串,然后是
----END RSA PRIVATE KEY------
,而且您的密钥字符串似乎已损坏。当我手动添加
BEGIN
END
行时,我尝试使用
openssl
命令
openssl rsa-in keyfile.key-noout-text
解析字符串,然后我得到一个输出,比如
无法加载私钥139695176668824:error:0D0680A8:asn1编码例程:asn1\u CHECK\TLEN:error tag:tasn\u dec.c:1217:
如果我加载一个有效密钥文件,我会得到关于密钥的完整信息,看起来有点像
私钥:(2048位)模数:00:af:9e:d8:fa:9d:7e:da:21:e1:ce:5d:39:eb:aa:
密钥最初有
----开始证书----
----结束证书----
,但每当我执行时,我得到
不正确的填充
,当我在线检查时,它会给出关于密钥的正确信息。您拥有的不是公钥,这是一个X.509证书。在该证书中,只有一个字段中有公钥。您需要将
开始..
结束..
行放回原处,或者base64解码您拥有的内容并提供给导入密钥。我猜你用的是pycryptodome软件包,对吧?