- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想编写一个程序来散列一些数据,最好我希望它使用 sha1 或 MD5 中的任何一个。我不知道其背后的主要逻辑。我也想知道我可以采取什么方法在 C 中做到这一点。
最佳答案
使用像 this 这样的库(SHA1、SHA256、SHA384、SHA512、MD5、Base64)或者仅对于 MD5,此代码
MD5
MD5.H
/* $Id: md5.h,v 1.3 2006-01-02 18:16:26 quentin Exp $ */
/*
* Implementation of the md5 algorithm described in RFC1321
* Copyright (C) 2005 Quentin Carbonneaux <crazyjoke@free.fr>
*
* This file is part of md5sum.
*
* md5sum is a free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Softawre Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* md5sum is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should hav received a copy of the GNU General Public License
* along with md5sum; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef MD5_H
#define MD5_H
#include <assert.h>
#include <stdlib.h>
/* WARNING :
* This implementation is using 32 bits long values for sizes
*/
typedef unsigned int md5_size;
/* MD5 context */
struct md5_ctx {
struct {
unsigned int A, B, C, D; /* registers */
} regs;
unsigned char *buf;
md5_size size;
md5_size bits;
};
/* Size of the MD5 buffer */
#define MD5_BUFFER 1024
/* Basic md5 functions */
#define F(x,y,z) ((x & y) | (~x & z))
#define G(x,y,z) ((x & z) | (~z & y))
#define H(x,y,z) (x ^ y ^ z)
#define I(x,y,z) (y ^ (x | ~z))
/* Rotate left 32 bits values (words) */
#define ROTATE_LEFT(w,s) ((w << s) | ((w & 0xFFFFFFFF) >> (32 - s)))
#define FF(a,b,c,d,x,s,t) (a = b + ROTATE_LEFT((a + F(b,c,d) + x + t), s))
#define GG(a,b,c,d,x,s,t) (a = b + ROTATE_LEFT((a + G(b,c,d) + x + t), s))
#define HH(a,b,c,d,x,s,t) (a = b + ROTATE_LEFT((a + H(b,c,d) + x + t), s))
#define II(a,b,c,d,x,s,t) (a = b + ROTATE_LEFT((a + I(b,c,d) + x + t), s))
unsigned char *md5 (unsigned char *, md5_size, unsigned char *);
void md5_init (struct md5_ctx *);
void md5_update (struct md5_ctx *context);
void md5_final (unsigned char *digest, struct md5_ctx *context);
#endif /* MD5_H */
MD5.c
/* $Id: md5.c,v 1.3 2006-05-01 16:57:31 quentin Exp $ */
/*
* Implementation of the md5 algorithm as described in RFC1321
* Copyright (C) 2005 Quentin Carbonneaux <crazyjoke@free.fr>
*
* This file is part of md5sum.
*
* md5sum is a free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Softawre Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* md5sum is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should hav received a copy of the GNU General Public License
* along with md5sum; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "md5.h"
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21
#define memcopy(a,b,c) md5_memcopy ((a), (b), (c))
#define memset(a,b,c) md5_memset ((a), (b), (c))
#define GET_UINT32(a,b,i) \
{ \
(a) = ( (unsigned int) (b)[(i) ] ) \
| ( (unsigned int) (b)[(i)+1] << 8 ) \
| ( (unsigned int) (b)[(i)+2] << 16) \
| ( (unsigned int) (b)[(i)+3] << 24); \
}
/* local functions */
static void md5_memcopy (unsigned char *, unsigned char *, const unsigned int);
static void md5_memset (unsigned char *, const unsigned char, const unsigned int);
static void md5_addsize (unsigned char *, md5_size , md5_size);
static void md5_encode (unsigned char *, struct md5_ctx *);
static unsigned char MD5_PADDING [64] = { /* 512 Bits */
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
};
/*
* An easy way to do the md5 sum of a short memory space
*/
unsigned char *md5 (unsigned char *M, md5_size len, unsigned char *_digest)
{
int buflen = (len > MD5_BUFFER) ? MD5_BUFFER: len;
struct md5_ctx *context;
context = malloc (sizeof (struct md5_ctx));
context->buf = malloc (buflen);
context->size = 0;
context->bits = 0;
/* Init registries */
context->regs.A = 0x67452301;
context->regs.B = 0xefcdab89;
context->regs.C = 0x98badcfe;
context->regs.D = 0x10325476;
do {
memcopy (context->buf + context->size, M + context->bits, buflen - context->size);
context->size += buflen - context->size;
md5_update (context);
} while (len - context->bits > 64);
md5_final (_digest, context);
free (context->buf);
free (context);
return _digest;
}
void md5_init (struct md5_ctx *context)
{
context->buf = malloc (MD5_BUFFER);
memset (context->buf, '\0', MD5_BUFFER);
context->size = 0;
context->bits = 0;
/* Init registries */
context->regs.A = 0x67452301;
context->regs.B = 0xefcdab89;
context->regs.C = 0x98badcfe;
context->regs.D = 0x10325476;
}
/* md5_size is bytes while the size at the end of the message is in bits ... */
static void md5_addsize (unsigned char *M, md5_size index, md5_size oldlen)
{
assert (((index * 8) % 512) == 448); /* If padding is not done then exit */
M[index++] = (unsigned char) ((oldlen << 3) & 0xFF);
M[index++] = (unsigned char) ((oldlen >> 5) & 0xFF);
M[index++] = (unsigned char) ((oldlen >> 13) & 0xFF);
M[index++] = (unsigned char) ((oldlen >> 21) & 0xFF);
/* Fill with 0 because md5_size is 32 bits long */
M[index++] = 0; M[index++] = 0;
M[index++] = 0; M[index++] = 0;
}
/*
* Update a context by concatenating a new block
*/
void md5_update (struct md5_ctx *context)
{
unsigned char buffer [64]; /* 512 bits */
int i;
for (i = 0; context->size - i > 63; i += 64) {
memcopy (buffer, context->buf + i, 64);
md5_encode (buffer, context);
context->bits += 64;
}
memcopy (buffer, context->buf + i, context->size - i);
memcopy (context->buf, buffer, context->size - i);
context->size -= i;
}
void md5_final (unsigned char *digest, struct md5_ctx *context)
{
unsigned char buffer [64]; /* 512 bits */
int i;
assert (context->size < 64);
if (context->size + 1 > 56) { /* We have to create another block */
memcopy (buffer, context->buf, context->size);
memcopy (buffer + context->size, MD5_PADDING, 64 - context->size);
md5_encode (buffer, context);
context->bits += context->size;
context->size = 0;
/* Proceed final block */
memset (buffer, '\0', 56);
/*memcopy (buffer, MD5_PADDING + 1, 56);*/
md5_addsize (buffer, 56, context->bits);
md5_encode (buffer, context);
} else {
memcopy (buffer, context->buf, context->size);
context->bits += context->size;
memcopy (buffer + context->size, MD5_PADDING, 56 - context->size);
md5_addsize (buffer, 56, context->bits);
md5_encode (buffer, context);
}
/* update digest */
for (i = 0; i < 4; i++)
digest [i] = (unsigned char) ((context->regs.A >> (i*8)) & 0xFF);
for (; i < 8; i++)
digest [i] = (unsigned char) ((context->regs.B >> ((i-4)*8)) & 0xFF);
for (; i < 12; i++)
digest [i] = (unsigned char) ((context->regs.C >> ((i-8)*8)) & 0xFF);
for (; i < 16; i++)
digest [i] = (unsigned char) ((context->regs.D >> ((i-12)*8)) & 0xFF);
}
static void md5_encode (unsigned char *buffer, struct md5_ctx *context)
{
unsigned int a = context->regs.A, b = context->regs.B, c = context->regs.C, d = context->regs.D;
unsigned int x[16];
GET_UINT32 (x[ 0],buffer, 0);
GET_UINT32 (x[ 1],buffer, 4);
GET_UINT32 (x[ 2],buffer, 8);
GET_UINT32 (x[ 3],buffer,12);
GET_UINT32 (x[ 4],buffer,16);
GET_UINT32 (x[ 5],buffer,20);
GET_UINT32 (x[ 6],buffer,24);
GET_UINT32 (x[ 7],buffer,28);
GET_UINT32 (x[ 8],buffer,32);
GET_UINT32 (x[ 9],buffer,36);
GET_UINT32 (x[10],buffer,40);
GET_UINT32 (x[11],buffer,44);
GET_UINT32 (x[12],buffer,48);
GET_UINT32 (x[13],buffer,52);
GET_UINT32 (x[14],buffer,56);
GET_UINT32 (x[15],buffer,60);
/* Round 1 */
FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
/* Round 2 */
GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
/* Round 3 */
HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
/* Round 4 */
II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
context->regs.A += a;
context->regs.B += b;
context->regs.C += c;
context->regs.D += d;
}
/* OBSOLETE */
static void md5_memcopy (unsigned char *dest, unsigned char *src, unsigned int count)
{
unsigned int i;
for (i = 0; i < count; i++) {
dest [i] = src [i];
}
}
static void md5_memset (unsigned char *p, const unsigned char c, const unsigned int count)
{
unsigned int i;
for (i = 0; i < count; i++) {
p [i] = c;
}
}
示例
const char *md5sum(const char *chaine, size_t len = 0)
{
struct md5_ctx ctx;
unsigned char digest(16);
md5_init(&ctx);
ctx.size = len?len:strlen(chaine);
strcpy(ctx.buf, chaine);
md5_update(&ctx);
md5_final(digest, &ctx);
return digest;
}
关于c - 如何在 C 中实现 md5 或 sha1 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9752045/
我想在 md-toolbar 中使用 mf-tabs,我使用 Sithdown 在 https://github.com/angular/material/issues/1076 中提供的解决方案 它
我是新手,我设法用服务提供的数据实现了我的 md-table。现在我正在尝试实现过滤器、排序和分页功能,但我认为我做错了什么。 这是我的组件: import { Component, OnInit,
我必须打开一个 md-dialog,其中包含一个带有两个选项卡的 md-tab-group。 md-dialog 可以从两个按钮打开,这两个按钮应该打开相应的选项卡。打开 md-dialog 的模板:
我正在尝试做这样的事情: {{item}}
我正在尝试使用 md-datepicker 遍历一个月的时间间隔,因此我创建了这个 codepen 示例以便更好地演示: http://codepen.io/anon/pen/ygBGOg 当单击“P
这是关于 Codepen 的例子. 我正在设置 md-row-height="30px" 然后计算 md-rowspan 使其等于元素数 + 1。(头部加一) {{ t
当我频繁切换 md-tabs 时,Md-tabs 切换正确但多个 md-tab-item 元素同时具有“md-active”类,所以我看不到选项卡的内容是事件的,因为它与其右侧选项卡的内容重叠。 据我
我想将操作放在同一数据行上,我有两个操作,为此我使用按钮和图标作为下面的代码。 {{item.codigo}} {{it
在我的对象列表中,我可以激活/非事件对象。因此,一个图标执行事件操作,另一个图标执行非事件操作,并且两者都在同一个 md-list 中。 This is what i'm tring to do 代码
如前所述 Angular-Material md-autocomplete's documentation : The md-autocomplete uses the the md-virtual-
我也在使用 Angular 1 和 Angular Material 。我想在 ng-repeat 中使用 md-subheader 和多个 md-virtual-repeat-container。您
我正在使用 Angular Material 。 当我创建自己的指令并将其添加到 md-tab-label 时,例如 Label 然后自定义指令也应用于一些“md-dummy-tab”。 但是
我在我的项目中使用 Angular Material 有一段时间了。在使用 md-select 时,我遇到了一个问题,即出现重复的 md-option 值错误。 我知道 md-options 采用唯一
我正在根据单选按钮选择设置自动完成验证 md-require-match = true/false。 默认验证是 md-require-match = true 这样用户应该从自动完成列表中选择一个项
这个问题在这里已经有了答案: Changing capitalization of filenames in Git (11 个答案) 关闭 3 年前。 我使用“readme.md”创建了我的存储库
Github有办法吗?在例如 README.md 中包含 md 文件? # Headline Text [include](File:load_another_md_file_here.md) 它不应
我正在使用 AngularJs 开发这个动态过滤系统,并试图找出如何将 color 和 size 选项转换为在两个下拉列表中(每个类别一个)。 我尝试了以下代码,该代码成功添加了下拉列表以及选择框中的
var app = angular.module('tabsDemo', ['ngMaterial']); app.controller('TabsController',tabsController
在 md-tab 指令内嵌套 md-select 和搜索输入时遇到问题。 有两个问题: 选择框展开后,必须向上滚动才能查看搜索输入 搜索输入实际上不接受任何文本 我做了一个codepen为了更好地说明
我正在尝试处理这个片段,其中自动完成功能嵌入在芯片中。但从自动完成中选择的项目不会转换为筹码。 自动完成的数据采用以下方式:{name:"John Doe", id:"1"} 哪里错了,请指教。 问候
我是一名优秀的程序员,十分优秀!