173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

c语言加密算法库

keros@mark 2022-10-28 资讯中心

很高兴和大家一起分享c语言加密算法库的知识,希望对各位有所帮助。

本文目录一览

急求一个完整的c语言图像置乱加密算法!!!

#include "windows.h" 

#include "stdio.h"  

#include "string.h"  

#include "malloc.h"  

unsigned char *pBmpBuf;//读入图像数据的指针  

unsigned char *pEnBmpBuf;//加密图像数据的指针

unsigned char *pUnBmpBuf;//解密图像数据的指针

char key=255;//密钥

int bmpWidth;//图像的宽  

int bmpHeight;//图像的高  

RGBQUAD *pColorTable;//颜色表指针  

int biBitCount;//图像类型,每像素位数  

bool readBmp(char *bmpName)  

{  

//二进制读方式打开指定的图像文件  

FILE *fp=fopen(bmpName,"rb");  

if(fp==0) return 0;  

//跳过位图文件头结构BITMAPFILEHEADER  

fseek(fp, sizeof(BITMAPFILEHEADER),0);  

//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中  

BITMAPINFOHEADER head;     

fread(head, sizeof(BITMAPINFOHEADER), 1,fp);    

//获取图像宽、高、每像素所占位数等信息  

bmpWidth = head.biWidth;  

bmpHeight = head.biHeight;  

biBitCount = head.biBitCount;  

//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)  

int lineByte=(bmpWidth * biBitCount/8+3)/4*4;  

//灰度图像有颜色表,且颜色表表项为256  

if(biBitCount==8){  

//申请颜色表所需要的空间,读颜色表进内存  

pColorTable=new RGBQUAD[256];  

fread(pColorTable,sizeof(RGBQUAD),256,fp);  

}  

//申请位图数据所需要的空间,读位图数据进内存  

pBmpBuf=new unsigned char[lineByte * bmpHeight];  

fread(pBmpBuf,1,lineByte * bmpHeight,fp);  

//关闭文件  

fclose(fp);  

return 1;  

}  

void  encrypt(char k)

{

//加密,奇数位置的像素使用位运算加密,偶数位置像素为原始值

int lineByte=(bmpWidth * biBitCount/8+3)/4*4;

pEnBmpBuf=new unsigned char[lineByte * bmpHeight]; 

for (int i=0;ilineByte * bmpHeight;i++) 

{

if (i%2==0)

{

pEnBmpBuf[i]=pBmpBuf[i];

}

else pEnBmpBuf[i]=pBmpBuf[i]^k;

}

}

void  unencrypt(char k)

{

//解密

int lineByte=(bmpWidth * biBitCount/8+3)/4*4;

pUnBmpBuf=new unsigned char[lineByte * bmpHeight]; 

for (int i=0;ilineByte * bmpHeight;i++) 

{

if (i%2==0)

{

pUnBmpBuf[i]=pEnBmpBuf[i];

}

else pUnBmpBuf[i]=pEnBmpBuf[i]^k;

}

}

bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,    

int biBitCount, RGBQUAD *pColorTable)  

{  

//如果位图数据指针为0,则没有数据传入,函数返回  

if(!imgBuf)  

{printf("error\n!");return 0;  }

//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0  

int colorTablesize=0;  

if(biBitCount==8)  

colorTablesize=1024;  

//待存储图像数据每行字节数为4的倍数  

int lineByte=(width * biBitCount/8+3)/4*4;  

//以二进制写的方式打开文件  

FILE *fp=fopen(bmpName,"wb");  

if(fp==0) return 0;  

//申请位图文件头结构变量,填写文件头信息  

BITMAPFILEHEADER fileHead;  

fileHead.bfType = 0x4D42;//bmp类型  

//bfSize是图像文件4个组成部分之和  

fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)  

+ colorTablesize + lineByte*height;  

fileHead.bfReserved1 = 0;  

fileHead.bfReserved2 = 0;  

//bfOffBits是图像文件前3个部分所需空间之和  

fileHead.bfOffBits=54+colorTablesize;  

//写文件头进文件  

fwrite(fileHead, sizeof(BITMAPFILEHEADER),1, fp);  

//申请位图信息头结构变量,填写信息头信息  

BITMAPINFOHEADER head;    

head.biBitCount=biBitCount;  

head.biClrImportant=0;  

head.biClrUsed=0;  

head.biCompression=0;  

head.biHeight=height;  

head.biPlanes=1;  

head.biSize=40;  

head.biSizeImage=lineByte*height;  

head.biWidth=width;  

head.biXPelsPerMeter=0;  

head.biYPelsPerMeter=0;  

//写位图信息头进内存  

fwrite(head, sizeof(BITMAPINFOHEADER),1, fp);  

//如果灰度图像,有颜色表,写入文件    

if(biBitCount==8)  

fwrite(pColorTable, sizeof(RGBQUAD),256, fp);  

//写位图数据进文件  

fwrite(imgBuf, height*lineByte, 1, fp);  

//关闭文件  

fclose(fp);  

return 1;  

}  

void main()  

{  

char inFileName[90],outFileName1[90],outFileName2[90];  

printf("请输入原始位图文件的文件名:");  

scanf("%s",inFileName);  

printf("请输入加密程序产生的新位图文件的文件名:");  

scanf("%s",outFileName1);  

printf("请输入解密程序产生的新位图文件的文件名:");  

scanf("%s",outFileName2);  

//读入指定BMP文件进内存  

readBmp(inFileName);  

//输出图像的信息  

printf("width=%d,height=%d, biBitCount=%d\n",bmpWidth,bmpHeight, biBitCount);  

//图像加密

encrypt(key);

//将加密数据存盘  

saveBmp(outFileName1, pEnBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);  

//图像解密

unencrypt(key);

//将解密数据存盘  

saveBmp(outFileName2, pUnBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);  

//清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间  

delete []pBmpBuf;  

if(biBitCount==8)  

delete []pColorTable;  

}

读取BMP,使用位运算加密,你也可以自己改

dem数据的话,一般用GDAL库读取,加密的思路是类似的,最简单方法是把奇数位和偶数位的高程值置换一下

c语言加密解密算法

这里使用的是按位加密,按ASCII码进行加密的算法自己写个,很容易的。

#includestdio.h

#includestdlib.h

#includeconio.h

#includestring.h

void dofile(char *in_fname,char *pwd,char *out_fname);/*对文件进行加密的具体函数*/

void usage(char *name);

void main(int argc,char *argv[])/*定义main()函数的命令行参数*/

{

char in_fname[30];/*用户输入的要加密的文件名*/

char out_fname[30];

char pwd[10];/*用来保存密码*/

if(argc!=4)

{/*容错处理*/

usage(argv[0]);

printf("\nIn-fname:\n");

gets(in_fname);/*得到要加密的文件名*/

while(*in_fname==NULL)

{

printf("\nIn-fname:\n");

gets(in_fname);

}

printf("Password 6-8:\n");

gets(pwd);/*得到密码*/

while(*pwd==NULL || strlen(pwd)8 || strlen(pwd)6)

{

printf("Password 6-8:\n");

gets(pwd);

}

printf("Out-file:\n");

gets(out_fname);/*得到加密后你要的文件名*/

while(*in_fname==NULL)

{

printf("Out-file:\n");

gets(out_fname);

}

while(!strcmp(in_fname,out_fname))

{

printf("文件名不能和源文件相同\n");

printf("Out-file:\n");

gets(out_fname);

}

dofile(in_fname,pwd,out_fname);

printf("加密成功,解密请再次运行程序\n");

}

else

{/*如果命令行参数正确,便直接运行程序*/

strcpy(in_fname,argv[1]);

strcpy(pwd,argv[2]);

strcpy(out_fname,argv[3]);

while(*pwd==NULL || strlen(pwd)8 || strlen(pwd)6)

{

printf("Password faied!\n");

printf("Password 6-8:\n");

gets(pwd);

}

while(!strcmp(in_fname,out_fname))

{

printf("文件名不能和源文件相同\n");

printf("Out-file:\n");

gets(out_fname);

while(*in_fname==NULL)

{

printf("Out-file:\n");

gets(out_fname);

}

}

dofile(in_fname,pwd,out_fname);

printf("加密成功,解密请再次运行程序\n");

}

}

/*加密子函数开始*/

void dofile(char *in_fname,char *pwd,char *out_file)

{

FILE *fp1,*fp2;

register char ch;

int j=0;

int j0=strlen(pwd);

fp1=fopen(in_fname,"rb");

if(fp1==NULL)

{

printf("cannot open in-file.\n");

exit(1);/*如果不能打开要加密的文件,便退出程序*/

}

fp2=fopen(out_file,"wb");

if(fp2==NULL)

{

printf("cannot open or create out-file.\n");

exit(1);/*如果不能建立加密后的文件,便退出*/

}

/*加密算法开始*/

while(j0=0)

{

ch=fgetc(fp1);

while(!feof(fp1))

{

fputc(ch^pwd[j=j0?j=0:j++],fp2);/*异或后写入fp2文件*/

ch=fgetc(fp1);

}

j0--;

}

fclose(fp1);/*关闭源文件*/

fclose(fp2);/*关闭目标文件*/

}

void usage(char *name)

{

printf("\t=======================File encryption======================\n");

printf("\tusage: %s In-fname password out_fname\n",name);

printf("\tExample: %s file1.txt 12345678 file2.txt\n",name);

}

C语言 加密算法

#include stdio.h

#include string.h

#define MAX_LEN 1024

#define MAX_KEY_LEN 10

/* key必须是1-9之间的数字 */

/* 拥有K个字符的Key,包含且仅包含1-K */

int CheckKey(char*key)

{

int i,check[MAX_KEY_LEN]={0};

int max=strlen(key);

int keyVal;

for(i=0; imax; i++)

{

keyVal = key[i]-'0';

if(keyVal  max || keyVal  1)

 return 0;

if(check[keyVal]==1)

 return 0;

else

 check[keyVal] = 1;

}

return 1;

}

int Encrypt( char* word, char* key, char* secretWord )

{

int i,start;

int nLenWord = strlen(word);

int nLenKey = strlen(key);

int index[MAX_KEY_LEN];

if(nLenWord % nLenKey != 0)

{

printf("明文的位数不是密钥位数的整数倍!\n");

return 0;

}

for(i=0; inLenKey; i++)

{

index[i] = key[i] - '0' -1;

}

/*START 关键代码*/

start = 0;

while(start  nLenWord)

{

for(i=0;inLenKey;i++)

{

 secretWord[start + i] = word[start + index[i]];

}

start += nLenKey;

}

secretWord[nLenWord] = '\0';

/* END 关键代码*/

return 1;

}

int main()

{

char word[MAX_LEN];

char key[MAX_KEY_LEN];

char secretWord[MAX_LEN];

printf("请输入明文:");

scanf("%1024s",word);

printf("请输入密钥:");

scanf("%10s",key);

if(!CheckKey(key))

{

printf("密钥输入错误!\n");

exit(-1);

}

if(Encrypt(word,key,secretWord))

       printf("密文是:%s\n",secretWord);

return 0;

}

智能化时代的到来涉及了各种核心算法,保护算法就能保障开发者权益,杜绝市面上各种山寨品,加密芯片恰好能起到很好的保护作用,如何选择加密芯片呢?KEROS加密芯片专注于加密领域十余年,行业首选。
1.安全性:采用国际通用aes256算法加密并同时通过KAS传送,除基本认证之外,利用2K安全EEPROM,用户可以自己管理密钥和数据,实现双重保护。
2.唯一性:以定制的方式为每一位用户单独定制“专属型号CID”,多用户之间算法不兼容,并且采用固化的方法直接将算法固化到晶圆上而无需烧入。
3.序列号:每颗芯片制造生产时具有5字节全球唯一SN序列号,每颗芯片SN都不会重复。
4.防抄特性:每颗芯片都有自己独特的密钥系统,破解单颗芯片只对这颗芯片对应的产品有效,对整个同类型的产品是无效的,依旧无法通过验证。而且KEROS采用ASIC方法设计,芯片内为纯逻辑电路,封装内有40多层逻辑电路整合了10万多个逻辑门,爆力刨片破解难度可想而知。
5.安全存储:用户可以将保密数据加密之后安全的存放到EEPROM中。c语言加密算法库的介绍就聊到这里吧,感谢你花时间阅读本站内容。

本文标签:c语言加密算法库

产品列表
产品封装
友情链接