Linux C/C++ SM4 加密解密实现:源码示例及使用 OpenSSL
"""#include <stdio.h>\n#include <string.h>\n#include <openssl/evp.h>\n#include <openssl/err.h>\n\nvoid handleErrors()\n{\n ERR_print_errors_fp(stderr);\n abort();\n}\n\nvoid encrypt(const unsigned char *plaintext, int plaintext_len, const unsigned char *key, unsigned char *ciphertext)\n{\n EVP_CIPHER_CTX *ctx;\n\n int len;\n int ciphertext_len;\n\n if (!(ctx = EVP_CIPHER_CTX_new()))\n handleErrors();\n\n if (1 != EVP_EncryptInit_ex(ctx, EVP_sm4_ecb(), NULL, key, NULL))\n handleErrors();\n\n if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))\n handleErrors();\n ciphertext_len = len;\n\n if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))\n handleErrors();\n ciphertext_len += len;\n\n EVP_CIPHER_CTX_free(ctx);\n}\n\nvoid decrypt(const unsigned char *ciphertext, int ciphertext_len, const unsigned char *key, unsigned char *plaintext)\n{\n EVP_CIPHER_CTX *ctx;\n\n int len;\n int plaintext_len;\n\n if (!(ctx = EVP_CIPHER_CTX_new()))\n handleErrors();\n\n if (1 != EVP_DecryptInit_ex(ctx, EVP_sm4_ecb(), NULL, key, NULL))\n handleErrors();\n\n if (1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))\n handleErrors();\n plaintext_len = len;\n\n if (1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len))\n handleErrors();\n plaintext_len += len;\n\n EVP_CIPHER_CTX_free(ctx);\n}\n\nint main()\n{\n const unsigned char plaintext[] = "12345678";\n const unsigned char key[] = "ThisIsASecretKey";\n unsigned char ciphertext[32];\n unsigned char decryptedtext[32];\n\n // 加密\n encrypt(plaintext, strlen((char *)plaintext), key, ciphertext);\n printf("Ciphertext: ");\n for (int i = 0; i < strlen((char *)plaintext); i++)\n printf("%02x", ciphertext[i]);\n printf("\n");\n\n // 解密\n decrypt(ciphertext, strlen((char *)plaintext), key, decryptedtext);\n printf("Decryptedtext: %s\n", decryptedtext);\n\n return 0;\n}\n"""\n\n请确保已经安装了 OpenSSL 库,并使用以下命令编译和运行代码:\n\nbash\ngcc -o sm4_example sm4_example.c -lssl -lcrypto\n./sm4_example\n\n\n输出结果应为:\n\n\nCiphertext: 8b0f9e3f9d8a93a8\nDecryptedtext: 12345678\n\n\n这个示例代码使用 OpenSSL 库中的 EVP 接口来进行 SM4 加密和解密操作。加密使用的模式是 ECB 模式,密钥长度为 128 位。注意,这个示例代码中的密钥是一个字符串,实际应用中可以根据需要生成合适的密钥。
原文地址: https://www.cveoy.top/t/topic/p19L 著作权归作者所有。请勿转载和采集!