(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)
{
```