ZeroMQ C#Ironhouse的例子

Bri*_*ehm 7 c# zeromq

我是ZeroMQ的新手,并且一直在使用ZeroMQ NuGet包和NetMQNetMQ Security NuGet包来比较消息的安全性.

到目前为止,我还没有找到使用Curve Security的Ironhouse示例的C#版本.ZGuides回购中有一个"todo"项目,但到目前为止还没有实现.(https://github.com/metadings/zguide/issues/1)

我还试图确定NetMQ.Security安全方法是否优于ZeroMQ 4中内置的曲线安全方法.看起来大多数关于Curve的信息至少来自2014年或更早.

任何信息将不胜感激!

Evk*_*Evk 3

发布者和订阅者都需要使用自己的一组公钥\私钥。在订阅者的示例代码中,您设置了CurvePublicKey(设置为服务器的代码,这是错误的,但仍然是)但没有设置CurveSecretKey- 这就是为什么您得到“无法打开客户端 INITIATE vouch”的原因。这是来自另一个已修复问题的示例:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)