很高兴和大家一起分享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库读取,加密的思路是类似的,最简单方法是把奇数位和偶数位的高程值置换一下
这里使用的是按位加密,按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);
}
#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语言加密算法库