资源简介
阿里云设备登录一机一密和一型一密都需要用到HMAC-MD5算法
什么是 HMAC-MD5?
1、比如你和对方共享了一个密钥K,现在你要发消息给对方,既要保证消息没有被篡改,又要能证明信息确实是你本人发的,那么就把原信息和使用K计算的HMAC的值一起发过去。对方接到之后,使用自己手中的K把消息计算一下HMAC,如果和你发送的HMAC一致,那么可以认为这个消息既没有被篡改也没有冒充。
2、MD5就是通过散列对要输出的数据进行摘要,接收到数据时,再同样进行MD5散列,与给定的MD5散列值比较,一致不一致就很清楚了。通常来说,传输的数据和MD5是不同的渠道给出的,比如网页上显示MD5,下载链接是某个镜像网站的。如果要通过同一个渠道发送数据和散列值的话(比如消息认证码),就要考虑数据和MD5同时被篡改的问题,如果第三方修改了数据,然后进行MD5散列,并一块发给接收方,接收方并不能察觉到数据被篡改。HMAC-MD5就可以用一把发送方和接收方都有的key进行计算,而没有这把key的第三方是无法计算出正确的散列值的,这样就可以防止数据被篡改。
代码片段和文件信息
#include “md5.h“
/* The below was retrieved from
* http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/crypto/md5.c?rev=1.1
* with the following changes:
* #includes commented out.
* Support context->count as unsigned int[2] instead of uint64_t
* u_int* to uint*
*/
/*
* This code implements the MD5 message-digest algorithm.
* The algorithm is due to Ron Rivest. This code was
* written by Colin Plumb in 1993 no copyright is claimed.
* This code is in the public domain; do with it what you wish.
*
* Equivalent code is available from RSA Data Security Inc.
* This code has been tested against that and is equivalent
* except that you don‘t need to include two pages of legalese
* with every copy.
*
* To compute the message digest of a chunk of bytes declare an
* MD5Context structure pass it to MD5Init call MD5Update as
* needed on buffers full of bytes and then call MD5Final which
* will fill a supplied 16-byte array with the digest.
*/
/*#include */
/*#include */
/*#include */
#define PUT_64BIT_LE(cp value) do { \
(cp)[7] = (value)[1] >> 24; \
(cp)[6] = (value)[1] >> 16; \
(cp)[5] = (value)[1] >> 8; \
(cp)[4] = (value)[1]; \
(cp)[3] = (value)[0] >> 24; \
(cp)[2] = (value)[0] >> 16; \
(cp)[1] = (value)[0] >> 8; \
(cp)[0] = (value)[0]; } while (0)
#define PUT_32BIT_LE(cp value) do { \
(cp)[3] = (value) >> 24; \
(cp)[2] = (value) >> 16; \
(cp)[1] = (value) >> 8; \
(cp)[0] = (value); } while (0)
static unsigned char PADDING[MD5_BLOCK_LENGTH] = {
0x80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
};
/*
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
* initialization constants.
*/
void
MD5Init(MD5_CTX *ctx)
{
ctx->count[0] = 0;
ctx->count[1] = 0;
ctx->state[0] = 0x67452301;
ctx->state[1] = 0xefcdab89;
ctx->state[2] = 0x98badcfe;
ctx->state[3] = 0x10325476;
}
/*
* Update context to reflect the concatenation of another buffer full
* of bytes.
*/
void
MD5Update(MD5_CTX *ctx unsigned char const *input size_t len)
{
size_t have need;
/* Check how many bytes we already have and how many more we need. */
have = (size_t)((ctx->count[0] >> 3) & (MD5_BLOCK_LENGTH - 1));
need = MD5_BLOCK_LENGTH - have;
/* Update bitcount */
/* ctx->count += (uint64_t)len << 3;*/
if ((ctx->count[0] += ((unsigned int)len << 3)) < (unsigned int)len) {
/* Overflowed ctx->count[0] */
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3005 2019-04-09 20:13 md5.h
文件 12029 2019-04-09 20:10 md5.c
----------- --------- ---------- ----- ----
15034 2
- 上一篇:IC卡水表程序
- 下一篇:峰值检测系统课程设计
相关资源
- 基于fpga的ecc算法实现
- 遗传算法的车间调度算法求解的PPT
- 本科毕设—基于DES算法的数据加密系
- 物流配送遗传算法
- 用FCM算法实现图像分割(图像源可以
- 基于蚁群算法的无人机三维路径规划
- 迭代注水算法
- 基于改进离散粒子群算法的电力系统
- 一个基于邻域粗糙集的前向贪心的属
- MD5_加密算法程序_C51验证可以用
- 数字式自适应均衡器基于卡尔曼算法
- lyapunov算法程序
- 银行家算法linux下实现
- 基于单片机的电阻对焊控制箱的设计
- NLP分词算法,源码
- 一种隐含并行的大规模三相不平衡配
- Berlekamp-Massey算法
- AP聚类算法代码
- 队列实现火车厢重排的算法及代码个
- VRP问题蚁群算法
- 基于栅格化的A*路径算法规划基于Si
- 信号与数据处理中的低秩模型——理
- 自己整理的国标SM3哈希算法
- Caley树算法 计算机图形学 孔令德 案例
- 多边形边缘填充算法 计算机图形学
- 几种常用music算法
- 严题集算法设计答案汇总
- 蚁群算法简单实现
- 语音压缩算法,比较简单
- 485门禁例程
评论
共有 条评论