用C语言实现SM2算法
时间: 2023-03-01 10:10:15 浏览: 150
SM2(国密算法)是中国国家密码管理局提出的一种公钥密码算法。下面是一组C语言的代码,它实现了SM2算法的关键步骤:
```
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/bn.h>
#include <openssl/ec.h>
#include <openssl/evp.h>
#include <openssl/sm2.h>
#include <openssl/err.h>
#define MAX_LEN 128
int sm2_encrypt(unsigned char *plaintext, int plaintext_len,
unsigned char *key, unsigned char *ciphertext)
{
EC_KEY *eckey = NULL;
EC_GROUP *group = NULL;
EC_POINT *public_key = NULL;
BIGNUM *x = NULL, *y = NULL;
BN_CTX *ctx = NULL;
const EC_POINT *pub_key;
int len;
ctx = BN_CTX_new();
if (!ctx)
return 0;
BN_CTX_start(ctx);
x = BN_CTX_get(ctx);
y = BN_CTX_get(ctx);
eckey = EC_KEY_new();
if (!eckey)
goto end;
group = EC_GROUP_new_by_curve_name(NID_sm2p256v1);
if (!group)
goto end;
public_key = EC_POINT_new(group);
if (!public_key)
goto end;
if (!BN_hex2bn(&x, key))
goto end;
if (!BN_hex2bn(&y, key + 64))
goto end;
if (!EC_POINT_set_affine_coordinates_GFp(group, public_key, x, y, ctx))
goto end;
pub_key = EC_KEY_set_public_key(eckey, public_key);
if (!pub_key)
goto end;
len = SM2_encrypt(plaintext, plaintext_len, ciphertext, &len, eckey);
if (len == 0)
goto end;
EC_KEY_free(eckey);
EC_GROUP_free(group);
EC_POINT_free(public_key);
BN_CTX_end(ctx);
BN_CTX_free(ctx);
return len;
end:
EC_KEY_free(eckey);
EC_GROUP_free(group);
EC_POINT_free(public_key);
BN_CTX_end(ctx);
BN_CTX_free(ctx);
return 0;