日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

在Ubuntu 14.04 64bit上进行md5加密编程

發布時間:2023/11/27 生活经验 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在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。




下面是提供的md5函數的接口

//打開/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.md5接口的調用有兩套,一套是?MD5_Init,MD5_Update,MD5_Final,另一套是MD5,用哪一套都可以的。兩種實現方式,一樣的結果。相比較,第二種方法更直觀簡單些。 2.進行計算的類型分為字符串和本地文件, 3.在Ubuntu 14.04 64bit上需要鏈接 -lcrypto,在ContOS上需要鏈接,不論是保存為c文件還是cpp文件 4.臨時緩存一定要使用unsigned char,不能使用char,因為unsigned char 0~255 ,char -127~127。使用char會出問題。這個md5加密函數,返回16個十進制數,范圍在0~255間,把它format為十六進制就是32位md5編碼了。 5.snprintf時的格式,%02X和%2.2格式是一樣的,強制輸出兩位,比如十進制的8,十六進制也是8,這個格式是控制輸出兩位,08。如果加密結果要小寫字母顯示,就是"%2.2x",大寫就是"2.2X"。 6.運行得到結果后,我們可以使用md5sum命令進行驗證,并對比。 7.注意這里用到openssl庫,并且限定在Ubuntu上, 如果在CentOS平臺上,可以運行 yum install openssl ?和 yum install openssl-devel 進行安裝。

參考文獻

[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加密编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。