C# 如果我有私钥,如何解密?
我在Python中是这样进行加密的
def encrypt_RSA(public_key_loc, message):
'''
param: public_key_loc Path to public key
param: message String to be encrypted
return base64 encoded encrypted string
'''
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
key = open(public_key_loc, "r").read()
rsakey = RSA.importKey(key)
rsakey = PKCS1_OAEP.new(rsakey)
encrypted = rsakey.encrypt(message)
return encrypted.encode('base64')
我在C#中尝试这样解密,但没有成功
namespace ConsoleApplication1
{
class Program
{
private static string _message = @"gvVweOVn/+IBKNrFV1sb+khVu8PdBC78WusGH7IuCXxK4pEsFo8JbOb68phJAMVM1F8XPoq1PX4D
0VuVPmDFHadOUr59IX0IBbQ72bQ1/BoINimSVOzXRbHOfsNxd0kIEdCv6jNlA7ut7hcoGUz6XzdM
b+k8N2K9Dykjehoo9gZEhaXnws1YiuBVN4B+XyjB1VUrgji9fW60lcpL+0UYZ5mcUvK6T7hS7R9W
9QIf5T02iZJLsp3hxS9j/UxPCvK5Cj6t2h4fRCOYgiQv0L21ZD23nKYWgiGyGEmfArqIswUmZ0h2
I2zMs9vC2JVFIid6FpExHUScItBeuM8qYLA/YQ==";
static void Main(string[] args)
{
Decrypt(_message);
}
private static void Decrypt(string text)
{
StreamReader sr = new StreamReader("./key.private");
PemReader pr = new PemReader(sr);
AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject();
RSAParameters rsa = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)KeyPair.Private);
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(2048);
csp.ImportParameters(rsa);
var bytesCypherText = Convert.FromBase64String(text);
var bytesPlainTextData = csp.Decrypt(bytesCypherText, false);
var plainTextData = System.Text.Encoding.Unicode.GetString(bytesPlainTextData);
Console.WriteLine(plainTextData);
}
}
}
出现了坏数据的异常
在Python这边,我是这样解码的。
def decrypt_RSA(private_key_loc, package):
'''
param: public_key_loc Path to your private key
param: package String to be decrypted
return decrypted string
'''
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from base64 import b64decode
key = open(private_key_loc, "r").read()
rsakey = RSA.importKey(key)
rsakey = PKCS1_OAEP.new(rsakey)
decrypted = rsakey.decrypt(b64decode(package))
return decrypted
在这种情况下,私钥是如何影响工作的呢?
提前谢谢你!
2 个回答
0
var bytesPlainTextData = csp.Decrypt(bytesCypherText, false);
应该是
var bytesPlainTextData = csp.Decrypt(bytesCypherText, true);
因为你在你的Python代码中使用了PKCS1_OAEP填充方式。
1
在Python这边,你把加密后的字符串进行了base64编码。在用C#解密之前,你需要先把它进行base64解码。此外,你还得确保两边的加密参数(比如块模式、填充方式等)是一样的。