在Ubuntu 14.04 64bit上进行md5加密编程
計算指定字符串的md5值是一項很常見的操作,包括使用命令行md5sum,或者在C/C++編程中調用openssl提供的接口函數來進行。下面我們分別闡述如下:
一、在命令行中使用md5校驗
計算某個文件的md5校驗值,通常就是在命令行輸入md5sum就可以了
但是如果要方便地計算一個給出字符串的md5值,則md5sum就不合適了,因為md5sum只針對文件操作。為此我想到下面的變通方法:
在/usr/bin下面編寫一個bash腳本
sudo vim md5
#!/bin/bash
echo -n $1 | md5sum | awk '{print $1}'保存后,賦予可執行權限
sudo chmod +x md5
這樣就可以方便地計算任意字符串的值了。參見如下截圖
二、使用OpenSSL中md5接口編程(使用MD5加密)
我們以一個字符串為例,新建一個文件filename.txt,在文件內寫入hello ,然后在Linux下可以使用命令md5sum filename.txt計算md5值 ==>?b1946ac92492d2347c6235b4d2611184 ?。雖然寫入的是hello這5個字符,但是我們使用命令xxd filename.txt后可以看出文件結尾處會有個0x0a這個回車符。所以在下面的代碼中才會有\n。
//打開/usr/include/openssl/md5.h這個文件我們可以看到一些函數
// 初始化 MD5 Contex, 成功返回1,失敗返回0
int MD5_Init(MD5_CTX *c);
// 循環調用此函數,可以將不同的數據加在一起計算MD5,成功返回1,失敗返回0
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
// 輸出MD5結果數據,成功返回1,失敗返回0
int MD5_Final(unsigned char *md, MD5_CTX *c);
// MD5_Init,MD5_Update,MD5_Final三個函數的組合,直接計算出MD5的值
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
// 內部函數,不需要調用
void MD5_Transform(MD5_CTX *c, const unsigned char *b);
下面是分別針對字符串和本地文件的源碼
str_md5_demo.c文件:
//gcc -g str_md5_demo.c -o str_md5_demo -lcrypto
//
#include <string.h>
#include <stdio.h>
#include <openssl/md5.h>int main(int argc, char* argv[]){MD5_CTX ctx;unsigned char md[16] = {0};int i = 0;//方法一:MD5_Init(&ctx);MD5_Update(&ctx, "hel", 3);MD5_Update(&ctx, "lo", 2);MD5_Final(md, &ctx);for (i = 0; i < 16; i++)printf("%02X", md[i]);printf("\n");//方法二:const char data[] = "hello";MD5(data, strlen(data), md);for (i = 0; i < 16; i++)printf("%02X", md[i]);printf("\n");return 0;
}file_md5_demo.c:
//gcc -g file_md5_demo.c -o file_md5_demo -lcrypto
//#include <string.h>
#include <stdio.h>
#include <openssl/md5.h>int main(int argc, char* argv[]){MD5_CTX ctx;unsigned char md[16] = {0};char buffer[1024] = {0};char filename[64] = {0};int len = 0, i;FILE* fp = NULL;printf("請輸入文件名, 用于計算MD5值\n");scanf("%s", filename);fp = fopen(filename, "rb");if(NULL == fp){printf("can't open file\n");return 1;}//方法一:MD5_Init(&ctx);while((len=fread(buffer, 1, sizeof(buffer), fp)) > 0){MD5_Update(&ctx, buffer, len);memset(buffer, 0 ,sizeof(buffer));}MD5_Final(md, &ctx);for(i=0; i<16; i++)printf("%02X", md[i]);printf("\n");//方法二:while((len=fread(buffer, 1, sizeof(buffer), fp)) > 0){MD5(buffer, len, md);memset(buffer, 0 ,sizeof(buffer));}for(i=0; i<16; i++)printf("%02X", md[i]);printf("\n");if(fp) fclose(fp);return 0;
}
下面是運行效果截圖, 同時給出了與md5或是md5check的對比圖:
參考文獻
[1].http://www.cnblogs.com/wunaozai/p/3887009.html
[2].http://www.cppblog.com/API/archive/2013/08/09/202427.html
[3].http://blog.webfuns.net/archives/1477.html
總結
以上是生活随笔為你收集整理的在Ubuntu 14.04 64bit上进行md5加密编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编写Makefile中遇到的各种奇葩问题
- 下一篇: 使用C++ ostringstream来