首页 > 其他分享 >SM4

SM4

时间:2024-04-29 09:36:49浏览次数:16  
标签:sm4 int SM4 unsigned char sm4enStrLen include

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

 
openssl enc -sm4-cbc -in 20211201.txt -out ciphertext.bin -K 20211201abcdeffedcba9876543210 -iv 2021120189abcdeffedcba9876543210

2. 使用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]={0x20,0x21,0x12,0x01,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;
}

 

标签:sm4,int,SM4,unsigned,char,sm4enStrLen,include
From: https://www.cnblogs.com/Euyq123/p/18164988

相关文章

  • OpenSSL测试-SM4
    任务详情0.在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务1.使用OpenSSL的命令对你的8位学号(数字)进行加密解密,密钥的前8个字节为你的8位学号,提交过程截图(5')2.使用OpenSSL编程对对"你的8位学号(数字)"进行加密解密,提交代码和运行结果截图。(10’)3.使用龙脉智能......
  • OpenSSL测试-SM4
    0.在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务1.使用OpenSSL的命令对你的8位学号(数字)进行加密解密,密钥的前8个字节为你的8位学号,提交过程截图(5') 2.使用OpenSSL编程对对"你的8位学号(数字)"进行加密解密,提交代码和运行结果截图。(10’) #include<openssl......
  • SM4测试
    SM4代码如下: ``#include<openssl/evp.h>include<stdio.h>include<string.h>intmain(){EVP_CIPHER_CTX*ctx;intlen;intciphertext_len;unsignedchar*plaintext=(unsignedchar*)"20211122";unsignedcharkey[]="20211......
  • SM4加密
    org.bouncycastle.jce.provider.BouncyCastleProvider;org.bouncycastle.pqc.math.linearalgebra.ByteUtils;javax.crypto.Cipher;javax.crypto.spec.SecretKeySpec;java.security.Key;java.security.Security;/*入参:str:EPIDEMIC_KEY*/StringENCODING="UTF-......
  • 使用OpenEuler x86_64 实现Bouncycastle SM4加解密功能
    使用OpenEulerx86_64实现BouncycastleSM4加解密功能一、安装运行环境安装java和mavensudoyuminstalljava-17-openjdksudoyuminstallmaven安装完成后,你就可以在OpenEuler上使用Maven来管理Java项目了。二、创建项目工程在项目根目录下创建pom.xml文......
  • lazarus使用CNvcl 中的CNSM4
    参考了Yang杨。老师的代码,原来是delphi代码,因为个人转到lazarus,所以进行移植了。方法如下:下载最新的CNVCL,CnNative,要修改一下,其它引用单元注释掉{.$ICnPack.inc}//加个点CnNative,加个定义{$DEFineSUPPORT_UINT64} 其它可以参考原文:https://www.cnblogs.com/Yang-YaChao/p/1......
  • Java SM4 工具类,依赖bcprov-jdk15on
    Java实现SM4国密加解密,依赖bcprov-jdk15on.jar<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version></dependency>/***@authorEvanY*@since......
  • nodejs中实现sm4加解密
    SM4是中国密码局颁布的一种分组密码算法,也称为国密SM4。它是基于对称密钥加密算法的一种分组密码算法,具有较高的安全性和较快的加密速度。SM4使用128位的密钥和128位的分组进行加密。sm-crypto是一个支持国密SM2、SM3、SM4等算法的Node.js加密库。要使用sm-crypto库......
  • php的SM4加密
     <?php/***Sm4加密解密类*ClassSm4Helper*@packageapp\common\tools*/classSm4{constSM4_CK=[0x00070e15,0x1c232a31,0x383f464d,0x545b6269,0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9,0xe0e7eef5,0xfc030......
  • 【chatgpt】sm4密匙
     SM4算法的16位密钥(128位)是由16个字节组成的。每个字节可以表示0x00到0xFF(十进制的0到255)范围内的任意值。密钥可以使用任何有效的字节值,因此在理论上可以使用任何字符来表示密钥的字节。常见的表示密钥的字符集包括十六进制字符(0-9,A-F)和Base64编码字符(A-Z,a-z,0-9,+,/)等。在具......