[Ubuntu]基于openssl的MD5加密C语言实现

本文介绍了解决Ubuntu系统中出现的“error:openssl/md5.h:Nosuchfileordirectory”错误的方法,并提供了一个使用openssl库进行MD5加密的简单示例。此外还分享了一些关于MD5加密的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ubuntu下提示“error: openssl/md5.h: No such file or directory”的解决方案为

 安装libssl-dev: sudo apt-get install libssl-dev

 

在linux c使用openssl/md5.h加密
#include<stdio.h>
#include<openssl/md5.h>
#include<string.h>

int main( int argc, char **argv )
{
unsigned char *data = "123";
unsigned char md[16];
int i;
char tmp[3]={'\0'},buf[33]={'\0'};
MD5(data,strlen(data),md);
for (i = 0; i < 16; i++){
    sprintf(tmp,"%02x",md[i]);
    strcat(buf,tmp);
}
printf("%s\n",buf);
return 0;
}

输出:
202cb962ac59075b964b07152d234b70

1. %02X或%02x强制输出两位(分别对应大写字符串和小写字符串)。
2.一定要使用unsigned char,虽然是char,其实就是个int,当然,它只有一个字节,和char的区别是,unsigned char 0~255 ,char -127~127。使用char会出问题。这个md5加密函数,返回16个十进制数,范围在0~255间,把它format为十六进制就是32为md5编码了。
3.gcc编译的时候,后面加上参数 -lcrypto 如果系统没有安装libcrypto,是不能用这个方法的。

4. 可以使用strtol来转换16位进制的字符串为long型整数 具体请man strtol 有示例代码


转自人人网 http://blog.renren.com/share/223584957/10339202050

数字签名及加密是一种非常重要的信息安全技术,能够保证数据的完整性、可靠性和保密性。下面是一个基于 OpenSSL 库的数字签名及加密 C 语言代码实现示例。 首先需要安装 OpenSSL 库,可以使用以下命令在 Ubuntu 系统中安装: ``` sudo apt-get install libssl-dev ``` 接下来是示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/err.h> #include <openssl/md5.h> // RSA 公钥加密 int rsa_public_encrypt(unsigned char *in, int inlen, RSA *rsa, unsigned char *out) { int ret = RSA_public_encrypt(inlen, in, out, rsa, RSA_PKCS1_PADDING); if (ret == -1) { printf("RSA_public_encrypt error: %s\n", ERR_error_string(ERR_get_error(), NULL)); } return ret; } // RSA 私钥解密 int rsa_private_decrypt(unsigned char *in, int inlen, RSA *rsa, unsigned char *out) { int ret = RSA_private_decrypt(inlen, in, out, rsa, RSA_PKCS1_PADDING); if (ret == -1) { printf("RSA_private_decrypt error: %s\n", ERR_error_string(ERR_get_error(), NULL)); } return ret; } // 生成 RSA 密钥对 int generate_rsa_keypair(RSA **rsa, int bits) { int ret = 0; if ((*rsa = RSA_new()) == NULL) { printf("RSA_new error: %s\n", ERR_error_string(ERR_get_error(), NULL)); return -1; } BIGNUM *bne = BN_new(); if (BN_set_word(bne, RSA_F4) != 1) { printf("BN_set_word error: %s\n", ERR_error_string(ERR_get_error(), NULL)); RSA_free(*rsa); return -1; } ret = RSA_generate_key_ex(*rsa, bits, bne, NULL); if (ret != 1) { printf("RSA_generate_key_ex error: %s\n", ERR_error_string(ERR_get_error(), NULL)); RSA_free(*rsa); return -1; } BN_free(bne); return 0; } // 计算 MD5 摘要值 int md5_digest(unsigned char *in, int inlen, unsigned char *out) { MD5_CTX md5_ctx; if (!MD5_Init(&md5_ctx)) { printf("MD5_Init error\n"); return -1; } if (!MD5_Update(&md5_ctx, in, inlen)) { printf("MD5_Update error\n"); return -1; } if (!MD5_Final(out, &md5_ctx)) { printf("MD5_Final error\n"); return -1; } return 0; } int main() { RSA *rsa = NULL; unsigned char md5[16]; unsigned char cipher[1024], plain[1024]; int cipher_len, plain_len, md5_len; // 生成 RSA 密钥对 if (generate_rsa_keypair(&rsa, 1024) != 0) { printf("generate_rsa_keypair error\n"); return -1; } // 加密明文 strcpy(plain, "Hello, world!"); plain_len = strlen(plain); cipher_len = rsa_public_encrypt(plain, plain_len, rsa, cipher); if (cipher_len < 0) { printf("rsa_public_encrypt error\n"); RSA_free(rsa); return -1; } // 解密密文 plain_len = rsa_private_decrypt(cipher, cipher_len, rsa, plain); if (plain_len < 0) { printf("rsa_private_decrypt error\n"); RSA_free(rsa); return -1; } printf("Plain text: %s\n", plain); // 计算明文的 MD5 摘要值 md5_len = md5_digest(plain, plain_len, md5); if (md5_len < 0) { printf("md5_digest error\n"); RSA_free(rsa); return -1; } // 对 MD5 摘要值进行签名 unsigned char *sig; sig = (unsigned char *)malloc(RSA_size(rsa)); int siglen; if ((siglen = RSA_sign(NID_md5, md5, MD5_DIGEST_LENGTH, sig, &cipher_len, rsa)) != 1) { printf("RSA_sign error: %s\n", ERR_error_string(ERR_get_error(), NULL)); RSA_free(rsa); return -1; } // 验证签名 if (RSA_verify(NID_md5, md5, MD5_DIGEST_LENGTH, sig, siglen, rsa) != 1) { printf("RSA_verify error: %s\n", ERR_error_string(ERR_get_error(), NULL)); RSA_free(rsa); return -1; } printf("Signature verified successfully!\n"); // 释放资源 RSA_free(rsa); free(sig); return 0; } ``` 这段代码实现了 RSA 公钥加密、私钥解密、MD5 摘要值计算、数字签名和验证签名的功能。需要注意的是,此代码仅为示例,实际使用时还需要根据实际需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值