c语言 数据加密
那位仁兄可以用c写出来? 展开
void main()
{
int a[5]; /* 存储各位上的数字 */
int num, temp, encripy; /* num是要输入的数,temp是交换时用来存储临时值,encripy是加密后的数据 */
int i;
do
{
printf("Please input the number:");
scanf("%d",&num);
if(!(num/10000 !=0 && num/100000==0))
printf("Data error!\n");
}while(!(num/10000 !=0 && num/100000==0));
a[0] = num/10000%10; /* 求各位上的数字 */
a[1] = num/1000%10;
a[2] = num/100%10; /* 百位上的数字 */
a[3] = num/10%10; /* 十位上的数字 */
a[4] = num%10; /* 个位上的数字 */
for(i = 0; i < 5; ++i) /* 开始加密 */
a[i] = (a[i] + 8)%10;
temp = a[0]; /* 交换位置开始 */
a[0] = a[3];
a[3] = temp;
temp = a[1];
a[1] = a[2];
a[2] = temp; /* 交换位置结束同时加密结束 */
encripy = a[0]*10000 + a[1]*1000 + a[2]*100 + a[3]*10 + a[4]; /* 加密后的数据 */
printf("\nThe scourse number: %d\n", num); /* 输出原数据 */
printf("\nEncripy the number: %d\n\n", encripy); /* 输出加密后的数据 */
}
在VC6.0成功运行,希望对你有帮助!
什么是异或算法
异或的特点是原始值经过两次异或某一个数后会变成原来的值,所以有时利用这个特性来进行加密,加密端把数据与一个密钥进行异或操作,生成密文。接收方收到密文后利用加密方提供的密钥进行再次异或操作就能得到明文。
例程:
/*以DWORD为单位对文件进行加密,将每个DWORD与0xfcba0000(密钥)做异或,写入另一个文件*/
#include <stdio.h>
#include <stdlib.h>
#define DWORD unsigned long
#define BYTE unsigned char
#define false 0
#define true 1
int main(int argc, char *argv[])
{
FILE *hSource;
FILE *hDestination;
DWORD dwKey=0xfcba0000;
char* pbBuffer;
DWORD dwBufferLen=sizeof(DWORD);
DWORD dwCount;
DWORD dwData;
if(argv[1]==0||argv[2]==0)
{
printf("missing argument!\n");
return false;
}
char* szSource=argv[1];
char* szDestination=argv[2];
hSource = fopen(szSource,"rb");// 打开源文件.
hDestination = fopen(szDestination,"wb"); //打开目标文件
if (hSource==NULL) {printf("open Source File error !"); return false ;}
if (hDestination==NULL){ printf("open Destination File error !"); return false ;}
//分配缓冲区
pbBuffer=(char* )malloc(dwBufferLen);
do {
// 从源文件中读出dwBlockLen个字节
dwCount = fread(pbBuffer, 1, dwBufferLen, hSource);
//加密数据
dwData = *(DWORD*)pbBuffer; //char* TO dword
dwData^=dwKey; //xor operation
pbBuffer = (char *) &dwData;
// 将加密过的数据写入目标文件
fwrite(pbBuffer, 1, dwCount, hDestination);
} while(!feof(hSource));
//关闭文件、释放内存
fclose(hSource);
fclose(hDestination);
printf("%s is encrypted to %s\n",szSource,szDestination);
return 0;
}
#define MAX 5
#if 1
int swap (int *p, int len) //交换函数 负责交换 1-4 2-3
{
int tmp;
tmp = p[0];
p[0] = p[3];
p[3] = tmp;
tmp = p[1];
p[1] = p[2];
p[2] = tmp;
return 0;
}
int encrypt (int *p, int len) //加密函数 +8然后跟10 取余
{
while (len--)
{
*p = ((*p)+8)%10;
p++;
}
return 0;
}
#endif
int show (int *p, int len) //显示数组内容函数
{
while (len--)
{
printf ("%3d", *p);
p++;
}
printf ("\n");
return 0;
}
int main (int argc, char *argv[])
{
int a[MAX] = {4,20,11,23,18};
show (a,MAX);
encrypt (a, MAX);
show (a, MAX);
swap (a, MAX);
show (a, MAX);
return 0;
}
================
输出结果:
4 20 11 23 18 //原数
2 8 9 1 6 //加密后
1 9 8 2 6 //更换位置后
兄台记得给分!!
int test(int testData)
{
int src=testData;
if(!(src/10000!=0 && src/100000==0)
return -1;
int temp;
int temp1;
src+=88888;
src/=10;
temp=src/10000;
temp1=src/10%10;
src-=(temp*10000);
src-=(temp1*10);
src+=(temp1*10000);
src+=(temp*10);
temp=src/1000%10;
temp1=src/100%10;
src-=(temp*1000);
src-=(temp1*100);
src+=temp1*1000;
src+=temp*100;
printf("原数据:%d,加密后数据%d.\n",testData,src);
};
int main()
{
int testData = 12345;
test(12345);
return 0;
}
//注:第一位是指最高位。如果不是这个意思,可以修改