base64 编码: openssl enc -base64 -in plain.txt -out base64.txt
enc: 通用加密指令
-base64: 指定加密方式为 base64
-in 文件名: 需要进行 base64 的文件
-out 文件名: base64 后的文件保存到哪里
-e(默认): 表示当前需要执行编码操作
base64 解码: openssl enc -d -base64 -in plain.txt -out base64.txt
-d: 表示当前需要执行解码操作
查看 md5 输出到控制台: openssl dgst -md5 demo.exe
查看 md5 输出到文件中: openssl dgst -md5 -out md5.txt demo.exe
-md5: 指定使用 md5 算法计算消息摘要,通过 help 查看支持的所有算法
对称加密: openssl enc -des-cbc -in demo.png -out encrypt.png -pass pass:12345678
-des-cbc: 指定加密方式和分组模式,使用 help 查看所有
-pass: 指定对称加密使用的 key

01. base64

  1. #include <iostream>
  2. #include <openssl/bio.h>
  3. #include <openssl/buffer.h>
  4. #include <openssl/evp.h>
  5. #pragma comment(lib, "libcrypto.lib")
  6. // 1. 在项目属性的目录中添加 openssl 的 lib 和 include 路径
  7. // 2. 用到了什么东西就加上相应的头文件
  8. // 3. 必须需要链接到 libcrypto.lib 静态库
  9. // 要求传入一个需要加密的串,以及串的长度,参数三是否需要换行,返回编码后的数据
  10. char* Base64Encode(const char* input, int length, bool with_new_line)
  11. {
  12. // 创建一个 base64 对象,对象的特点就是使用 write 写入的
  13. // 数据会被自动编码,使用 read 读取的数据会自动解码
  14. BIO* b64 = BIO_new(BIO_f_base64());
  15. // 默认编码之后存在换行符,通常不需要换行符
  16. if (!with_new_line)
  17. BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
  18. // 再次创建了一个内存对象,对象的特点就是使用 write 写入的
  19. // 数据会自动保存到某一个缓冲区。BIO_push 将两个对象进行关
  20. // 联,也就是说传入的数据首先会进行 base64 编码,然后保存到
  21. // 缓冲区。
  22. b64 = BIO_push(b64, BIO_new(BIO_s_mem()));
  23. // 将传入的数据进行编码,BIO_flush 将操作刷新到对象
  24. BIO_write(b64, input, length);
  25. BIO_flush(b64);
  26. // 从 base64 对象中获取到相应的编码后的内容
  27. BUF_MEM* bptr = NULL;
  28. BIO_get_mem_ptr(b64, &bptr);
  29. // 将编码后的数据拷贝到指定的位置
  30. char* b64encode = new char[bptr->max]{};
  31. memcpy(b64encode, bptr->data, bptr->max);
  32. // 清理 BIO 对象,并返回结果
  33. BIO_free_all(b64);
  34. return b64encode;
  35. }
  36. char* Base64Decode(char* input, int length, bool with_new_line)
  37. {
  38. BIO* b64 = BIO_new(BIO_f_base64());
  39. if (!with_new_line)
  40. BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
  41. // 编码后的长度和原文大概比例是 4:3,使用编码后的长度
  42. // 进行解码,空间是绝对足够的
  43. char* buffer = (char*)malloc(length);
  44. if (buffer) memset(buffer, 0, length);
  45. // 创建一个内存对象,存入编码后的内容,并关联到 base64 对象
  46. BIO* bmem = BIO_push(b64, BIO_new_mem_buf(input, length));
  47. // 对 base64 read 就是解码数据
  48. BIO_read(bmem, buffer, length);
  49. // 清理并返回原文
  50. BIO_free_all(bmem);
  51. return buffer;
  52. }
  53. int main()
  54. {
  55. auto b64e = Base64Encode("hello15pbo", 10, false);
  56. printf("b64e: %s\n", b64e);
  57. auto b64d = Base64Decode(b64e, strlen(b64e), false);
  58. printf("b64d: %s\n", b64d);
  59. return 0;
  60. }

02. md

  1. #include <iostream>
  2. using namespace std;
  3. #include <openssl/md5.h>
  4. #include <openssl/sha.h>
  5. #pragma comment(lib, "libcrypto.lib")
  6. int md5_encrypt(const void* data, size_t len, unsigned char* md5)
  7. {
  8. // 初始化保存 md5 信息的结构体
  9. MD5_CTX ctx = { 0 };
  10. MD5_Init(&ctx);
  11. // 将需要计算的数据传入到对应的结构中
  12. MD5_Update(&ctx, data, len);
  13. // 从结构中获取计算后的结果
  14. MD5_Final(md5, &ctx);
  15. return 0;
  16. }
  17. int sha1_encrypt(const void* data, size_t len, unsigned char* md5)
  18. {
  19. SHA_CTX ctx = { 0 };
  20. SHA1_Init(&ctx);
  21. SHA1_Update(&ctx, data, len);
  22. SHA1_Final(md5, &ctx);
  23. return 0;
  24. }
  25. int sha256_encrypt(const void* data, size_t len, unsigned char* md5)
  26. {
  27. SHA256_CTX ctx = { 0 };
  28. SHA256_Init(&ctx);
  29. SHA256_Update(&ctx, data, len);
  30. SHA256_Final(md5, &ctx);
  31. return 0;
  32. }
  33. void show_hex(const char* n, unsigned char* hex, size_t length)
  34. {
  35. printf(n);
  36. for (int i = 0; i < length; ++i)
  37. printf("%02X", hex[i]);
  38. printf("\n");
  39. }
  40. int main()
  41. {
  42. unsigned char hex[100] = { 0 };
  43. md5_encrypt("hello15pb", 9, hex);
  44. show_hex("md5: ", hex, 16);
  45. sha1_encrypt("hello15pb", 9, hex);
  46. show_hex("sha1: ", hex, 20);
  47. sha256_encrypt("hello15pb", 9, hex);
  48. show_hex("sha256: ", hex, 32);
  49. return 0;
  50. }

03. aes

  1. #include <iostream>
  2. #include <openssl/evp.h>
  3. #pragma comment(lib, "libcrypto.lib")
  4. // 返回值是加密后的密文长度,传入明文,明文长度和保存密文的缓冲区
  5. int evp_en_cipher(unsigned char* source_string, unsigned char* des_string, int length)
  6. {
  7. // 创建一个通用加解密的对象,设置填充方式
  8. EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
  9. EVP_CIPHER_CTX_set_padding(ctx, 1);
  10. // once_length 是一次加密的长度, out_length 加密后密文的长度
  11. int once_length = 0, out_length = 0;
  12. // 设置加密时使用的算法+分组模式和 key,函数的倒数第二个参数可以
  13. // 用于指定初始化向量,最后一个参数是 1 表示加密,否则解密
  14. unsigned char key[16] = "15pb";
  15. EVP_CipherInit_ex(ctx, EVP_des_ede3_ecb(), NULL, key, nullptr, 1);
  16. // 使用 EVP_CipherUpdate + EVP_CipherFinal 完成整个加密
  17. EVP_CipherUpdate(ctx, des_string, &once_length, source_string, length);
  18. out_length += once_length;
  19. EVP_CipherFinal(ctx, des_string + once_length, &once_length);
  20. out_length += once_length;
  21. // 清理对象并返回长度
  22. EVP_CIPHER_CTX_free(ctx);
  23. return out_length;
  24. }
  25. int evp_de_cipher(unsigned char* source_string, unsigned char* des_string, int length)
  26. {
  27. EVP_CIPHER_CTX * ctx = EVP_CIPHER_CTX_new();
  28. EVP_CIPHER_CTX_set_padding(ctx, 1);
  29. int once_length = 0, out_length = 0;
  30. // 解密的代码和加密除 EVP_CipherInit_ex 的最后一个参数外基本相同
  31. unsigned char key[16] = "15pb";
  32. EVP_CipherInit_ex(ctx, EVP_des_ede3_ecb(), NULL, key, nullptr, 0);
  33. EVP_CipherUpdate(ctx, des_string, &once_length, source_string, length);
  34. out_length += once_length;
  35. EVP_CipherFinal(ctx, des_string + once_length, &once_length);
  36. out_length += once_length;
  37. // 为加密后的数据添加空字符
  38. des_string[out_length] = 0;
  39. EVP_CIPHER_CTX_free(ctx);
  40. return out_length;
  41. }
  42. int main(int argc, char* argv[])
  43. {
  44. unsigned char planttext[] =
  45. "123456789123456789"
  46. "123456789123456789"
  47. "123456789123456789"
  48. "123456789123456789"
  49. "123456789123456789"
  50. "123456789123456789";
  51. unsigned char temp_string[1000] = { 0 };
  52. int en_length = evp_en_cipher(planttext, temp_string, 108);
  53. int de_length = evp_de_cipher(temp_string, temp_string, en_length);
  54. printf("%s", temp_string);
  55. return 0;
  56. }