Chương 3 MÃ HĨA GRAIN TRÊN THIẾT BỊ RASPBERRY
3.5. Kịch bản thực nghiệm
3.5.1. Raspberry lấy dữ liệu từ các sensor và gửi đến client
Bước 1: Rasperry định kỳ lấy lần lượt các tín hiệu (nhiệt độ, độ ẩm, trạng thái cửa ra vào) từ Sensor qua các chân GPIO (3 giây / 1 lần). Các tín hiệu này được chuyển đến ServerApp qua WiringPi.
Bước 2: Server thêm các định danh, thiết lập định dạng cho các tín hiệu. Định dạng dữ liệu: [Định danh][Chiều dài thơng điệp][Thơng tin]
• [Định danh]: Định danh của thơng điệp (1 byte) o TEMP_MESS: thơng tin về nhiệt độ
o HUMI_MESS: thơng tin về độ ẩm
o DOOR_MESS: thơng tin về trạng thái cửa
• [Chiều dài thơng điệp]: Chiều dài của phần [Thơng tin] (2 bytes)
• [Thơng tin]: Nội dung thơng tin về nhiệt độ, độ ẩm hay trạng thái cửa. Sau đĩ áp dụng mã hĩa Grain cho các tín hiệu nhận được lần lượt theo thứ tự: nhiệt độ, độ ẩm, trạng thái cửa ra vào. Kết quả là 3 chuỗi bản mã.
Bước 3: Server áp dụng hàm băm Keccak để thêm MAC cho 3 chuỗi bản mã. Khĩa sử dụng cho quá trình mã hĩa và MAC đã được khởi tạo và thỏa thuận trước giữa Server và Client (Xem kịch bản trao đổi khĩa mục 3.5.3).
Bước 4: Server sử dụng socket.io để gửi dữ liệu đến Client. Bước 5: Client nhận thơng tin, giải mã Grain được bản rõ.
Bước 6: Client thực hiện MAC với bản rõ => Đầu ra là bản MAC’. Client so sánh MAC và MAC’ để kiểm tra tính xác thực của thơng tin nhận được. Nếu MAC = MAC’ thì hiển thị thơng tin lên giao diện. Nếu ngược lại, MAC # MAC’ thì hiển thị thơng báo lỗi cho người dùng và dừng kết nối.
3.5.2. Client gửi thơng tin điều khiển đến Server
Bước 1: Người dùng nhấn các nút điều khiển trên giao diện:
• Tăng / giảm nhiệt độ
Bước 2: ClientApp thêm định danh và thiết lập định dạng cho thơng tin điều khiển. Sau đĩ áp dụng mã hĩa Grain cho thơng điệp để được bản mã. Định dạng dữ liệu của Client cũng tương tự như bên Server, chỉ khác ở phần định danh cho dữ liệu, sử dụng 3 loại định danh sau:
• TEMP_MESS_CTRL: điều khiển nhiệt độ
• HUMI_MESS_CTRL: điều khiển về độ ẩm
• DOOR_MESS_CTRL: điều khiển về trạng thái cửa Bước 3: Client thêm MAC cho bản mã.
Bước 4: Client gửi thơng điệp đã mã hĩa và thêm MAC đến Server.
Bước 5: Server thực hiện giải mã Grain thu được bản rõ. Server thực hiện MAC trên bản rõ đĩ thu được MAC’. Server so sánh MAC và MAC’. Nếu MAC = MAC’ thì hiển thị thơng tin đèn LED. Nếu ngược lại, MAC # MAC’ thì hiển thị thơng báo lỗi trên bảng điều khiển và dừng kết nối.
3.5.3. Tạo và trao đổi khĩa giữa Server và Client
Bước 1: Khi Client kết nối đến Server, Server sử dụng hàm createDiffieHellman() và generateKeys() của thư viện crypto8 để tạo khĩa cơng khai.
Bước 2: Server lấy các thơng tin về module p và g bằng cách sử dụng getPrime() và getGenerator().
Bước 3: Server gửi p, g và khĩa cơng khai đến Client.
Bước 4: Client nhận được p, g, và khĩa cơng khai của Server. Client tính tốn khĩa cơng khai và gửi đến cho Server. Đồng thời Client tính tốn khĩa bí mật chung của Client và Server và lưu lại session.
Bước 5: Server nhận được khĩa cơng khai của Client. Server tính tốn khĩa bí mật dùng chung và lưu giữ khĩa này cho 1 session Client liên kết với Server.
Khi Client ngắt kết nối với Server, Server tự động xĩa tồn bộ những thơng tin lưu trữ của Client và sẽ thiết lập khĩa mới khi Client kết nối lại với Server.
Việc tạo và trao đổi khĩa được thực hiện 2 lần cho khĩa của hệ mật Grain và khĩa của MAC với hàm băm Keccak. Cả Server và Client đều lưu trữ 2 khĩa này cho các lần mã hĩa và xác thực trong một phiên giao dịch.
8 Thư viện crypto là một thư viện thơng dụng của nodejs, hỗ trợ người lập trình các chức năng cơ bản khi làm về mật mã như: tạo và trao đổi khĩa, hàm băm, HMAC với SHA256, tạo chữ ký,… Tài liệu về thư viện crypto cĩ thể xem tại https://nodejs.org/api/crypto.html