void mbedtls_ripemd160(
const unsigned char *input,
size_t inputLength,
unsigned char output[20]
)
const unsigned char *input
是输入的字节数据
。C语言中没有其他语言中的byte
类型,C语言中表达byte
类型就是用unsigned char
,unsigned char
的意思就是告诉编译器, 不要把我的最高位当成符号位,这样这8bit
就都表示真实的数据了。
size_t
的定义:
typedef long unsigned int __darwin_size_t;
typedef __darwin_size_t size_t;
size_t inputLength
是const unsigned char *input
的大小,单位是字节
。
unsigned char output[20]
是输出的字节数据
。是个长度为20
的字节数组。
step1、创建一个项目目录RIPEMD-160
,并进入该目录
mkdir RIPEMD-160 && cd RIPEMD-160
step2、使用curl命令下载代码
curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/include/mbedtls/ripemd160.h
curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/library/ripemd160.c
curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/include/mbedtls/platform_util.h
curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/library/platform_util.c
curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/include/mbedtls/threading.h
curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/library/threading.c
step3、编写一个config.h
文件,其内容如下
#define MBEDTLS_RIPEMD160_C
step4、将代码中的mbedtls/
字符串去掉
sed -i 's@mbedtls/@@g' ripemd160.c platform_util.h platform_util.c threading.h threading.c 2> /dev/null ||
sed -i "" 's@mbedtls/@@g' ripemd160.c platform_util.h platform_util.c threading.h threading.c
step6、编写一个C语言源程序md5Test.c
,其内容如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include"ripemd160.h"
void showHelp() {
printf("usage: ripemd160 [option] <str>\n");
printf("option: -x lower case, default true\n");
printf(" -X upper case\n");
printf("example:ripemd160 -X sssssss\n");
exit(1);
}
void base16(unsigned char input[20], char* output, bool isToUpper) {
const char *format = isToUpper ? "%02X" : "%02x";
char tmp[3] = {0};
for(int i = 0; i < 20; i++) {
sprintf(tmp, format, input[i]);
strcat(output, tmp);
}
}
void performRIPEMD160(char* input, bool isToUpper) {
//RIPEMD-160算法能够根据任意长度的数据计算出一个固定长度(160bit=20byte)的唯一数据
unsigned char output[20] = {0};
mbedtls_ripemd160((unsigned char *)input, strlen(input), output);
//为了便于比较,通常会把RIPEMD-160运算后得到的160bit数据再用base16编码。因为每4bit可以表示一个十六进制字符,用十六进制表示就是40个字符。
char hex[41] = {0};
base16(output, hex, isToUpper);
printf("ripemd160(%s)=%s\n", input, hex);
}
int main(int argc, char* argv[]) {
if (argc == 1) {
showHelp();
} else if (argc == 2) {
if (strcmp("-h", argv[1]) == 0
|| strcmp("--help", argv[1]) == 0
|| strcmp("-x", argv[1]) == 0
|| strcmp("-X", argv[1]) == 0) {
showHelp();
} else {
performRIPEMD160(argv[1], 0);
}
} else {
if (strcmp("-x", argv[1]) == 0) {
performRIPEMD160(argv[2], 0);
} else if (strcmp("-X", argv[1]) == 0) {
performRIPEMD160(argv[2], 1);
} else {
showHelp();
}
}
return 0;
}
step7、使用cc命令进行编译
cc -o ripemd160Test *.c
step8、运行ripemd160Test
./ripemd160Test -x abc
ripemd160(abc)=8eb208f7e05d987a9b044a8e98c6b087f15a0bfc
./ripemd160Test -X abc
ripemd160(abc)=8EB208F7E05D987A9B044A8E98C6B087F15A0BFC
step9、验证结果是否正确。RIPEMD-160在线计算器中输入相同的字符,看看输出是否一样。
source code on GitHub