C# 仅使用公钥创建非对称密码密钥对
我有点问题。我正在尝试编写一个客户机-服务器应用程序(实际上更像是POC),客户机从服务器请求公钥,然后服务器生成这个密钥C# 仅使用公钥创建非对称密码密钥对,c#,encryption,bouncycastle,C#,Encryption,Bouncycastle,我有点问题。我正在尝试编写一个客户机-服务器应用程序(实际上更像是POC),客户机从服务器请求公钥,然后服务器生成这个密钥asymmetricipherkeypair,如下所示 private static AsymmetricCipherKeyPair GenerateKeyPair() { RsaKeyPairGenerator g = new RsaKeyPairGenerator(); g.Init(new KeyGenerationParameters(
asymmetricipherkeypair
,如下所示
private static AsymmetricCipherKeyPair GenerateKeyPair() {
RsaKeyPairGenerator g = new RsaKeyPairGenerator();
g.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
var pair = g.GenerateKeyPair();
return pair;
}
static string EncryptString(string key, string message) {
string res = "";
using (var rsa = new RSACryptoServiceProvider(128)) {
try {
rsa.FromXmlString(string.Format("<RSAKeyValue>{0}</RSAKeyValue>", key));
byte[] b = Encoding.ASCII.GetBytes(message);
var encryptedData = rsa.Encrypt(b, true);
var base64Encrypted = Convert.ToBase64String(encryptedData);
res = base64Encrypted;
}
catch (Exception ex) {
}
finally {
rsa.PersistKeyInCsp = false;
}
return res;
}
}
这会正确地生成并可以正确地加密(在服务器端,但这不符合目的)
然后我向客户端发送一个序列化公钥
private static byte[] SerialisePublic(AsymmetricCipherKeyPair keypair) {
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keypair.Public);
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
return serializedPublicBytes;
}
private static void SendBytes(TcpClient client, byte[] send) {
NetworkStream stream = client.GetStream();
stream.Write(send, 0, send.Length);
stream.Flush();
}
但是现在,当我尝试初始化另一端的密钥对时,我需要一个私钥(这也会破坏目的)
我尝试了以下方法
private static AsymmetricCipherKeyPair GenerateKeyPair() {
RsaKeyPairGenerator g = new RsaKeyPairGenerator();
g.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
var pair = g.GenerateKeyPair();
return pair;
}
static string EncryptString(string key, string message) {
string res = "";
using (var rsa = new RSACryptoServiceProvider(128)) {
try {
rsa.FromXmlString(string.Format("<RSAKeyValue>{0}</RSAKeyValue>", key));
byte[] b = Encoding.ASCII.GetBytes(message);
var encryptedData = rsa.Encrypt(b, true);
var base64Encrypted = Convert.ToBase64String(encryptedData);
res = base64Encrypted;
}
catch (Exception ex) {
}
finally {
rsa.PersistKeyInCsp = false;
}
return res;
}
}
更新3
所以这不起作用,PublicKeyFactory
似乎不喜欢返回的密钥
正在GetInstance:Org.BouncyCastle.Asn1.DerApplicationSpecific中抛出:未知对象
我认为这可能是服务器端序列化和客户端反序列化的问题
因此,当客户端连接到服务器时,可以使用加密流来传输公钥和附加身份验证(密码短语、秘密敲门或笑话)
请继续关注
我不明白,您是否希望客户端和服务器同时拥有公钥和私钥?为什么?嗨,安德鲁,不,我不知道。我的意图是将公钥传递给客户机,然后客户机使用公钥加密数据并将其发送回服务器。然后服务器解密这些数据并对其进行处理。这是我第一次尝试使用加密和Bouncy Castle库。要初始化AsymmetricipherKeyPair,它需要两个参数(公钥和私钥),这两个参数都是只读的(因此需要另一个快速破解)。我对BouncyCastle库一无所知。但是,它必须允许您仅使用公钥加密消息。否则就没有意义了。请看这个问题:您的评论让齿轮转动,用正确的加密引擎初始化代码更新。我不明白,您是否希望客户端和服务器同时拥有公钥和私钥?为什么?嗨,安德鲁,不,我不知道。我的意图是将公钥传递给客户机,然后客户机使用公钥加密数据并将其发送回服务器。然后服务器解密这些数据并对其进行处理。这是我第一次尝试使用加密和Bouncy Castle库。要初始化AsymmetricipherKeyPair,它需要两个参数(公钥和私钥),这两个参数都是只读的(因此需要另一个快速破解)。我对BouncyCastle库一无所知。但是,它必须允许您仅使用公钥加密消息。看这个问题:你的评论让齿轮转动,用正确的加密引擎初始化代码更新。