SHA1算法在DS28E01上验证(二)结束篇

1.sha1原理
sha1算法原理这里不做详细推导,具体细节请参考相关文档,这里是简单提示需要加密的数据需要512bit对齐,里面包含原始数据,对齐数据和长度信息
2.modelsim仿真
这里输入sha_i = {32’h8,448’h0,32’h63800000};
32‘h63是字符C的hex值,8是补齐开始的第一位为1,后面为0;
32‘h8是长度信息,原始数据是一个字节
在这里插入图片描述
输入以上数据,输出结果为160’h84a516841ba77a5b4648de2cd0dfcb30ea46dbb4
采用在线计算器
在这里插入图片描述
可见结果一致,验证sha1算法正确
3.DS28E01输入数据格式
输入格式如下:
在这里插入图片描述
详细请参考数据手册
4.sha1算法在fpga上验证
在上一节提到的romid为000001b229d62f,eeprom为0,密钥为0000000000000001
将这些数据按照数据个数组成512位数据,modlesim仿真如下:
在这里插入图片描述
输出结果为185a36892fbed8007ca75109edf579fc3838a1fb
ila抓取的结果为
在这里插入图片描述
结果为185a36892fbed8007ca75109edf579fc3838a1fb与仿真一致,验证正确
5.DS28E01算法与sha1标准算法区别
通过标准sha1算法,输入第4步骤中数据,输出结果应该为7f9f598a1f8c838915622e07fe27ce72fc0b83eb,与ila抓取的不一致,通过观察剥削,modelsim输出的前一拍时正确的和结果一致,由此可以判断出DS28E01的sha1算法没有最后一步的系数相加,这一点尤为重要
6.注意事项
DS28E01 sha1算法没有标准算法的第80步系数相加

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一份基于C语言的DS28E01示例代码,你可以根据自己的需求进行修改: ``` #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdbool.h> #include <string.h> #include "ds28e01.h" // 定义DS28E01的ROM ID const uint8_t ROM_ID[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; // 初始化1-Wire总线 void ds28e01_init(void) { // TODO: 初始化1-Wire总线 } // 读取DS28E01的ROM ID bool ds28e01_read_rom_id(uint8_t* rom_id) { bool success = true; // 发送读取ROM ID的命令 ds28e01_write_byte(0x33); // 读取ROM ID for (int i = 0; i < 8; i++) { rom_id[i] = ds28e01_read_byte(); if (rom_id[i] != ROM_ID[i]) { success = false; break; } } return success; } // 读取DS28E01中指定地址的数据 bool ds28e01_read_data(uint16_t addr, uint8_t* data, uint16_t len) { bool success = true; // 发送读取数据的命令 ds28e01_write_byte(0xF0); ds28e01_write_byte((uint8_t)(addr >> 8)); ds28e01_write_byte((uint8_t)addr); // 读取数据 for (int i = 0; i < len; i++) { data[i] = ds28e01_read_byte(); } return success; } // 写入DS28E01中指定地址的数据 bool ds28e01_write_data(uint16_t addr, uint8_t* data, uint16_t len) { bool success = true; // 发送写入数据的命令 ds28e01_write_byte(0x0F); ds28e01_write_byte((uint8_t)(addr >> 8)); ds28e01_write_byte((uint8_t)addr); // 写入数据 for (int i = 0; i < len; i++) { ds28e01_write_byte(data[i]); } return success; } // 写入一个字节到1-Wire总线 void ds28e01_write_byte(uint8_t byte) { // TODO: 写入一个字节到1-Wire总线 } // 从1-Wire总线读取一个字节 uint8_t ds28e01_read_byte(void) { // TODO: 从1-Wire总线读取一个字节 return 0; } ``` 注意,上述代码中的`ds28e01_init`、`ds28e01_write_byte`和`ds28e01_read_byte`函数需要根据实际情况进行实现。此外,为了保证数据的安全性,建议在实际使用中加入固件挑战-响应协议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43189165

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值