• C++使用openssl对AES-256-ECB PKCS7 加解密


    1. /*
    2. * AES-256-ECB PKCS7 加密 函数
    3. * input:经过PKCS7填充后的明文数据
    4. * outhex:加密后的命名数据16进制数,可以使用base64_encode转换为base64格式字符串密文
    5. * key:密钥
    6. * len:经过PKCS7填充后的明文数据长度
    7. */
    8. void AesEcb256Pkcs7Encrypt(u8 *input, u8 *outhex, u8 *key, int len)
    9. {
    10. /* key:171ce897ad494cb289b023cd3c0ceab4
    11. * input:{terminalNumber}
    12. * aesHexStr:6241579fb24b00f9d1d238ed191e700877b27ba4e7f6184253eb40c20f67390f
    13. * base64str:YkFXn7JLAPnR0jjtGR5wCHeye6Tn9hhCU+tAwg9nOQ8=
    14. *
    15. * input:{"terminalNumber":"28b7f2eb-b549-3200-9950-2c6a83cd8af2"}
    16. * aesHexStr:3B2EFE3D4BF2E586F06D9AC26B2F35CE67B2B228C5DE89980DE8CE3570EBBEE62EB54526A24542885D8902E860D54D056C6545D183B0A0134A48449C3D9F7B19
    17. * base64str:Oy7+PUvy5YbwbZrCay81zmeysijF3omYDejONXDrvuYutUUmokVCiF2JAuhg1U0FbGVF0YOwoBNKSEScPZ97GQ==
    18. */
    19. TRACE("input:%s, key:%s, %d\n", (char*)input, (char*)key, len);
    20. AES_KEY aesKey;
    21. AES_set_encrypt_key(key, 256, &aesKey);
    22. for (size_t i = 0; i < len; i += AES_BLOCK_SIZE)
    23. {
    24. AES_encrypt(input + i, outhex + i, &aesKey);
    25. TRACE("i:%d\n\n", i);
    26. }
    27. /* 将加密后的数据转换成十六进制字符串 */
    28. std::string aesHexStr;
    29. for (size_t i = 0; i < len; ++i)
    30. {
    31. char hex[3];
    32. sprintf(hex, "%02X", outhex[i]);
    33. aesHexStr += hex;
    34. }
    35. /* 将hex转为base64 */
    36. char base64str[2*len] = {0};
    37. base64_encode(outhex, base64str, len);
    38. TRACE("buf[%s], len:%d, hexAes[%s], len:%d\n", base64str, strlen(base64str), aesHexStr.data(), aesHexStr.length());
    39. }
    1. /*
    2. * AES-256-ECB PKCS7 解密 函数
    3. */
    4. void AesEcb256Pkcs7Decrypt(unsigned char* input, unsigned char* output, unsigned char* key, int len)
    5. {
    6. AES_KEY aesKey;
    7. AES_set_decrypt_key(key, 256, &aesKey);
    8. for (size_t i = 0; i < len; i += AES_BLOCK_SIZE)
    9. {
    10. AES_decrypt(input + i, output + i, &aesKey);
    11. TRACE("i:%d\n\n", i);
    12. }
    13. /* 将加密后的数据转换成十六进制字符串 */
    14. std::string aesHexStr;
    15. for (size_t i = 0; i < len; ++i)
    16. {
    17. char hex[3];
    18. sprintf(hex, "%02X", output[i]);
    19. aesHexStr += hex;
    20. TRACE("output[%d]:%s [%d]\n", i, hex, output[i]);
    21. }
    22. }
    1. // PKCS7填充函数
    2. int Pkcs7Padding(char *data, int len)
    3. {
    4. int padding_len = AES_BLOCK_SIZE - (len % AES_BLOCK_SIZE);
    5. TRACE("data:%s, len:%d, padding_len:%d \n\n", data, len, padding_len);
    6. for (int i = 0; i < padding_len; i++)
    7. {
    8. data[len + i] = (char)padding_len;
    9. }
    10. return len + padding_len;
    11. }
    12. //去除PKCS7填充
    13. int Pkcs7Unpadding(unsigned char *data, int length)
    14. {
    15. /* 取出最后一个字节数据 */
    16. int padding_size = data[length - 1];
    17. TRACE("padding_size:%d ,%d ,%d\n\n", padding_size, data[length - 1], length);
    18. if (padding_size > AES_BLOCK_SIZE || padding_size == 0)
    19. {
    20. TRACE("padding err\n\n");
    21. return -1; // 非法填充
    22. }
    23. int padding_index = length - padding_size;
    24. for (int i = 0; i < padding_size; i++)
    25. {
    26. if (data[padding_index+i] != (unsigned char)padding_size)
    27. {
    28. TRACE("padding err :%d ,%d\n\n", data[padding_index+i], padding_size);
    29. return -1; // 非法填充
    30. }
    31. }
    32. return padding_index;
    33. }
    1. int maintest()
    2. {
    3. /* 256位密钥 */
    4. u8 *key = "171ce897ad494cb289b023cd3c0ceab4";
    5. char plaintext[256] = {0};
    6. /* 加密密文hex */
    7. unsigned char ciphertext[1024];
    8. unsigned char output[1024]; // 解密输出
    9. //sprintf(plaintext, "terminalNumber");
    10. //sprintf(plaintext, "{terminalNumber}");
    11. sprintf(plaintext, "{\"terminalNumber\":\"28b7f2eb-b549-3200-9950-2c6a83cd8af2\"}");
    12. /* PKCS7填充明文 */
    13. int allLen = Pkcs7Padding((char *)plaintext, strlen(plaintext));
    14. /* 加密 */
    15. AesEcb256Pkcs7Encrypt(plaintext, ciphertext, key, allLen);
    16. TRACE("plaintext:%s, len:%d key:%s \n\n", plaintext, allLen, key);
    17. /* 解密 */
    18. AesEcb256Pkcs7Decrypt(ciphertext, output, key, allLen);
    19. /* PKCS7解填充 */
    20. int plaintext_len = Pkcs7Unpadding(output, allLen);
    21. if (plaintext_len == -1)
    22. {
    23. TRACE("AES Decrypt err\n");
    24. }
    25. else
    26. {
    27. TRACE("output:%s [%d]\n\n", output, plaintext_len);
    28. }
    29. return 0;
    30. }

  • 相关阅读:
    机器学习中的基础问题总结
    【FPGA】verilog基础语法与应用:位操作 / 模块调用——流水灯(跑马灯)
    芯片科普 |ATE测试如何入门?ATE测试的工作内容和要求?
    2.每天进步一点点-Python爬虫需要了解一下基础的web相关内容
    Redis实战——短信登录
    PSD95抗体研究丨SYSY PSD95抗体结果图展示
    如何学习Redis
    七牛云 OSS 文件上传demo
    想学设计模式、想搞架构设计,先学学 UML 系统建模吧
    【Qt】QMainWindow
  • 原文地址:https://blog.csdn.net/qq1113231395/article/details/133858475