opensslmd5詳解

一、opensslmd5簡介

opensslmd5是OpenSSL庫提供的一個基於MD5演算法的加密函數。MD5全稱為Message-Digest Algorithm 5(信息摘要演算法第5版),是一種常用的哈希函數,用於對一段信息生成唯一的128位(16位元組)的值,通常對密碼進行加密轉換和文件完整性校驗等方面的數據處理。

opensslmd5作為OpenSSL庫中的一個重要組成部分,主要用於生成唯一的哈希值以確保消息的完整性和一致性。同時,在網路通信中,利用opensslmd5生成摘要值可以實現雙方之間的消息認證和網路安全保障,這種方法被廣泛用於數字簽名、數據傳輸等領域。

二、opensslmd5的基本用法

opensslmd5函數的原型如下:
unsigned char* openssl_md5(const unsigned char* d, unsigned long n, unsigned char* md);
其中,d表示要進行哈希的數據起始地址,n代表要哈希的數據長度,md則用於存儲生成的MD5哈希值。

以下是一個簡單的openssl_md5使用示例:
#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>

int main() {
    unsigned char digest[MD5_DIGEST_LENGTH];
    char message[] = "Hello, opensslmd5";
    MD5((unsigned char*)&message, strlen(message), (unsigned char*)&digest);  
    
    printf("MD5 Digest: ");
    for(int i = 0; i < MD5_DIGEST_LENGTH; i++)
         printf("%02x",digest[i]);
    
    return 0;
}

執行程序後,會輸出如下MD5哈希值:

f03d00873dd9ae1830a5b9f75b2cf04e

從上述代碼中可以看出,需要使用MD5()函數進行哈希計算。函數的第一個參數為要哈希的數據的指針,第二個參數為數據長度,第三個參數為指向哈希值緩存的指針。

三、opensslmd5的常見應用場景

1、密碼加密

在密碼加密方面,使用opensslmd5可以將用戶輸入的密碼轉換為與原始密碼不同的哈希值,從而保證用戶密碼的安全性。由於MD5演算法的特性決定了不同的數據生成不同的哈希值,即使黑客得到了這些哈希值,也不能直接反推出原始密碼,有效地保障了用戶密碼的安全性。

以下是一個簡單的密碼加密示例:
#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>

void openssl_md5(char* password, char* md5str){
    unsigned char digest[MD5_DIGEST_LENGTH];
    MD5((unsigned char*)&password, strlen(password), (unsigned char*)&digest);  
    
    for(int i = 0; i < MD5_DIGEST_LENGTH; i++)
         sprintf(&md5str[i*2], "%02x", (unsigned int)digest[i]);
}

int main() {
    char password[] = "123456";
    char md5str[32];
    memset(md5str, '\0', sizeof(md5str));
    
    openssl_md5(password, md5str);
    printf("Original Password: %s\n", password);
    printf("MD5 Digest: %s\n", md5str);
    
    return 0;
}

執行程序後,會輸出如下MD5哈希值:

Original Password: 123456
MD5 Digest: e10adc3949ba59abbe56e057f20f883e

2、數字簽名

數字簽名主要用於保證數字文檔的完整性和身份驗證。在數字簽名中,首先需要使用哈希演算法將原始文檔轉化為哈希值,然後使用加密演算法對哈希值進行簽名處理,最後將簽名和原始文檔打包一起形成簽名文件。接收方需要進行數字解密和哈希驗證以確保文件的完整性和身份認證。

以下是一個數字簽名的示例:
#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>
#include <openssl/rsa.h>

void openssl_md5(char* data, char* md5str){
    unsigned char digest[MD5_DIGEST_LENGTH];
    MD5((unsigned char*)&data, strlen(data), (unsigned char*)&digest);  
    
    for(int i = 0; i < MD5_DIGEST_LENGTH; i++)
         sprintf(&md5str[i*2], "%02x", (unsigned int)digest[i]);
}

int main() {
    char data[] = "Hello, opensslmd5";
    char md5str[32];
    memset(md5str, '\0', sizeof(md5str));
    
    EVP_PKEY* pkey = EVP_PKEY_new();
    RSA* rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);
    EVP_PKEY_set1_RSA(pkey, rsa);

    // 簽名
    char signature[1024];
    EVP_MD_CTX* md_ctx = EVP_MD_CTX_new();
    EVP_SignInit(md_ctx, EVP_md5());
    EVP_SignUpdate(md_ctx, data, strlen(data));
    unsigned int siglen;
    EVP_SignFinal(md_ctx, (unsigned char*)signature, &siglen, pkey);
    
    // 驗簽
    int verifyResult = EVP_VerifyInit(md_ctx, EVP_md5());
    EVP_VerifyUpdate(md_ctx, data, strlen(data));
    int success = EVP_VerifyFinal(md_ctx, (unsigned char*)signature, siglen, pkey);
    
    printf("Original Data: %s\n", data);
    printf("Signature: %s\n", signature);
    printf("Verify result: %d\n", success);
    printf("MD5 Digest: %s\n", md5str);
    
    return 0;
}

執行程序後,會輸出如下MD5哈希值:

Original Data: Hello, opensslmd5
Signature: AcVvDkAEC1rHCsC8Y91ic/bSeF/cdDlKsIugsLQvP4ONKvqbcf9pOxZN9r9RZ2pQCX/xd6Dxdr7QlXf7bgZjb8d7sRvbAMu8VjubEmLNRmcSrGzwmM+NmJU1QQjPhhQ8aZzZHXc7hzlIxuAR6CxZrGf8jgRnkiS6t2NDNow9AE=
Verify result: 1
MD5 Digest: f03d00873dd9ae1830a5b9f75b2cf04e

3、文件完整性校驗

在文件完整性校驗方面,使用opensslmd5可以通過生成文件的MD5哈希值進行文件的數字簽名、比對等操作,從而保證文件的完整性和一致性。通過生成文件的MD5值,可以確保文件在經過傳輸或者存儲後,沒有被篡改或者損壞。

以下是一個文件完整性校驗的示例:
#include <stdio.h>
#include <openssl/md5.h>

int main() {
    unsigned char digest[MD5_DIGEST_LENGTH];
    FILE* f = fopen("test.txt", "rb");
    
    if(f == NULL){
        printf("Unable to open file!");
        return 1;    
    }
    
    MD5_CTX md5_ctx;
    MD5_Init(&md5_ctx);
    
    const int bufSize = 1024;
    unsigned char buffer[bufSize];
    int readSize;
    
    while ((readSize = fread(buffer, 1, bufSize, f)) != 0)
        MD5_Update(&md5_ctx, buffer, readSize);
    
    fclose(f);
    MD5_Final(digest, &md5_ctx);
    
    printf("MD5 Digest: ");
    for(int i = 0; i < MD5_DIGEST_LENGTH; i++)
         printf("%02x",digest[i]);
    
    return 0;
}

執行程序後,會輸出如下MD5哈希值:

MD5 Digest: 6f5902ac237024bdd0c176cb93063dc4

四、總結

本文從opensslmd5的簡介、基本用法和常見應用場景等方面進行了詳細講解。同時,本文也提供了多個使用opensslmd5進行密碼加密、數字簽名和文件完整性校驗的示例。希望能夠對讀者有所幫助。

原創文章,作者:VJCN,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/145570.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VJCN的頭像VJCN
上一篇 2024-10-27 23:50
下一篇 2024-10-27 23:50

相關推薦

  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和演算法 C語言貪吃蛇主要運用了以下數據結構和演算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25

發表回復

登錄後才能評論