C# C与C之间的RSA加密#

C# C与C之间的RSA加密#,c#,c,openssl,rsa,C#,C,Openssl,Rsa,我正在尝试编写一个简单的RSA加密方案来加密单个服务器和可能的多个客户端之间的一条小消息 我提出的计划是让客户端生成一个密钥对并将公钥发送到服务器。服务器有一个将存储套接字和公钥的对象。当需要发送消息时,服务器将调用客户端对象中的一个方法,该方法将加密消息并将其发送到客户端 我将只加密发送到客户端的消息,因此我不需要担心完整的密钥事务 我想我已经很清楚了 问题来自于尝试连接两种不同的RSA实现。服务器是用C#编写的,客户端是一个使用C的MetaTrader客户端。我决定使用OpenSSL来弥补这

我正在尝试编写一个简单的RSA加密方案来加密单个服务器和可能的多个客户端之间的一条小消息

我提出的计划是让客户端生成一个密钥对并将公钥发送到服务器。服务器有一个将存储套接字和公钥的对象。当需要发送消息时,服务器将调用客户端对象中的一个方法,该方法将加密消息并将其发送到客户端

我将只加密发送到客户端的消息,因此我不需要担心完整的密钥事务

我想我已经很清楚了

问题来自于尝试连接两种不同的RSA实现。服务器是用C#编写的,客户端是一个使用C的MetaTrader客户端。我决定使用OpenSSL来弥补这一差距,但到目前为止,我还无法在客户端上生成密钥。我正在使用c#()的openssl包装器,并试图为MetaTrader编写一个非常基本的包装器dll。到目前为止,它包含两个函数,GeneratorSakeys和DecryptRSA

现在,我只想生成一个包含公钥的PEM格式的字符串。这就是我到目前为止为GeneratorSakeys()所做的

现在,当向服务器发送buf时,我收到一个字符。例如,“X”



因此,我的第一个问题是,导出生成的公钥的最佳方法是什么?

您将返回一个指向堆栈上分配的缓冲区的指针;当函数返回时,此缓冲区将被覆盖。尝试
buf=新的无符号字符[1024]

返回指向堆栈上分配的缓冲区的指针;当函数返回时,此缓冲区将被覆盖。尝试
buf=新的无符号字符[1024]

欢迎来到Stackoverflow。在提问之前,请仔细阅读并仔细阅读..哎哟。我没有意识到这被认为是一个签名。
i2d
是“内部到订单”的缩写。如果您想要PEM输出,则必须使用不同的方法。另外,您的方法返回的指针是1024字节,而不是字符。将其作为字符串“打印”是没有意义的。试着用一个新的。祝你在阅读这些糟糕的文档时好运。这说明它返回的是地址而不是实际字符。至于DER vs PEM,我也不介意。我只需要弄清楚如何将公钥转换成可移植的格式,然后通过套接字发送出去。一根绳子会使它容易得多。我会开始调查简历的。我以前曾尝试阅读过这些文档,但正如您所指出的,这些文档还有一些地方需要改进。欢迎使用Stackoverflow。在提问之前,请仔细阅读并仔细阅读..哎哟。我没有意识到这被认为是一个签名。
i2d
是“内部到订单”的缩写。如果您想要PEM输出,则必须使用不同的方法。另外,您的方法返回的指针是1024字节,而不是字符。将其作为字符串“打印”是没有意义的。试着用一个新的。祝你在阅读这些糟糕的文档时好运。这说明它返回的是地址而不是实际字符。至于DER vs PEM,我也不介意。我只需要弄清楚如何将公钥转换成可移植的格式,然后通过套接字发送出去。一根绳子会使它容易得多。我会开始调查简历的。我以前试过阅读它们,但正如您所指出的,文档中还有一些地方不尽如人意。您可能知道,C不是我的第一语言。原始帖子已更新为代码的当前状态。它现在返回一个字符“X”。我想他应该把那边的小
更改为
malloc
调用;他把问题标记为C而不是C++。谢谢你的建议。我将行更改为
unsigned char*buf=(unsigned char*)malloc(1024)但是它和原来的没有什么不同。它只返回了一个“X”。您如何测试它是否返回了“X”?你真的在打印结果吗?打印二进制数据时要小心,在buf完全打印之前可能会出现一个空值,这将导致printf停止打印更多字符。请在调试器中运行您的程序,并在返回之前让我们知道buf的确切值。正如您可能知道的,C不是我的第一语言。原始帖子已更新为代码的当前状态。它现在返回一个字符“X”。我想他应该把那边的小
更改为
malloc
调用;他把问题标记为C而不是C++。谢谢你的建议。我将行更改为
unsigned char*buf=(unsigned char*)malloc(1024)但是它和原来的没有什么不同。它只返回了一个“X”。您如何测试它是否返回了“X”?你真的在打印结果吗?打印二进制数据时要小心,在buf完全打印之前可能会出现一个空值,这将导致printf停止打印更多字符。请在调试器中运行您的程序,并在返回buf之前让我们知道它的确切值
extern "C" unsigned char *__stdcall GenerateRSAKeys (){

int len;
unsigned char *buf = new unsigned char[1024];

rsa = RSA_generate_key(512,RSA_F4,NULL,NULL);

len=i2d_RSAPublicKey(rsa, &buf);

return buf;}