文章目录
0. 代码仓库
代码编译时候可能出现的错误
-
OPENSSL_Uplink no OPENSSL_Applink 错误
Applink()函数不属于openssl的dll内部函数的一部分(通过dll分析器看出这个函数不存在), 所以必须把applink.c文件应用程序的一部分编译.
-
解决方案
extern "C" { #include <openssl/applink.c> };

1. 哈希
1.1 哈希算法的种类:
- md5 - 散列值: 16byte
- sha1 - 散列值: 20byte
- sha224- 散列值: 28byte
- sha256- 散列值: 32byte
- sha384- 散列值: 48byte
- sha512- 散列值: 64byte
以上说的散列值长度是二进制数据长度, 一般散列值使用 16 进制格式的数字串表示的, 看到的字符串长度是原来的2倍长.
1.2 使用的头文件
#include <openssl/md5.h>
#include <openssl/sha.h>
1.3 哈希算法API
1.3.1 详解md5 API
# define MD5_DIGEST_LENGTH 16 // md5哈希值长度
// 初始化函数, 初始化参数 c
int MD5_Init(MD5_CTX *c);
参数c: 传出参数
// 添加md5运算的数据-> 没有计算
// 该函数可以进行多次数据添加 -> 函数多次调用
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
参数:
- c: MD5_Init() 初始化得到的
- data: 传入参数, 字符串
- len: data数据的长度
// 对添加的数据进行md5计算
int MD5_Final(unsigned char *md, MD5_CTX *c);
参数:
- md: 传出参数, 存储得到的哈希值
- c: MD5_Init() 初始化得到的
// 通过传递的参数, 直接生成一个md5哈希值
// 只能添加一次数据
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
参数:
- d: 传入, 要进行md5运算的字符串
- n: 字符串的的长度
- md: 传出, 存储md5的哈希值
返回值: 这个地址的函数第三个参数md地址
1.3.2 sha1/sha224/sha256/sha384/sha512常用API
# define SHA_DIGEST_LENGTH 20
# define SHA224_DIGEST_LENGTH 28
# define SHA256_DIGEST_LENGTH 32
# define SHA384_DIGEST_LENGTH 48
# define SHA512_DIGEST_LENGTH 64
int SHA1_Init(SHA_CTX *c);
int SHA1_Update(SHA_CTX *c, const void *data, size_t len);
int SHA1_Final(unsigned char *md, SHA_CTX *c);
unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md);
int SHA224_Init(SHA256_CTX *c);
int SHA224_Update(SHA256_CTX *c, const void *data, size_t len);
int SHA224_Final(unsigned char *md, SHA256_CTX *c);
unsigned char *SHA224(const unsigned char *d, size_t n, unsigned char *md);
int SHA256_Init(SHA256_CTX *c);
int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);
int SHA256_Final(unsigned char *md, SHA256_CTX *c);
unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md);
int SHA384_Init(SHA512_CTX *c);
int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA384_Final(unsigned char *md, SHA512_CTX *c);
unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md);
int SHA512_Init(SHA512_CTX *c);
int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA512_Final(unsigned char *md, SHA512_CTX *c);
unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md);
1.5 sha1代码测试
void sha1Test()
{
// 1. 初始化
SHA_CTX ctx;
SHA1_Init(&ctx);
// 2. 添加数据
SHA1_Update(&ctx, "hello", strlen("hello"));
SHA1_Update(&ctx, ", world", strlen(", world"));
// 3. 哈希计算
unsigned char* md = new unsigned char[SHA_DIGEST_LENGTH];
char* res = new char[SHA_DIGEST_LENGTH*2

博客介绍了哈希、非对称加密RSA和对称加密AES算法。涵盖哈希算法种类、API及C++代码封装思路;阐述RSA特点、应用场景、密钥对生成、加密解密和签名校验;还介绍了AES分组加密、常用API及代码测试,同时提及代码编译可能出现的错误及解决办法。
最低0.47元/天 解锁文章
3900

被折叠的 条评论
为什么被折叠?



