openssl sm2加密解密
时间: 2023-10-22 15:10:31 浏览: 582
OpenSSL 1.1.1版本及以上支持SM2算法,可以使用以下命令进行SM2加密解密:
SM2加密:
```
openssl sm2 -encrypt -in plaintext.txt -out ciphertext.txt -outform DER publickey.pem
```
其中,`plaintext.txt`是待加密的明文文件,`ciphertext.txt`是加密后的密文文件,`publickey.pem`是SM2公钥文件,DER格式。
SM2解密:
```
openssl sm2 -decrypt -in ciphertext.txt -out plaintext.txt -inform DER -inkey privatekey.pem
```
其中,`ciphertext.txt`是加密后的密文文件,`plaintext.txt`是解密后的明文文件,`privatekey.pem`是SM2私钥文件。
需要注意的是,SM2算法是国密算法,需要使用国密标准的公私钥格式和加解密方式。如果使用的是其他格式或算法,可能会导致加解密失败。
相关问题
openssl sm2加解密C语言调用
以下是 OpenSSL 库中使用 SM2 算法进行加解密的示例代码:
```c
#include <openssl/evp.h>
#include <openssl/ec.h>
#include <openssl/err.h>
#include <openssl/objects.h>
#include <openssl/sm2.h>
void sm2_encrypt_decrypt_example()
{
EVP_PKEY* pkey = NULL;
EC_KEY* ec_key = NULL;
unsigned char* plaintext = (unsigned char*)"test";
unsigned char ciphertext[1024] = {0};
int ciphertext_len = 0;
unsigned char decryptedtext[1024] = {0};
int decryptedtext_len = 0;
EVP_MD_CTX* mdctx = NULL;
// 生成 SM2 密钥对
ec_key = EC_KEY_new_by_curve_name(NID_sm2);
if (ec_key == NULL)
{
goto cleanup;
}
if (!EC_KEY_generate_key(ec_key))
{
goto cleanup;
}
pkey = EVP_PKEY_new();
if (pkey == NULL)
{
goto cleanup;
}
if (!EVP_PKEY_set1_EC_KEY(pkey, ec_key))
{
goto cleanup;
}
// 加密
mdctx = EVP_MD_CTX_new();
if (mdctx == NULL)
{
goto cleanup;
}
if (!EVP_PKEY_encrypt_init(mdctx))
{
goto cleanup;
}
if (!EVP_PKEY_CTX_set_ec_scheme(mdctx->pkey_ctx, NID_sm_scheme))
{
goto cleanup;
}
if (!EVP_PKEY_CTX_set_ec_encrypt_md(mdctx->pkey_ctx, EVP_sm3()))
{
goto cleanup;
}
if (!EVP_PKEY_CTX_set_ec_key(mdctx->pkey_ctx, ec_key))
{
goto cleanup;
}
if (!EVP_PKEY_encrypt(mdctx, ciphertext, &ciphertext_len, plaintext, strlen((char*)plaintext)))
{
goto cleanup;
}
// 解密
if (!EVP_PKEY_decrypt_init(mdctx))
{
goto cleanup;
}
if (!EVP_PKEY_CTX_set_ec_scheme(mdctx->pkey_ctx, NID_sm_scheme))
{
goto cleanup;
}
if (!EVP_PKEY_CTX_set_ec_decrypt_md(mdctx->pkey_ctx, EVP_sm3()))
{
goto cleanup;
}
if (!EVP_PKEY_CTX_set_ec_key(mdctx->pkey_ctx, ec_key))
{
goto cleanup;
}
if (!EVP_PKEY_decrypt(mdctx, decryptedtext, &decryptedtext_len, ciphertext, ciphertext_len))
{
goto cleanup;
}
printf("Decrypted text is: %s\n", decryptedtext);
cleanup:
if (mdctx != NULL)
{
EVP_MD_CTX_free(mdctx);
}
if (pkey != NULL)
{
EVP_PKEY_free(pkey);
}
if (ec_key != NULL)
{
EC_KEY_free(ec_key);
}
}
```
该示例代码中使用了 OpenSSL 库中的 `EVP_PKEY_encrypt()` 和 `EVP_PKEY_decrypt()` 函数进行加解密操作。SM2 算法的相关参数通过 `EVP_PKEY_CTX_set_ec_scheme()` 和 `EVP_PKEY_CTX_set_ec_encrypt_md()` 等函数设置。请注意,此示例代码仅作为参考,具体实现可能需要根据应用场景进行调整。
php sm2加密解密
PHP SM2加密解密是基于SM2算法实现的一种加密方式。SM2是由国家密码管理局发布的非对称加密算法,它是一种公钥密码体制,可以用于数字签名、密钥交换、认证协议等场景。
在PHP中,可以使用openssl扩展来实现SM2算法的加密解密。首先需要生成一对公私钥,然后使用公钥进行加密,私钥进行解密。具体实现步骤如下:
1. 生成公私钥
```php
$config = array(
"private_key_bits" => 256,
);
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $private_key);
$public_key = openssl_pkey_get_details($res)["key"];
```
2. 加密数据
```php
$data = "Hello, world!";
openssl_public_encrypt($data, $encrypted_data, $public_key, OPENSSL_PKCS1_OAEP_PADDING);
```
3. 解密数据
```php
openssl_private_decrypt($encrypted_data, $decrypted_data, $private_key, OPENSSL_PKCS1_OAEP_PADDING);
```
需要注意的是,在使用SM2算法进行加密解密时,需要使用OPENSSL_PKCS1_OAEP_PADDING填充方式。同时,SM2算法的加解密速度相对较慢,因此需要注意性能问题。
阅读全文