符合国密ZCU256标准的算法,与网站对比

https://seehttps.com/gm/zuc256
https://tools.huijusa.cn/seq
This commit is contained in:
qzh
2025-09-01 02:49:57 +08:00
parent 8c4d395530
commit ec0fc7b2c4
3 changed files with 422 additions and 320 deletions

View File

@@ -2,73 +2,63 @@
#include <string.h>
#include "zuc256.h"
// 测试ZUC256加密解密功能
// 打印字节数组为十六进制
void print_hex(const char *label, const uint8_t *data, size_t len) {
printf("%s: ", label);
for (size_t i = 0; i < len; i++) {
printf("%02x ", data[i]);
}
printf("\n");
}
int main() {
// 1. 测试参数(256位密钥=32字节128位IV=16字节)
uint8_t key[32] = "0123456789abcdef0123456789abcdef"; // 32字节密钥
uint8_t iv[16] = "0123456789abcdef"; // 16字节IV
uint8_t plaintext[] = "Hello ZUC256! This is a test of the encryption algorithm.";
size_t plaintext_len = strlen((const char *)plaintext);
uint8_t ciphertext[1024] = {0}; // 密文缓冲区
uint8_t decrypted[1024] = {0}; // 解密后缓冲区
// 1. 明文
uint8_t plaintext[] = "ZUC256对称加解密测试:1234567890";
size_t plaintext_len = strlen((char*)plaintext);
printf("明文: %s\n", plaintext);
print_hex("明文(十六进制)", plaintext, plaintext_len);
// 2. 初始化加密上下文并加密
ZUC256_CTX enc_ctx;
int ret = ZUC256_Init(&enc_ctx, key, iv);
if (ret != ZUC256_SUCCESS) {
printf("加密初始化失败!错误码: %d\n", ret);
return -1;
// 2. 密钥(32字节ASCII)
uint8_t key[32] = "0123456789abcdef0123456789abcdef";
print_hex("密钥", key, 32);
// 3. 初始向量(25字节ASCII)
//注:初始向量长度为184bit分布到25个字节中前面17个初始向量为8bit字节后面8个初始向量为6bit字节(占据一个字节的低6位)
uint8_t input_iv_25byte[25] = "0123456789abcdefg01234567";
uint8_t iv[23];
extract_iv(input_iv_25byte, iv);
print_hex("提取后的IV", iv, 23);
// 4. 分配加密/解密缓冲区
uint8_t *ciphertext = (uint8_t*)malloc(plaintext_len);
uint8_t *decryptedtext = (uint8_t*)malloc(plaintext_len);
if (!ciphertext || !decryptedtext) {
printf("内存分配失败\n");
return 1;
}
ret = ZUC256_Update(&enc_ctx, ciphertext, plaintext, plaintext_len);
if (ret != ZUC256_SUCCESS) {
printf("加密处理失败!错误码: %d\n", ret);
ZUC256_Cleanup(&enc_ctx);
return -1;
}
// 5. 加密
ZUC256_STATE state;
zuc256_init(&state, key, iv);
zuc256_crypt(&state, plaintext, plaintext_len, ciphertext);
print_hex("密文", ciphertext, plaintext_len);
ret = ZUC256_Final(&enc_ctx, NULL);
if (ret != ZUC256_SUCCESS) {
printf("加密结束失败!错误码: %d\n", ret);
}
ZUC256_Cleanup(&enc_ctx); // 清理加密上下文(敏感数据)
// 6. 解密(重新初始化状态)
zuc256_init(&state, key, iv);
zuc256_crypt(&state, ciphertext, plaintext_len, decryptedtext);
print_hex("解密后", decryptedtext, plaintext_len);
printf("解密文本: %s\n", decryptedtext);
// 3. 初始化解密上下文并解密(流密码加密解密使用相同接口)
ZUC256_CTX dec_ctx;
ret = ZUC256_Init(&dec_ctx, key, iv);
if (ret != ZUC256_SUCCESS) {
printf("解密初始化失败!错误码: %d\n", ret);
return -1;
}
ret = ZUC256_Update(&dec_ctx, decrypted, ciphertext, plaintext_len);
if (ret != ZUC256_SUCCESS) {
printf("解密处理失败!错误码: %d\n", ret);
ZUC256_Cleanup(&dec_ctx);
return -1;
}
ret = ZUC256_Final(&dec_ctx, NULL);
if (ret != ZUC256_SUCCESS) {
printf("解密结束失败!错误码: %d\n", ret);
}
ZUC256_Cleanup(&dec_ctx); // 清理解密上下文
// 4. 输出结果并验证
printf("原文: %s\n", plaintext);
printf("密文: ");
for (size_t i = 0; i < plaintext_len; i++) {
printf("%02x", ciphertext[i]); // 密文以十六进制显示
}
printf("\n解密后: %s\n", decrypted);
// 验证解密结果是否与原文一致
if (memcmp(plaintext, decrypted, plaintext_len) == 0) {
printf("\n测试通过:加密解密一致!\n");
// 7. 验证结果
if (memcmp(plaintext, decryptedtext, plaintext_len) == 0) {
printf("=== 测试成功: 解密结果与明文一致 ===\n");
} else {
printf("\n测试失败:解密结果与文不一致\n");
return -1;
printf("=== 测试失败: 解密结果与文不一致 ===\n");
}
// 8. 释放内存
free(ciphertext);
free(decryptedtext);
return 0;
}