我有点问题。我尝试编写客户端 - 服务器应用程序(更多是POC),客户端从服务器请求公钥,然后服务器使用以下内容生成此密钥AsymmetricCipherKeyPair
private static AsymmetricCipherKeyPair GenerateKeyPair() {
RsaKeyPairGenerator g = new RsaKeyPairGenerator();
g.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
var pair = g.GenerateKeyPair();
return pair;
}
这可以正确生成,并且可以正确加密和加密(在服务器端,但这会破坏目的)
然后我将序列化的公钥发送到客户端
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();
}
但是现在,当我尝试初始化其他方面的keypair
时,我需要一个私钥(这也违背了目的)
我尝试了以下
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;
}
}
(在没有密钥对的情况下,我以为我可以破解它)
但是,由于这不包含加密所需信息的近一半,因此很难实现。如果可能的话,我想继续使用Bouncy Castle,不过我愿意接受建议。
提前致谢。
更新
客户端和服务器都是用C#编写的
更新2(感谢安德鲁)
这将使用服务器提供的公钥初始化RsaEngine
(或至少应该)(这不起作用,不要使用它)
static byte[] EncryptBytes(byte[] key, byte[] message) {
byte[] res = null;
AsymmetricKeyParameter ic = (AsymmetricKeyParameter)PublicKeyFactory.CreateKey(key);
RsaEngine e = new RsaEngine();
e.Init(true, ic);
res = e.ProcessBlock(message, 0, message.Length);
return res;
}
更新3
所以这不起作用,PublicKeyFactory
似乎不喜欢返回的密钥
投掷:Unknown object in GetInstance: Org.BouncyCastle.Asn1.DerApplicationSpecific
我认为这可能是服务器端的序列化问题,然后是客户端的反序列化问题。
当客户端连接到服务器时,可能是CryptoStream
用于传输公钥和附加身份验证(密码,秘密敲门或笑话)。
敬请关注