今天给各位分享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;
}
MD5是HASH算法,他不能用来解密的,他主要是用来校验信息的完整型,也就是我们常说的数值签名,你可以去RFC文档上收索,上边有他具体的算法,代码也是封装好了的,可以去研究研究
#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库读取,加密的思路是类似的,最简单方法是把奇数位和偶数位的高程值置换一下
请选择参考资料的网页
BeeCrypt 是一个包含高度优化的C语言加密库,包括MD5,SHA-等多种加密解密算法,该库是通用函数库,并与任何版权无关。符合GNU开放源码要求
点击下列连接可以直接下载源代码
#include stdio.h
int const N = 10;
// 将方阵a[N][N]第row行循环左移m位
void RowLeftn(char a[][N],int n,int row,int m) {
int i,j,t;
if(row 0 || row n - 1) return;
for(i = 0; i m; ++i) {
t = a[row][0];
for(j = 0; j n - 1; ++j)
a[row][j] = a[row][j + 1];
a[row][n - 1] = t;
}
}
// 将方阵a[N][N]第col列循环上移m位
void ColUpn(char a[][N],int n,int col,int m) {
int i,j,t;
if(col 0 || col n - 1) return;
for(i = 0; i m; ++i) {
t = a[0][col];
for(j = 0; j n - 1; ++j)
a[j][col] = a[j + 1][col];
a[n - 1][col] = t;
}
}
int main() {
char txt[N][N];
int a[N],b[N],i,j,n;
while(scanf("%d",n) == 1 n 0) {
fflush(stdin);
for(i = 0; i n; ++i) {
for(j = 0; j n; ++j)
scanf("%c",txt[i][j]);
}
for(i = 0; i n; ++i) {
for(j = 0; j n; ++j)
printf("%c",txt[i][j]);
printf("\n");
}
for(i = 0; i n; ++i) scanf("%d",a[i]);
for(i = 0; i n; ++i) scanf("%d",b[i]);
for(i = 0; i n; ++i) RowLeftn(txt,n,i,a[i]);
for(i = 0; i n; ++i) ColUpn(txt,n,i,b[i]);
for(i = 0; i n; ++i) {
for(j = 0; j n; ++j)
printf("%c",txt[i][j]);
}
printf("\n");
}
return 0;
}
看你催就仓促写了个,自我感觉写的不是很好,但是能用了。数据只能是大写字母组成的字符串。
加密的时候,输入Y,然后输入要加密的文本(大写字母)
解密的时候,输入N,然后输入一个整数n表示密文的个数,然后n个整数表示加密时候得到的密文。
/*RSA algorithm */
#include stdio.h
#include string.h
#include stdlib.h
#define MM 7081
#define KK 1789
#define PHIM 6912
#define PP 85
typedef char strtype[10000];
int len;
long nume[10000];
int change[126];
char antichange[37];
void initialize()
{ int i;
char c;
for (i = 11, c = 'A'; c = 'Z'; c ++, i ++)
{ change[c] = i;
antichange[i] = c;
}
}
void changetonum(strtype str)
{ int l = strlen(str), i;
len = 0;
memset(nume, 0, sizeof(nume));
for (i = 0; i l; i ++)
{ nume[len] = nume[len] * 100 + change[str[i]];
if (i % 2 == 1) len ++;
}
if (i % 2 != 0) len ++;
}
long binamod(long numb, long k)
{ if (k == 0) return 1;
long curr = binamod (numb, k / 2);
if (k % 2 == 0)
return curr * curr % MM;
else return (curr * curr) % MM * numb % MM;
}
long encode(long numb)
{ return binamod(numb, KK);
}
long decode(long numb)
{ return binamod(numb, PP);
}
main()
{ strtype str;
int i, a1, a2;
long curr;
initialize();
puts("Input 'Y' if encoding, otherwise input 'N':");
gets(str);
if (str[0] == 'Y')
{ gets(str);
changetonum(str);
printf("encoded: ");
for (i = 0; i len; i ++)
{ if (i) putchar('-');
printf(" %ld ", encode(nume[i]));
}
putchar('\n');
}
else
{ scanf("%d", len);
for (i = 0; i len; i ++)
{ scanf("%ld", curr);
curr = decode(curr);
a1 = curr / 100;
a2 = curr % 100;
printf("decoded: ");
if (a1 != 0) putchar(antichange[a1]);
if (a2 != 0) putchar(antichange[a2]);
}
putchar('\n');
}
putchar('\n');
system("PAUSE");
return 0;
}
测试:
输入:
Y
FERMAT
输出:
encoded: 5192 - 2604 - 4222
输入
N
3 5192 2604 4222
输出
decoded: FERMAT
随着社会的发展,产品的更新速度也是越来越快,算法是方案的核心,保护开发者和消费者的权益刻不容缓,那么加密芯片在其中就扮演了重要的角色,如何选择加密芯片呢?
1.市面上加密芯片种类繁多,算法多种,加密芯片强度参差不齐,加密性能与算法、秘钥密切相关。常见的加密算法有对称算法,非对称算法,国密算法,大部分都是基于I2C、SPI或1-wire协议进行通信。加密芯片还是需要项目实际需求选择,比如对称加密算法的特点是计算量小、加密速度快、加密效率高等。
2.因为单片机软加密性能较弱且非常容易被复制,所以有了加密芯片的产生,大大增加了破解难度和生产成本。目前加密芯片广泛应用于车载电子、消费电子、美容医疗、工业控制、AI智能等行业。
3.韩国KEROS加密芯片专注加密领域十多年,高安全性、低成本,在加密保护领域受到了众多客户的高度赞扬及认可。KEROS采用先进的内置aes256安全引擎和加密功能,通过真动态数据交互并为系统中敏感信息的存储提供了安全的场所,有了它的保护电路,即使受到攻击,这些信息也可以保持安全。其封装SOP8,SOT23-6,TDFN-6集成I2C与1-wire协议满足不同应用需求。CK02AT、CK22AT、CK02AP、CK22AP支持1.8V-3.6V,256bit位秘钥长度,5bytes SN序列号,支持定制化免烧录,加密行业首选。关于c加密算法库的介绍到此就结束了,感谢大家耐心阅读。