OpenSSL测试-SM4

文章指导如何在OpenSSL命令行和C++编程中对8位学号进行SM4-CBC加密解密,提供了示例代码,并要求与龙脉智能钥匙的结果对比。
摘要由CSDN通过智能技术生成

一、任务详情

  1. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
  2. 使用OpenSSL的命令对你的8位学号(数字)进行加密解密,密钥的前8个字节为你的8位学号,提交过程截图
  3. 使用OpenSSL编程对对"你的8位学号(数字)"进行加密解密,提交代码和运行结果截图。
  4. 使用龙脉智能钥匙完成 2的内容,并与OpenSSL的结果进行对比,提交代码和运行结果截图。

二、 使用OpenSSL的命令对你的8位学号(数字)进行加密解密

openssl enc -sm4-cbc -in 20211217.txt -out ciphertext.bin -K 2021121789abcdeffedcba9876543210 -iv 2021121789abcdeffedcba9876543210

在这里插入图片描述

三、 使用OpenSSL编程对"你的8位学号(数字)"进行加密解密

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/ec.h>
int main(int argc, char *argv[])
{
    unsigned char sm4_en[512],sm4_de[512];
    int sm4enStrLen,sm4deStrLen;
    unsigned char source[7]={0x31,0x33,0x34,0x33,0x45,0x46,0x43};
    unsigned char keyStr[16]={0x15,0x67,0x28,0xe1,0x5f,0x9a,0xfc,0x01,0xd4,0xb6,0x1b,0x4e,0x44,0x5d,0xbb,0x26};
    sm4enStrLen=my_sm4encrpt(keyStr,source,7,sm4_en);
    printf("sm4enStrLen:%d\n",sm4enStrLen);
    for(int i=0;i<sm4enStrLen;++i)
    {
        printf("0x%x",sm4_en[i]);
    }
    printf("\n");
    sm4deStrLen=dencryptStr(keyStr,sm4_en,sm4enStrLen,sm4_de);
    printf("sm4deStrLen:%d\n",sm4deStrLen);
    for(int i=0;i<7;++i)
    {
        printf("0x%x",sm4_de[i]);
    }
    printf("\n");
}
int my_sm4encrpt(unsigned char * keyStr,unsigned char * surbuf,int surlen,unsigned char * enbuf)
{
    unsigned char *out_buf = enbuf;
    int out_len;
    int out_padding_len;
    int i;
    unsigned char *iv;
    EVP_CIPHER_CTX *ctx;
    ctx = EVP_CIPHER_CTX_new();
    EVP_EncryptInit(ctx, EVP_sm4_ecb(), keyStr, iv);
    if( 0 == surlen % 16 )
    {
        EVP_CIPHER_CTX_set_padding( ctx, 0 );
    }
    out_len = 0;
    EVP_EncryptUpdate(ctx, out_buf, &out_len, surbuf, surlen);
    out_padding_len = 0;
    EVP_EncryptFinal(ctx, out_buf + out_len, &out_padding_len);
 
    EVP_CIPHER_CTX_free(ctx);
    return out_len + out_padding_len;
}
 
 
int dencryptStr(unsigned char * sm4PriKey, unsigned char *cEnStr, int cEnstrlen, unsigned char *deStr)
{
    unsigned char *iv;
    EVP_CIPHER_CTX *ctx;
    int len;
    int temlen;
    int deStrLen;
    if (!(ctx = EVP_CIPHER_CTX_new())) {
       printf("EVP_CIPHER_CTX_new failed");
    }
    if (1 != EVP_DecryptInit(ctx, EVP_sm4_ecb(), sm4PriKey, iv)) {
        printf("EVP_DecryptInit_ex failed");
    }
 
 
    if (1 != EVP_DecryptUpdate(ctx, deStr, &len, cEnStr, cEnstrlen)) {
        printf("EVP_DecryptUpdate failed");
    }
    if( 0 == len % 16 )
    {
        EVP_CIPHER_CTX_set_padding( ctx, 0 );
        len += 16;
 
    }
    if( !EVP_DecryptFinal( ctx, deStr + len, &temlen ) )
    {
        printf("EVP_DecryptFinal failed");
        return EXIT_FAILURE;
    }
    deStrLen=len+temlen;
    printf("解密数据:%d\n",deStrLen);
    for (int i = 0;i < deStrLen;i++) {
        printf("0x%02x ",*(deStr + i));
    }
    printf("\n");
    EVP_CIPHER_CTX_free(ctx);
    return deStrLen;
}

在这里插入图片描述

在PHP5中,可以使用`openssl_encrypt`和`openssl_decrypt`函数来实现SM4算法的加密和解密。 下面是一个示例代码: ```php function sm4_encrypt($data, $key) { $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('sm4-cbc')); $encrypted = openssl_encrypt($data, 'sm4-cbc', $key, OPENSSL_RAW_DATA, $iv); return base64_encode($iv . $encrypted); } function sm4_decrypt($data, $key) { $data = base64_decode($data); $iv = substr($data, 0, openssl_cipher_iv_length('sm4-cbc')); $encrypted = substr($data, openssl_cipher_iv_length('sm4-cbc')); return openssl_decrypt($encrypted, 'sm4-cbc', $key, OPENSSL_RAW_DATA, $iv); } // 测试 $data = "hello world"; $key = "this is a key"; $encrypted = sm4_encrypt($data, $key); $decrypted = sm4_decrypt($encrypted, $key); echo "加密后的数据: " . $encrypted . "\n"; echo "解密后的数据: " . $decrypted . "\n"; ``` 在这段代码中,`sm4_encrypt`函数使用`openssl_encrypt`函数对数据进行加密,然后用base64编码返回加密后的结果。`sm4_decrypt`函数则对base64解码后的数据进行解密,并返回解密后的结果。在测试中,我们使用了一个字符串作为数据,一个字符串作为密钥,然后对数据进行加密和解密。 需要注意的是,在使用SM4算法时,需要使用`sm4-cbc`算法模式,并且需要提供一个随机的初始化向量(IV)来增加加密的强度。在本例中,我们使用`openssl_random_pseudo_bytes`函数生成一个随机的IV。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值