首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZeroMQ C# Ironhouse示例

ZeroMQ C# Ironhouse示例
EN

Stack Overflow用户
提问于 2017-10-13 06:45:20
回答 2查看 1.3K关注 0票数 9

我对ZeroMQ相当陌生,并且一直在比较使用ZeroMQ NuGet包和NetMQ & NetMQ Security NuGet包的消息安全性。

到目前为止,我还没有找到使用曲线安全性的Ironhouse示例的C#版本。在ZGuides回购上有一个"todo“项,但是到目前为止还没有实现。(https://github.com/metadings/zguide/issues/1)

我还试图确定NetMQ.Security安全方法是否比内置在ZeroMQ 4中的曲线安全方法更好。似乎大多数关于曲线的信息至少是从2014年或更早开始的。

如有任何信息,将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-01 10:00:40

发布服务器和订阅服务器都需要使用自己的一组公钥\私钥。在订阅者的示例代码中,您将CurvePublicKey设置为服务器(这是错误的,但仍然是这样),但不要设置CurveSecretKey --这就是为什么您不能打开客户端启动vouch的原因。以下是您从另一个问题中获得的解决方案:

代码语言:javascript
复制
public class Program
{
    static void Main(string[] args) {
        using (var context = new ZContext()) {
            Console.WriteLine($"Curve Supported: {ZeroMQ.ZContext.Has("curve")}");
            byte[] serverPublicKey;
            byte[] serverSecretKey;
            Z85.CurveKeypair(out serverPublicKey, out serverSecretKey);

            var publisher = new ZSocket(context, ZSocketType.PUB);
            publisher.CurvePublicKey = serverPublicKey;
            publisher.CurveSecretKey = serverSecretKey;
            publisher.CurveServer = true;
            publisher.Bind("tcp://*:5050");

            var subscriber = new ZSocket(context, ZSocketType.SUB);
            byte[] subPublicKey;
            byte[] subSecretKey;
            Z85.CurveKeypair(out subPublicKey, out subSecretKey);
            subscriber.CurvePublicKey = subPublicKey;
            subscriber.CurveSecretKey = subSecretKey;
            subscriber.CurveServerKey = serverPublicKey;
            ZError connectError;
            subscriber.Connect("tcp://mybox:5050", out connectError);
            if (connectError != null) {
                Console.WriteLine($"Connection error: {connectError.Name} - {connectError.Number} - {connectError.Text}");
            }
            subscriber.SubscribeAll();

            // Publish some messages
            Task.Run(() => {
                for (var i = 1; i <= 5; i++) {
                    var msg = $"Pub msg: {Guid.NewGuid().ToString()}";
                    using (var frame = new ZFrame(msg)) {
                        publisher.Send(frame);
                    }
                }
            });
            Task.Run(() => {
                // Receive some messages
                while (true) {
                    using (var frame = subscriber.ReceiveFrame()) {
                        var msg = frame.ReadString();
                        Console.WriteLine($"Received: {msg}");
                    }
                }
            });
            Console.WriteLine("Press ENTER to exit");
            Console.ReadLine();
            ZError subError;
            subscriber.Disconnect("tcp://mybox:5050", out subError);
            subscriber.Dispose();
            ZError pubError;
            publisher.Disconnect("tcp://*:5050", out pubError);
            publisher.Dispose();
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2021-07-29 09:52:12

实际上,使用C#的NetMQ示例不多。我发现这个“CurveTests.cs”很管用:

代码语言:javascript
复制
    public void CurveTest()
    {
        var serverPair = new NetMQCertificate();
        using var server = new DealerSocket();
        server.Options.CurveServer = true;
        server.Options.CurveCertificate = serverPair;
        server.Bind($"tcp://127.0.0.1:55367");
        
        var clientPair = new NetMQCertificate();
        using var client = new DealerSocket();
        client.Options.CurveServerKey = serverPair.PublicKey;
        client.Options.CurveCertificate = clientPair;
        client.Connect("tcp://127.0.0.1:55367");

        for (int i = 0; i < 100; i++)
        {
            client.SendFrame("Hello");
            var hello = server.ReceiveFrameString();
            Assert.Equal("Hello", hello);
            
            server.SendFrame("World");
            var world = client.ReceiveFrameString();
            Assert.Equal("World", world);
        }
    }

注意:如果您想在不同的应用程序之间共享服务器公钥,请不要使用字符串表示(serverPair.PublicKeyZ85),因为加密不起作用。我想这和编码有关。最好将字节数组表示形式保存到某个文件并共享它:

代码语言:javascript
复制
File.WriteAllBytes("serverPublicKey.txt", serverPair.PublicKey);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46723979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档