int main() { unsigned long H0 = 0x67452301, H1 = 0xefcdab89, H2 = 0x98badcfe, H3 = 0x10325476, H4 = 0xc3d2e1f0; unsigned long A, B, C, D, E, temp, temp1, temp2, temp3, k, f; int i, flag; unsigned long w[80]; char input[64]; long x; int n; printf("请输入明文:"); scanf_s("%s", input,20); n = strlen(input); if (n < 57) { x = n * 8; ms_len(x, input); if (n == 56) { for (i = n; i < 60; i++) input[i] = 0; } else { input[n] = 128; for (i = n + 1; i < 60; i++) input[i] = 0; } }这段代码什么意思
时间: 2024-04-26 15:24:12 浏览: 156
这段代码的作用是读取用户输入的明文,并对其进行 SHA-1 哈希计算所需的预处理。具体来说:
1. 定义了五个初始值 H0、H1、H2、H3、H4,用于在后续的计算中作为寄存器的初始值。
2. 定义了一些变量,包括消息扩展数组 w、输入字符串 input、长度 x、长度 n、以及一些中间变量和常量。
3. 通过 scanf_s 函数读取用户输入的明文,并计算其长度 n。
4. 如果明文长度小于 57,则需要进行预处理。预处理包括:
- 用明文长度 n 乘以 8,得到消息的比特长度 x。
- 将长度 x 转换为一个 64 位的二进制数。
- 将这个 64 位的二进制数拆分成 8 个字节,存入输入字符串 input 的末尾 8 个字节中。
- 如果明文长度正好为 56,则在 input 中添加一个字节 0x80,并在其后添加 7 个字节的 0。
- 如果明文长度不足 56,则在 input 中添加一个字节 0x80,并在其后添加若干个字节的 0,使得输入字符串的长度为 56 个字节。
总之,这段代码的作用是为 SHA-1 哈希计算做一些必要的预处理,以便后续的计算能够顺利进行。
相关问题
//SHA1.c #include <stdio.h> #include <string.h> #include <Windows.h> void creat_w( char input[64],unsigned long w[80]){ int i,j; unsigned long temp,temp1; for(i=0;i<16;i++){ j=4*i; w[i]=((long)input[j])<<24 |((long)input[1+j])<<16|((long)input[2+j])<<8|((long)input[3+j])<<0; } for(i=16;i<80;i++){ w[i]=w[i-16]^w[i-14]^w[i-8]^w[i-3]; temp=w[i]<<1; temp1=w[i]>>31; w[i]=temp|temp1; } } void ms_len(long a,char intput[64]){ unsigned long temp3,p1; int i,j; temp3=0; p1=~(~temp3<<8); for(i=0;i<4;i++){ j=8*i; intput[63-i]=(char)((a&(p1<<j))>>j); } } int main(){ unsigned long H0=0x67452301,H1=0xefcdab89,H2=0x98badcfe,H3=0x10325476,H4=0xc3d2e1f0; unsigned long A,B,C,D,E,temp,temp1,temp2,temp3,k,f; int i,flag; unsigned long w[80]; char input[64]; long x;int n; printf("输入明文:"); scanf("%s",input); n=strlen(input); if(n<57){ x=n*8; ms_len(x,input); if(n==56){ for(i=n;i<60;i++) input[i]=0; } else{ input[n]=128; for(i=n+1;i<60;i++) input[i]=0; } } creat_w(input,w); /*for(i=0;i<80;i++) printf("%lx,",w[i]);*/ printf("\n"); A=H0;B=H1;C=H2;D=H3;E=H4; for(i=1;i < 80;i++){ flag=i/20; switch(flag){ case 0: k=0x5a827999;f=(B&C)|(~B&D);break; case 1: k=0x6ed9eba1;f=B^C^D;break; case 2: k=0x8f1bbcdc;f=(B&C)|(B&D)|(C&D);break; case 3: k=0xca62c1d6;f=B^C^D;break; } /*printf("%lx,%lx\n",k,f); */ temp1=A<<5; temp2=A>>27; temp3=temp1|temp2; temp=temp3+f+E+w[i]+k; E=D; D=C; temp1=B<<30; temp2=B>>2; C=temp1|temp2; B=A; A=temp; printf("第%d步:",i+1); printf("A = %lx,B = %lx,C = %lx,D = %lx,E = %lx\n",A,B,C,D,E); } H0=H0+A; H1=H1+B; H2=H2+C; H3=H3+D; H4=H4+E; printf("\n哈希值:\n"); printf("%lx%lx%lx%lx%lx\n",H0,H1,H2,H3,H4); system("pause"); }写出这段代码每一行的意思
这段代码实现了一个 SHA-1 哈希算法。以下是每一行代码的意思:
```C
#include <stdio.h> // 引入头文件
#include <string.h>
#include <Windows.h>
void creat_w(char input[64], unsigned long w[80]) { // 定义函数 creat_w,用于生成 w 数组
int i, j;
unsigned long temp, temp1;
for (i = 0; i < 16; i++) { // 将 input 依次转为 w 数组
j = 4 * i;
w[i] = ((long)input[j]) << 24 | ((long)input[1 + j]) << 16 | ((long)input[2 + j]) << 8 | ((long)input[3 + j]) << 0;
}
for (i = 16; i < 80; i++) { // 用 w 数组中的元素生成后面的 64 个元素
w[i] = w[i - 16] ^ w[i - 14] ^ w[i - 8] ^ w[i - 3];
temp = w[i] << 1;
temp1 = w[i] >> 31;
w[i] = temp | temp1;
}
}
void ms_len(long a, char intput[64]) { // 将 long 类型 a 转为 char 类型的字符串
unsigned long temp3, p1;
int i, j;
temp3 = 0;
p1 = ~(~temp3 << 8);
for (i = 0; i < 4; i++) {
j = 8 * i;
intput[63 - i] = (char)((a & (p1 << j)) >> j);
}
}
int main() { // 主函数
unsigned long H0 = 0x67452301, H1 = 0xefcdab89, H2 = 0x98badcfe, H3 = 0x10325476, H4 = 0xc3d2e1f0; // 初始值
unsigned long A, B, C, D, E, temp, temp1, temp2, temp3, k, f;
int i, flag;
unsigned long w[80];
char input[64];
long x;
int n;
printf("输入明文:"); // 输入明文
scanf("%s", input);
n = strlen(input);
if (n < 57) { // 填充
x = n * 8;
ms_len(x, input);
if (n == 56) {
for (i = n; i < 60; i++)
input[i] = 0;
}
else {
input[n] = 128;
for (i = n + 1; i < 60; i++)
input[i] = 0;
}
}
creat_w(input, w); // 生成 w 数组
A = H0; B = H1; C = H2; D = H3; E = H4;
for (i = 1; i < 80; i++) { // 迭代计算
flag = i / 20;
switch (flag) {
case 0: k = 0x5a827999; f = (B&C) | (~B&D); break;
case 1: k = 0x6ed9eba1; f = B^C^D; break;
case 2: k = 0x8f1bbcdc; f = (B&C) | (B&D) | (C&D); break;
case 3: k = 0xca62c1d6; f = B^C^D; break;
}
temp1 = A << 5;
temp2 = A >> 27;
temp3 = temp1 | temp2;
temp = temp3 + f + E + w[i] + k;
E = D;
D = C;
temp1 = B << 30;
temp2 = B >> 2;
C = temp1 | temp2;
B = A;
A = temp;
printf("第%d步:", i + 1);
printf("A = %lx,B = %lx,C = %lx,D = %lx,E = %lx\n", A, B, C, D, E);
}
H0 = H0 + A;
H1 = H1 + B;
H2 = H2 + C;
H3 = H3 + D;
H4 = H4 + E;
printf("\n哈希值:\n"); // 输出哈希值
printf("%lx%lx%lx%lx%lx\n", H0, H1, H2, H3, H4);
system("pause");
}
```
解释以下代码:#include "myapp.h" // 定义指示灯寄存器地址和寄存器类型 #define LBDS (*((unsigned int *)0x400001)) void INTR_init( void ); void TIMER_init(void); int nCount; main() { nCount=0; PLL_Init(40); SDRAM_init(); LBDS=0; INTR_init(); TIMER_init(); while ( 1 ) { } } void interrupt Timer() { nCount++; nCount%=16; if ( nCount==0 ) LBDS^=1; } void INTR_init( void ) { IVPD=0xd0; IVPH=0xd0; IER0=0x10; DBIER0 =0x10; IFR0=0xffff; asm(" BCLR INTM"); } void TIMER_init(void) { ioport unsigned int *tim0; ioport unsigned int *prd0; ioport unsigned int *tcr0; ioport unsigned int *prsc0; tim0 = (unsigned int *)0x1000; prd0 = (unsigned int *)0x1001; tcr0 = (unsigned int *)0x1002; prsc0 = (unsigned int *)0x1003; *tcr0 = 0x04f0; *tim0 = 0; *prd0 = 0x0ffff; *prsc0 = 2; *tcr0 = 0x00e0; }
这段代码是一个简单的嵌入式系统的例程,主要功能是通过定时器实现LED指示灯的闪烁效果。
首先,代码包含了一个头文件 "myapp.h",然后定义了一个宏 "#define LBDS (*((unsigned int *)0x400001))",这个宏用于定义LED指示灯的寄存器地址和类型。然后定义了三个函数:INTR_init()、TIMER_init()和中断处理函数Timer()。最后在主函数中初始化各项设置,包括PLL初始化、SDRAM初始化、设置LED指示灯的初始状态为关闭、初始化中断、初始化定时器,并进入一个无限循环。
中断处理函数Timer()用于处理定时器中断,每次中断计数器nCount加1,如果nCount等于16,则LED指示灯的状态取反,实现闪烁效果。
INTR_init()函数中设置了中断向量表的地址和中断使能寄存器的值,并清除中断标志寄存器。
TIMER_init()函数中设置定时器的周期、计数器、预分频器和控制寄存器的值,以实现定时器中断的周期。
总的来说,这段代码主要是通过定时器和中断来实现LED指示灯的闪烁效果,可以作为嵌入式系统的一个基础例程来学习。
阅读全文