基本信息
源码名称:国密SM4的5种加密模式(ECB CBC CFB OFB CTR XTS)源码及其参考文档
源码大小:1.36M
文件格式:.rar
开发语言:C/C++
更新时间:2019-07-16
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

/*
 * SM4/SMS4 algorithm test programme
 * 2012-4-21
 */

#include <string.h>
#include <stdio.h>
int main()
{
	unsigned char input_f[32] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10};
	unsigned char key[16] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10};
	unsigned char iv[16] = {0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf};
	unsigned char output_f[32];
	unsigned long i;

    unsigned char *input;
    unsigned char *output;
	printf("=======================ecb=======================\n");
	//encrypt ecb
    input = input_f;
    output= output_f;
    sm4_ecb(key,0,1,input,output);
		for(i=0;i<16;i  ){
		  printf("%02x ", output[i]);
          input[i] = output[i];
        }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_ecb(key,0,0,input,output);
		for(i=0;i<16;i  ){
	  	  printf("%02x ", output[i]);
          input[i] = output[i];
        }
	printf("\n");
	//decrypt ecb
    input = input_f;
    output= output_f;
    sm4_ecb(key,1,1,input,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_ecb(key,1,0,input,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
	printf("\n");


	printf("=======================cbc=======================\n");
	//encrypt cbc
    input = input_f;
    output= output_f;
    sm4_cbc(key,0,1,iv,input,output);
		for(i=0;i<16;i  ){
		  printf("%02x ", output[i]);
          input[i] = output[i];
        }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_cbc(key,0,0,iv,input,output);
		for(i=0;i<16;i  ){
	  	  printf("%02x ", output[i]);
          input[i] = output[i];
        }
	printf("\n");
	//decrypt cbc
    input = input_f;
    output= output_f;
    sm4_cbc(key,1,1,iv,input,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_cbc(key,1,0,iv,input,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
	printf("\n");

	printf("=======================cfb=======================\n");
	//encrypt cfb
       input = input_f;
    output= output_f;
    sm4_cfb(key,0,1,iv,input,output);
		for(i=0;i<16;i  ){
		  printf("%02x ", output[i]);
          input[i] = output[i];
        }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_cfb(key,0,0,iv,input,output);
		for(i=0;i<16;i  ){
	  	  printf("%02x ", output[i]);
          input[i] = output[i];
        }
	printf("\n");
	//decrypt cfb
    input = input_f;
    output= output_f;
    sm4_cfb(key,1,1,iv,output,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_cfb(key,1,0,iv,output,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
	printf("\n");


  
	printf("=======================ofb=======================\n");
	//encrypt ofb
          input = input_f;
    output= output_f;
    sm4_ofb(key,0,1,iv,input,output);
		for(i=0;i<16;i  ){
		  printf("%02x ", output[i]);
          input[i] = output[i];
        }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_ofb(key,0,0,iv,input,output);
		for(i=0;i<16;i  ){
	  	  printf("%02x ", output[i]);
          input[i] = output[i];
        }
	printf("\n");
	//decrypt ofb
    input = input_f;
    output= output_f;
    sm4_ofb(key,1,1,iv,output,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_ofb(key,1,0,iv,output,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
	printf("\n");




	printf("=======================ctr=======================\n");
	//encrypt ctr
   
          input = input_f;
    output= output_f;
    sm4_ctr(key,0,1,iv,input,output);
		for(i=0;i<16;i  ){
		  printf("%02x ", output[i]);
          input[i] = output[i];
        }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_ctr(key,0,0,iv,input,output);
		for(i=0;i<16;i  ){
	  	  printf("%02x ", output[i]);
          input[i] = output[i];
        }
	printf("\n");
	//decrypt ctr
    input = input_f;
    output= output_f;
    sm4_ctr(key,1,1,iv,output,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_ctr(key,1,0,iv,output,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
	printf("\n");





	printf("=======================xts=======================\n");
	//encrypt xts
	unsigned char key1[16] ={0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};
	unsigned char key2[16] ={0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22};
    input = input_f;
    output= output_f;
    sm4_xts(key1,key2,0,1,iv,input,output);
		for(i=0;i<16;i  ){
		  printf("%02x ", output[i]);
          input[i] = output[i];
        }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_xts(key1,key2,0,0,iv,input,output);
		for(i=0;i<16;i  ){
	  	  printf("%02x ", output[i]);
          input[i] = output[i];
        }
	printf("\n");
	//decrypt xts
    input = input_f;
    output= output_f;
    sm4_xts(key1,key2,1,1,iv,input,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
    input  = &input_f[16];
    output = &output_f[16];
    sm4_xts(key1,key2,1,0,iv,input,output);
	for(i=0;i<16;i  ){
		printf("%02x ", output[i]);
        input[i] = output[i];
    }
	printf("\n");



	/*
    //decrypt 1M times testing vector based on standards.
	i = 0;
	while (i<1000000) 
    {
        sm4_ecb(key,0,16,input,input);
		i  ;
    }
	for(i=0;i<16;i  )
		printf("%02x ", input[i]);
	printf("\n");
    */
}