C#编写一个一次性口令程序

(1) 编写一个一次性口令程序
(2) 运行该口令程序,屏幕上弹出一个仿Windows窗口,提示用户输入口令,并给出提示模式。
(3) 用户输入口令,按照一次性算法计算比较,符合,给出合法用户提示;否则给出非法用户提示。
(4) 再一次运行口令程序,如果输入与第一次同样的口令,系统应当拒绝,提示非法用户。每次提示和输入的口令都是不一样的。
(5) 写出设计说明(含公式、算法,随机数产生法,函数调用和参数传递方式)

您写出来了吗?

设计说明如下:

一、口令算法设计

本口令程序采用时间同步算法(Time-based One-Time Password, TOTP)作为一次性口令的生成算法。算法流程如下:

首先,服务器和客户端需要共享一个密钥,该密钥只在初始化时交换一次。

客户端在请求登录时,将当前时间戳(以30秒为单位)发送给服务器。

服务器利用该时间戳和密钥计算出一个动态口令。

客户端在一定时间内输入该动态口令进行登录验证。

具体算法流程如下:

从时间戳中获取当前时间的时间戳t0。

将t0除以时间步长(默认为30秒)得到时间步数T。

利用HMAC-SHA1算法计算出一个消息摘要值。

取摘要值的低4位作为动态口令的偏移量i。

将动态口令从摘要值中截取8个字符,并将其转换为10进制数,去除符号位。

对该数对10^digits取余,得到6位的动态口令。

其中,HMAC-SHA1算法是一种基于密钥的哈希算法,它将密钥和消息作为输入,输出一个固定长度的摘要值。HMAC-SHA1算法的输出长度为20字节,取后4字节作为动态口令的值。

二、口令程序设计

本口令程序采用C#语言编写,使用Windows Forms窗体应用程序。程序流程如下:

程序启动后,生成一个长度为32的密钥,作为口令算法的密钥。

窗口应用程序显示登录界面,提示用户输入口令。用户输入口令后,单击“登录”按钮提交口令。

服务器计算出当前时间戳的动态口令,并与用户输入的口令进行比较。如果一致,则提示“合法用户”,否则提示“非法用户”。

口令程序记录下最后一次登录的时间戳和动态口令,下次登录时检查时间戳是否相同,如果相同则拒绝登录。
using System;
using System.Text;
using System.Security.Cryptography;
using System.Windows.Forms;

namespace OneTimePassword
{
    public partial class MainForm : Form
    {
        private byte[] secretKey; // 32字节的密钥
        private DateTime lastTimestamp; // 上次登录的时间戳
        private string lastPassword; // 上次登录的动态口令

        public MainForm()
        {
            InitializeComponent();
            // 初始化密钥
            secretKey = new byte[32];
            using (var rng = new RNGCryptoServiceProvider())
            {
                rng.GetBytes(secretKey);
            }
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
           


```