用C语言实现以下代码(1)输入为ASCII码,程序的默认输入为FIPS-180-2中示例的“abc”。 (2)输出填充后的最后一个分组中的W0, W1,W14 ,W15.然后数据扩充到80个字,然后输出W16, W79 (十六进制)。其中填充过程写成一个函数,数据扩充过程写成一个函数, 数据扩充中循环移位也可以写成一个函数 例如: 输出为: W0 : 61626380 W1 :00000000 W14:00000000 W15 : 00000018 …. W79 (3) 认真填写实验报告。 测试结果要求: (1) 输入为ASCII码,程序的默认输入为FIPS-180-2中示例的“abc” (2) 输入为ASCII码,程序的输入为各自学号,例如“214401”。
时间: 2024-02-22 21:59:04 浏览: 62
以下是用C语言实现的代码:
```c
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#define ROTL(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
void padding(char *msg, uint32_t *w, uint32_t *len) {
// 计算消息长度
*len = strlen(msg);
// 计算填充长度
uint32_t pad_len = (*len % 64 < 56) ? (56 - (*len % 64)) : (120 - (*len % 64));
// 填充消息
msg[*len] = 0x80;
for (uint32_t i = *len + 1; i < *len + pad_len; i++) {
msg[i] = 0x00;
}
*len += pad_len;
// 添加消息长度
w[15] = *len * 8;
}
void expand(uint32_t *w) {
for (uint32_t i = 16; i < 80; i++) {
w[i] = ROTL(w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16], 1);
}
}
int main() {
char msg[] = "abc";
uint32_t w[80] = {0};
uint32_t len = 0;
// 填充消息
padding(msg, w, &len);
// 输出W0, W1, W14, W15
printf("W0 : %08x\n", w[0]);
printf("W1 : %08x\n", w[1]);
printf("W14: %08x\n", w[14]);
printf("W15: %08x\n", w[15]);
// 数据扩充
expand(w);
// 输出W16, W79
printf("W16: %08x\n", w[16]);
printf("W79: %08x\n", w[79]);
return 0;
}
```
这个代码实现了SHA-1算法的填充和数据扩充部分,可以输出题目要求的W0, W1, W14, W15, W16和W79。其中,填充过程写成了`padding`函数,数据扩充过程写成了`expand`函数,循环移位用宏定义了一个`ROTL`宏函数。可以通过修改`msg`数组来改变输入消息,也可以通过修改`padding`函数和`expand`函数来扩展功能。
阅读全文