aardio中zmq怎么实现加密通信

By windsing at 2023-08-08 • 1人收藏 • 615人看过

大佬们好,aardio中怎么实现zeromq基于CURVE的加密通信呢,这个一直没搞明白,参考zeromq的文档,服务端和客户端分别如下尝试过,但好像不行,求指点

Server:

import console;
import zeromq;

var context = zeromq.context()
var socket = context.zmq_socket_pub()

socket.bind("tcp://*:5556")

console.dump(socket.setsockopt(49, {byte msgType[] = "kr>Pwl3UG9(!Qx4^yH#PD7jIt@eL]zZSh!Ex.af8 "},41 ))

while(1){  
   msg = tostring(time.now())
   socket.sendMsg(msg)
   console.log(msg + "  " + zeromq.lasterr())
   sleep(1000)
}

socket.close()
context.term()

Client:

import zeromq;
import console
var context = zeromq.context(10)
var socket = context.zmq_socket_sub()
socket.connect("tcp://127.0.0.1:5556" )
console.log("客户端")
// 设置订阅过滤
console.dump(socket.setsockopt(6/*_ZMQ_SUBSCRIBE*/, {byte msgType[] = "2023"}))
// 设置client的ZMQ_CURVE_SERVERKEY
console.dump(socket.setsockopt(50/*_ZMQ_CURVE_SERVERKEY*/, {byte msgType[] = "iy-xR&bDB]J4s}bT>RODl#[yv8K!YiH:U#l[0T[7"} ))
console.dump(socket.setsockopt(48/*_ZMQ_CURVE_PUBLICKEY*/, {byte msgType[] = "iy-xR&bDB]J4s}bT>RODl#[yv8K!YiH:U#l[0T[7"} ))
console.dump(socket.setsockopt(49/*_ZMQ_CURVE_SECRETKEY*/, {byte msgType[] = "N}GZw<Z+nzcn5d[JN]]q8}9g!uQmWxH6]K=p/r?f"} ))
// 接收消息
do{      
    console.dump("客户端收到:", socket.recv())
    sleep(1000)
}while(true)
socket.close();
context.term();


4 个回复 | 最后更新于 2023-08-10
2023-08-09   #1

以下是一个使用C#实现基于CURVE的加密通信的示例:

using System;
using System.Text;
using NetMQ;
using NetMQ.Security;
namespace ZeroMQCurveEncryption
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个上下文
            using (var context = NetMQContext.Create())
            {
                // 创建一个客户端套接字
                using (var client = context.CreateRequestSocket())
                {
                    // 客户端公钥
                    var clientPublicKey = @"^?LgyN-I~0UPF{*VB0`b1Hq%iQ|BG6T}1H5h[Z";
                    // 客户端私钥
                    var clientPrivateKey = "b&iDzX|Bf(6u%cn8M+p!47EPUISXs}ALRJ@,EYbn";
                    // 设置套接字的 CURVE 加密
                    client.Options.CurveServerKey = "Vd7r4A]Ua>~,do=Qfl6m)Io2Q?(t33Fd+G`Zk#n!";
                    client.Options.CurvePublicKey = clientPublicKey;
                    client.Options.CurveSecretKey = clientPrivateKey;
                    // 连接到服务器
                    client.Connect("tcp://localhost:5555");
                    Console.WriteLine("连接到服务器。输入消息并按 Enter 发送,输入 'exit' 退出。");
                    while (true)
                    {
                        var message = Console.ReadLine();
                        if (message == "exit")
                            break;
                        // 发送消息到服务器
                        client.SendFrame(Encoding.UTF8.GetBytes(message));
                        // 接收服务器的响应
                        var response = client.ReceiveFrameString();
                        Console.WriteLine("服务器回复: " + response);
                    }
                }
            }
        }
    }
}



using System;
using System.Text;
using NetMQ;
using NetMQ.Security;
namespace ZeroMQCurveEncryption
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个上下文
            using (var context = NetMQContext.Create())
            {
                // 创建一个服务器套接字
                using (var server = context.CreateResponseSocket())
                {
                    // 服务器公钥
                    var serverPublicKey = @"Vd7r4A]Ua>~,do=Qfl6m)Io2Q?(t33Fd+G`Zk#n!";
                    // 服务器私钥
                    var serverPrivateKey = @"fJ}i~MtXA1q-k=9+qFr^Z@zSJ#k$u~E#7T-3LA1h";
                    // 设置套接字的 CURVE 加密
                    server.Options.CurveServer = true;
                    server.Options.CurvePublicKey = serverPublicKey;
                    server.Options.CurveSecretKey = serverPrivateKey;
                    // 绑定本地端口
                    server.Bind("tcp://localhost:5555");
                    Console.WriteLine("服务器已启动。等待客户端消息...");
                    while (true)
                    {
                        // 接收客户端的消息
                        var message = server.ReceiveFrameString();
                        Console.WriteLine("收到客户端消息: " + message);
                        // 发送响应到客户端
                        var response = "已收到消息";
                        server.SendFrame(Encoding.UTF8.GetBytes(response));
                    }
                }
            }
        }
    }
}


在这个示例中,我们使用NetMQ和NetMQ.Security库来实现基于CURVE的加密通信。客户端和服务器都使用了CURVE加密进行身份验证和消息加密。

在客户端代码中,我们首先创建一个上下文,然后创建一个RequestSocket套接字。然后,我们设置套接字的CURVE选项,并将公钥和私钥分别设置为客户端的公钥和私钥。最后,我们连接到服务器并通过套接字发送和接收消息。

在服务器代码中,我们也是先创建一个上下文,然后创建一个ResponseSocket套接字。然后,我们设置套接字的CURVE选项,并将公钥和私钥分别设置为服务器的公钥和私钥。最后,我们绑定本地端口并等待客户端的消息。当收到消息时,我们发送响应到客户端。

注意:在实际生产环境中使用时,应该使用自己的安全密钥,而不是示例代码中的密钥。


以上是ChatGPT的回答,仅做搬运

2023-08-09   #2

666,我也试了直接问,感觉AI在乱写

在aardio中使用zmq实现加密通信,可以通过以下步骤实现:


1. 安装libsodium库


在aardio中使用zmq进行加密通信,需要先安装libsodium库。可以通过以下命令在aardio中安装:


```lua

import os

os.execute("pip install pynacl")

```


2. 生成公钥和私钥


在进行加密通信前,需要先生成公钥和私钥。可以使用libsodium库中的crypto_box_keypair函数生成:


```lua

import nacl.public


# 生成公钥和私钥

public_key, private_key = nacl.public.Box.generate_keypair()

```


3. 创建zmq上下文和socket


在aardio中使用zmq进行加密通信,需要先创建zmq上下文和socket。可以使用zmq.Context()函数创建上下文,使用socket()函数创建socket:


```lua

import zmq


# 创建zmq上下文和socket

context = zmq.Context()

socket = context.socket(zmq.REQ)

```


4. 设置加密选项


在创建socket后,需要设置加密选项。可以使用zmq.curve_publickey和zmq.curve_secretkey选项设置公钥和私钥,使用zmq.curve_server选项设置为True表示使用服务器模式:


```lua

# 设置加密选项

socket.curve_publickey = public_key

socket.curve_secretkey = private_key

socket.curve_server = True

```


5. 连接到服务器


在设置加密选项后,可以使用socket.connect()函数连接到服务器:


```lua

# 连接到服务器

socket.connect("tcp://localhost:5555")

```


6. 发送和接收加密消息


在连接到服务器后,可以使用socket.send()函数发送加密消息,使用socket.recv()函数接收加密消息:


```lua

# 发送和接收加密消息

message = "Hello, world!"

socket.send(message.encode())

response = socket.recv()

print(response.decode())

```


完整代码示例:


```lua

import zmq

import nacl.public


# 生成公钥和私钥

public_key, private_key = nacl.public.Box.generate_keypair()


# 创建zmq上下文和socket

context = zmq.Context()

socket = context.socket(zmq.REQ)


# 设置加密选项

socket.curve_publickey = public_key

socket.curve_secretkey = private_key

socket.curve_server = True


# 连接到服务器

socket.connect("tcp://localhost:5555")


# 发送和接收加密消息

message = "Hello, world!"

socket.send(message.encode())

response = socket.recv()

print(response.decode())

```


2023-08-09   #3

aardio的问题别问ai了。 答非所问, 太冷门了这aardio

2023-08-10   #4

有大佬能给个样例吗,主要是密钥的设置

// 自带示例里面有的内容,设置消息过滤,能设置成功,返回true
onsole.dump(socket.setsockopt(6/*_ZMQ_SUBSCRIBE*/, {byte msgType[] = "2023"}))

// 自己琢磨的设置client的ZMQ_CURVE_SERVERKEY,永远返回的是false
console.dump(socket.setsockopt(50/*_ZMQ_CURVE_SERVERKEY*/, {byte msgType[] = "iy-xR&bDB]J4s}bT>RODl#[yv8K!YiH:U#l[0T[7"} ))

只要后面的一句能设置成功,问题基本就解决了,因为不太懂aardio底部机制,现在卡住了,推测可能的原因:

(1)aardio中的zmq.aardio库中定义的内容需要更新以支持新属性的配置?

(2)aardio自带的libzmq.dll就不支持加密通信?

(3)下面这句话写得不对...

socket.setsockopt(50/*_ZMQ_CURVE_SERVERKEY*/, {byte msgType[] = "iy-xR&bDB]J4s}bT>RODl#[yv8K!YiH:U#l[0T[7"} )


麻烦有没大佬指点下,附上zmq的一些参考:

zmq.h 中的定义

image.png

zmq官网api说明

http://api.zeromq.org/master:zmq-setsockopt

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...