Python 中的 RSA 解密我如何获得字节数组?
RSA decryption in Python how i can get a bytes array?
我正在尝试通过 Python 使用 RSA。
我使用 Python 中生成的 public 密钥从 .net 进行加密。加密一切顺利。
当我解密我的加密句子时,我无法恢复到正确的值。
如何将我的值转换回字节数组?我确定我很接近......但什么也没找到
我用我的 public 密钥加密了这个字节数组,但是当我解密时我无法取回它
[0] 3 byte
[1] 180 byte
[2] 214 byte
[3] 196 byte
[4] 37 byte
[5] 120 byte
[6] 213 byte
[7] 71 byte
[8] 143 byte
[9] 64 byte
[10] 168 byte
[11] 245 byte
[12] 172 byte
[13] 178 byte
[14] 120 byte
[15] 114 byte
我使用的public键是:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwsfuJS3TFA5KmzBiFdpS
jl4gBG/oiQcd8JhB2hS2xi/3d/HnyQwzVFbnIuRFWxCSPbbO0M0IC2bE8g0ekWDj
b3YsW7POjVpz6xl/VfcTECIDq0/yGDj5O/FYWx8BGtaPTiTNHq7a5DUUANreYHuB
vzEYyr5lLzsSmZ9pG1BikR0dU5p01g64zJDNtYv6iHvIRseP/2T+Jv44XBLA0eBz
m7Q84dCIX/W8LjV6a6bp4kxBUJ4LYjG2BDslx7ZQMHz7gRFhauNQhyTGXTSLULY+
Q+fhUYhoL+RZjddlO/bn7fG1Evc6TiQi165/ZtfQuCJhkuet4q+Q5jUdUiLTUAfj
gwIDAQAB
-----END PUBLIC KEY-----
我的私钥是:
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAwsfuJS3TFA5KmzBiFdpSjl4gBG/oiQcd8JhB2hS2xi/3d/Hn
yQwzVFbnIuRFWxCSPbbO0M0IC2bE8g0ekWDjb3YsW7POjVpz6xl/VfcTECIDq0/y
GDj5O/FYWx8BGtaPTiTNHq7a5DUUANreYHuBvzEYyr5lLzsSmZ9pG1BikR0dU5p0
1g64zJDNtYv6iHvIRseP/2T+Jv44XBLA0eBzm7Q84dCIX/W8LjV6a6bp4kxBUJ4L
YjG2BDslx7ZQMHz7gRFhauNQhyTGXTSLULY+Q+fhUYhoL+RZjddlO/bn7fG1Evc6
TiQi165/ZtfQuCJhkuet4q+Q5jUdUiLTUAfjgwIDAQABAoIBAA5hwsS+AHLfp0SU
KvngF+5pJsYNGUdc3ioQo/QdSW2Sxxv1IZ8npnaYwBJEdpaFv7aM0/J44RouaWZR
76reU4y8VgQjX6HyRtLaHBvV1XOAf3LbwU1mj4iMhnCb9nHr28LyVq7oTENDZAm4
H2lSVT8vudvmeQQmwXXUXmdk5RI/yhl51yODc79E/LyQMSiItWQERdw0Tow29J/i
0/EDfTN7JmZHs5VQazBHwTUgWiJvdSL4zONCcXrAf2rDHZh7sjEftAWBd6ZJCb4H
IiKxHdDkI7gSjWOgYaepK+wL33kE7CfEHu4Iz869riCy9arIBse13GnDL/3ueDfL
sXQjGTkCgYEA2kLf6SD6fDUZa+RId2sRhA084jQgSo5Q1+is09svxd0KLHyMewPL
sfDZvsdHtqMuJnFDoFQhrcI68S0p4aUTS7qQfxFrvkOG0znnTic+/PHbELwhyIQR
KmF06iYsVMwAmYf805ntMvStTuloznBBOV62Vt39QlO6h8o2k4w4s38CgYEA5HW5
gg9oLkUA+9fhZBM2NqSi3L9AHLAjyIUz41f09zq0VWlwmqoXSRreReKcFAtz1M43
Pqpthsrqjxua2wSZbDon8hqJ+To3eWdKDloElh/Y1M3+RgsQOFLNQxoI0I8qqEhb
p2WPjwtKktFH8l7bGKoHHcvzwvQdQSLGrKY1Af0CgYEAumZWl+EES0OF/HCvut0D
zoUHtB/UXBgCzwH1Z9FPkWnfIHMV/pEVS1hofdfvVPkzlr0whiKTyLOSZxqtI/o4
6nngocSdAZbl9EsFUeeOkbNz5WzmZTr09f7ZPIdxYNIAyR4sPAK/Yr83q6cHTRbt
fTN4AeQAQL8FFKcLySL94b0CgYAow9DcIj+mse1hAr5XCw6LZYkh9oZMGCnqZ8pA
cLtnOfRfoTbUgjExfDfZJHxRH1IF0N4Osn5kpOSBsJ1LI2D07NOf4Zho/jhT01hl
gy56UyhvoGoUuXildDDoHkcgX8tux6qDDh41mgAufmVmHALgPcaTTIcsbD6kFr54
pBelSQKBgFXQSjj0XGHgDbe0ZRAcFgSuiKarnU2Ddms0Jc2eP+KnPFV+vPDOA8L0
Oo3RN9A8J9nUfbeiy/u/Vm8DcvdHxFIBPITcXTGDEz6ikI258QSCNFUaHwVICws7
598VcG9BkuTt0PJXQaTR1aWBBEBAhQ+iIig093Cb6ZZ/7pYz7WCj
-----END RSA PRIVATE KEY-----
我收到的输出是:
b"\x02-qf\xcc\xf8\x1c\xdc_bV\xa7\x84o\xc7K2k\xe6\xf0\xd4\x8e\x96\xef9\xbb\xe7%j\xa4h\xd5\xcd\xc1c\x0b\t\x98\x9d\xde\xd9\xe7\xe0druq\x90\xfc\xa5O\xd5\xd4\xb6\xec>\xbb($\x02u^\xb8\xe0\xd2W\x8bzL\x1f\xc0\x05\x1c\xf1\xea7\x99\x06\xd0\xa7ov\xa8A\xc3\x0b\x03\xf9\x1a\xac\x92Gn\xa7\xf0\x93v\xd0\xda\x89)G8\xc2e\xd4\xf5\te\x97\xcf a\x9e\xb5\xeei\xc4\xfci\xcd=/\xd3\xa5\x1fE\x0e\xcf\xaeD\x9fHA\x930\xa9EV\xee\x83\x17f\xe9\xc1\xb4\xc7s\xef%F\xb6!\xb4j\x14\xd4\xf1K\xa3r\x90\xbfI\xfd;\xca>zUcR\x16m\x82\x81iz\xb4C\xed\x1e\xdc\xa9\xfc\x0f\x87\xd7-\xde\x9f(l\x042^e\x84\x15\xb2k\x08\x82@\xd3m\x7f\x95\xabvM\xe6\x88\xb2;_\x0f'\xae\xdbvp\x83\xd6\xba\xc0F\x16\x87\xf1\xf0Y\x1fF~L\x18\x1d\x00\x03\xb4\xd6\xc4%x\xd5G\x8f@\xa8\xf5\xac\xb2xr"
有我的代码
我得到一个CryptoHelper.py
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Util import number
import base64
class CryptoHelper:
PrivateKeySize = 2048
def CreateRSA_CSP(self):
csp = RSA.generate(self.PrivateKeySize)
return csp
def GetRSA_PublicKey(self, csp):
return str(csp.publickey().exportKey(format='PEM'),"utf-8")
def RSAEncrypt(self,publicKEY,byteArray):
csp = RSA.importKey(publicKEY);
encrypted = csp.encrypt(byteArray)
return base64.standard_b64encode(encrypted)
def RSADecrypt(self,csp, byteArray):
return csp.decrypt(byteArray)
那是我的HandShakeHelper.py
import json
import requests
import base64
import uuid
from Helpers import CryptoHelper
class HandShakeHelper:
CSP = None
CryptoHelper = None
def __init__(self,serial,endPoint):
self.Serial = serial
self.EndPoint = endPoint
def GenerateHandShakeKey(self):
self.CryptoHelper = CryptoHelper.CryptoHelper()
self.CSP = self.CryptoHelper.CreateRSA_CSP()
self.InitializeHandShake()
def InitializeHandShake(self):
print(str(self.CSP.exportKey(format='PEM'),"utf-8"))
print(self.CryptoHelper.GetRSA_PublicKey(self.CSP))
headers = { "Content-Type" : "application/json" }
args = '{ args : { "Publickey" : "' + self.CryptoHelper.GetRSA_PublicKey(self.CSP) + '", "Serial" : "' + self.Serial + '" }}'
answer = requests.post(url = self.EndPoint +"/InitializeHandShake", headers=headers, data = args)
se_answer_raw = json.loads(answer.text)
se_answer = se_answer_raw["d"]
if(se_answer["Status"]==200):
cryptedBase64HandShakeId = base64.standard_b64decode(se_answer["CryptedHandShakeID"])
decryptedBytes = self.CSP.decrypt(cryptedBase64HandShakeId)
print(decryptedBytes)
握手助手调用网络服务。将 public 密钥发送到服务器,服务器 return 使用 public 密钥加密了一个我尝试解密的 CryptedToken。
那是我的Test.py
from Helpers import HandShakeHelper, CryptoHelper
handShake = HandShakeHelper.HandShakeHelper("8047771c-b1b0-408d-91ad-eacbc03ae6ca","http://www.localhost.com/webservice.asmx")
handShake.GenerateHandShakeKey()
.net 部分是这个
CryptoHelper.EncryptRSAContent(clientPublicKey, MyGuid.ToByteArray(), false)
public static byte[] EncryptRSAContent(string publicKey, byte[] content, bool fOAEP)
{
byte[] cryptedData = null;
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
if (publicKey.StartsWith("<RSAKeyValue>"))
{
RSA.FromXmlString(publicKey);
}
else
{
PEMCrypto.ImportPublicKey(publicKey, RSA);
}
cryptedData = RSA.Encrypt(content, fOAEP);
}
return cryptedData;
}
感谢@t.m.adaam 它工作正常
我用那个版本更正了我的CryptoHelper.py
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from Crypto.Util import number
from Crypto import Random
import base64
class CryptoHelper:
PrivateKeySize = 2048
def CreateRSA_CSP(self):
csp = RSA.generate(self.PrivateKeySize)
return csp
def GetRSA_PublicKey(self, csp):
return str(csp.publickey().exportKey(format='PEM'),"utf-8")
def RSAEncrypt(self,publicKEY,byteArray):
csp = RSA.importKey(publicKEY);
rsa_csp = PKCS1_v1_5.new(csp)
return base64.standard_b64encode(rsa_csp.encrypt(byteArray))
def RSADecrypt(self,csp, byteArray):
sentinel = Random.new().read(256)
rsa_csp = PKCS1_v1_5.new(csp)
return rsa_csp.decrypt(byteArray,sentinel)
我正在尝试通过 Python 使用 RSA。
我使用 Python 中生成的 public 密钥从 .net 进行加密。加密一切顺利。 当我解密我的加密句子时,我无法恢复到正确的值。
如何将我的值转换回字节数组?我确定我很接近......但什么也没找到
我用我的 public 密钥加密了这个字节数组,但是当我解密时我无法取回它
[0] 3 byte
[1] 180 byte
[2] 214 byte
[3] 196 byte
[4] 37 byte
[5] 120 byte
[6] 213 byte
[7] 71 byte
[8] 143 byte
[9] 64 byte
[10] 168 byte
[11] 245 byte
[12] 172 byte
[13] 178 byte
[14] 120 byte
[15] 114 byte
我使用的public键是:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwsfuJS3TFA5KmzBiFdpS
jl4gBG/oiQcd8JhB2hS2xi/3d/HnyQwzVFbnIuRFWxCSPbbO0M0IC2bE8g0ekWDj
b3YsW7POjVpz6xl/VfcTECIDq0/yGDj5O/FYWx8BGtaPTiTNHq7a5DUUANreYHuB
vzEYyr5lLzsSmZ9pG1BikR0dU5p01g64zJDNtYv6iHvIRseP/2T+Jv44XBLA0eBz
m7Q84dCIX/W8LjV6a6bp4kxBUJ4LYjG2BDslx7ZQMHz7gRFhauNQhyTGXTSLULY+
Q+fhUYhoL+RZjddlO/bn7fG1Evc6TiQi165/ZtfQuCJhkuet4q+Q5jUdUiLTUAfj
gwIDAQAB
-----END PUBLIC KEY-----
我的私钥是:
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAwsfuJS3TFA5KmzBiFdpSjl4gBG/oiQcd8JhB2hS2xi/3d/Hn
yQwzVFbnIuRFWxCSPbbO0M0IC2bE8g0ekWDjb3YsW7POjVpz6xl/VfcTECIDq0/y
GDj5O/FYWx8BGtaPTiTNHq7a5DUUANreYHuBvzEYyr5lLzsSmZ9pG1BikR0dU5p0
1g64zJDNtYv6iHvIRseP/2T+Jv44XBLA0eBzm7Q84dCIX/W8LjV6a6bp4kxBUJ4L
YjG2BDslx7ZQMHz7gRFhauNQhyTGXTSLULY+Q+fhUYhoL+RZjddlO/bn7fG1Evc6
TiQi165/ZtfQuCJhkuet4q+Q5jUdUiLTUAfjgwIDAQABAoIBAA5hwsS+AHLfp0SU
KvngF+5pJsYNGUdc3ioQo/QdSW2Sxxv1IZ8npnaYwBJEdpaFv7aM0/J44RouaWZR
76reU4y8VgQjX6HyRtLaHBvV1XOAf3LbwU1mj4iMhnCb9nHr28LyVq7oTENDZAm4
H2lSVT8vudvmeQQmwXXUXmdk5RI/yhl51yODc79E/LyQMSiItWQERdw0Tow29J/i
0/EDfTN7JmZHs5VQazBHwTUgWiJvdSL4zONCcXrAf2rDHZh7sjEftAWBd6ZJCb4H
IiKxHdDkI7gSjWOgYaepK+wL33kE7CfEHu4Iz869riCy9arIBse13GnDL/3ueDfL
sXQjGTkCgYEA2kLf6SD6fDUZa+RId2sRhA084jQgSo5Q1+is09svxd0KLHyMewPL
sfDZvsdHtqMuJnFDoFQhrcI68S0p4aUTS7qQfxFrvkOG0znnTic+/PHbELwhyIQR
KmF06iYsVMwAmYf805ntMvStTuloznBBOV62Vt39QlO6h8o2k4w4s38CgYEA5HW5
gg9oLkUA+9fhZBM2NqSi3L9AHLAjyIUz41f09zq0VWlwmqoXSRreReKcFAtz1M43
Pqpthsrqjxua2wSZbDon8hqJ+To3eWdKDloElh/Y1M3+RgsQOFLNQxoI0I8qqEhb
p2WPjwtKktFH8l7bGKoHHcvzwvQdQSLGrKY1Af0CgYEAumZWl+EES0OF/HCvut0D
zoUHtB/UXBgCzwH1Z9FPkWnfIHMV/pEVS1hofdfvVPkzlr0whiKTyLOSZxqtI/o4
6nngocSdAZbl9EsFUeeOkbNz5WzmZTr09f7ZPIdxYNIAyR4sPAK/Yr83q6cHTRbt
fTN4AeQAQL8FFKcLySL94b0CgYAow9DcIj+mse1hAr5XCw6LZYkh9oZMGCnqZ8pA
cLtnOfRfoTbUgjExfDfZJHxRH1IF0N4Osn5kpOSBsJ1LI2D07NOf4Zho/jhT01hl
gy56UyhvoGoUuXildDDoHkcgX8tux6qDDh41mgAufmVmHALgPcaTTIcsbD6kFr54
pBelSQKBgFXQSjj0XGHgDbe0ZRAcFgSuiKarnU2Ddms0Jc2eP+KnPFV+vPDOA8L0
Oo3RN9A8J9nUfbeiy/u/Vm8DcvdHxFIBPITcXTGDEz6ikI258QSCNFUaHwVICws7
598VcG9BkuTt0PJXQaTR1aWBBEBAhQ+iIig093Cb6ZZ/7pYz7WCj
-----END RSA PRIVATE KEY-----
我收到的输出是:
b"\x02-qf\xcc\xf8\x1c\xdc_bV\xa7\x84o\xc7K2k\xe6\xf0\xd4\x8e\x96\xef9\xbb\xe7%j\xa4h\xd5\xcd\xc1c\x0b\t\x98\x9d\xde\xd9\xe7\xe0druq\x90\xfc\xa5O\xd5\xd4\xb6\xec>\xbb($\x02u^\xb8\xe0\xd2W\x8bzL\x1f\xc0\x05\x1c\xf1\xea7\x99\x06\xd0\xa7ov\xa8A\xc3\x0b\x03\xf9\x1a\xac\x92Gn\xa7\xf0\x93v\xd0\xda\x89)G8\xc2e\xd4\xf5\te\x97\xcf a\x9e\xb5\xeei\xc4\xfci\xcd=/\xd3\xa5\x1fE\x0e\xcf\xaeD\x9fHA\x930\xa9EV\xee\x83\x17f\xe9\xc1\xb4\xc7s\xef%F\xb6!\xb4j\x14\xd4\xf1K\xa3r\x90\xbfI\xfd;\xca>zUcR\x16m\x82\x81iz\xb4C\xed\x1e\xdc\xa9\xfc\x0f\x87\xd7-\xde\x9f(l\x042^e\x84\x15\xb2k\x08\x82@\xd3m\x7f\x95\xabvM\xe6\x88\xb2;_\x0f'\xae\xdbvp\x83\xd6\xba\xc0F\x16\x87\xf1\xf0Y\x1fF~L\x18\x1d\x00\x03\xb4\xd6\xc4%x\xd5G\x8f@\xa8\xf5\xac\xb2xr"
有我的代码
我得到一个CryptoHelper.py
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Util import number
import base64
class CryptoHelper:
PrivateKeySize = 2048
def CreateRSA_CSP(self):
csp = RSA.generate(self.PrivateKeySize)
return csp
def GetRSA_PublicKey(self, csp):
return str(csp.publickey().exportKey(format='PEM'),"utf-8")
def RSAEncrypt(self,publicKEY,byteArray):
csp = RSA.importKey(publicKEY);
encrypted = csp.encrypt(byteArray)
return base64.standard_b64encode(encrypted)
def RSADecrypt(self,csp, byteArray):
return csp.decrypt(byteArray)
那是我的HandShakeHelper.py
import json
import requests
import base64
import uuid
from Helpers import CryptoHelper
class HandShakeHelper:
CSP = None
CryptoHelper = None
def __init__(self,serial,endPoint):
self.Serial = serial
self.EndPoint = endPoint
def GenerateHandShakeKey(self):
self.CryptoHelper = CryptoHelper.CryptoHelper()
self.CSP = self.CryptoHelper.CreateRSA_CSP()
self.InitializeHandShake()
def InitializeHandShake(self):
print(str(self.CSP.exportKey(format='PEM'),"utf-8"))
print(self.CryptoHelper.GetRSA_PublicKey(self.CSP))
headers = { "Content-Type" : "application/json" }
args = '{ args : { "Publickey" : "' + self.CryptoHelper.GetRSA_PublicKey(self.CSP) + '", "Serial" : "' + self.Serial + '" }}'
answer = requests.post(url = self.EndPoint +"/InitializeHandShake", headers=headers, data = args)
se_answer_raw = json.loads(answer.text)
se_answer = se_answer_raw["d"]
if(se_answer["Status"]==200):
cryptedBase64HandShakeId = base64.standard_b64decode(se_answer["CryptedHandShakeID"])
decryptedBytes = self.CSP.decrypt(cryptedBase64HandShakeId)
print(decryptedBytes)
握手助手调用网络服务。将 public 密钥发送到服务器,服务器 return 使用 public 密钥加密了一个我尝试解密的 CryptedToken。
那是我的Test.py
from Helpers import HandShakeHelper, CryptoHelper
handShake = HandShakeHelper.HandShakeHelper("8047771c-b1b0-408d-91ad-eacbc03ae6ca","http://www.localhost.com/webservice.asmx")
handShake.GenerateHandShakeKey()
.net 部分是这个
CryptoHelper.EncryptRSAContent(clientPublicKey, MyGuid.ToByteArray(), false)
public static byte[] EncryptRSAContent(string publicKey, byte[] content, bool fOAEP)
{
byte[] cryptedData = null;
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
if (publicKey.StartsWith("<RSAKeyValue>"))
{
RSA.FromXmlString(publicKey);
}
else
{
PEMCrypto.ImportPublicKey(publicKey, RSA);
}
cryptedData = RSA.Encrypt(content, fOAEP);
}
return cryptedData;
}
感谢@t.m.adaam 它工作正常
我用那个版本更正了我的CryptoHelper.py
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from Crypto.Util import number
from Crypto import Random
import base64
class CryptoHelper:
PrivateKeySize = 2048
def CreateRSA_CSP(self):
csp = RSA.generate(self.PrivateKeySize)
return csp
def GetRSA_PublicKey(self, csp):
return str(csp.publickey().exportKey(format='PEM'),"utf-8")
def RSAEncrypt(self,publicKEY,byteArray):
csp = RSA.importKey(publicKEY);
rsa_csp = PKCS1_v1_5.new(csp)
return base64.standard_b64encode(rsa_csp.encrypt(byteArray))
def RSADecrypt(self,csp, byteArray):
sentinel = Random.new().read(256)
rsa_csp = PKCS1_v1_5.new(csp)
return rsa_csp.decrypt(byteArray,sentinel)