c可逆加密
1. 使用高级语言(C、C++、C#语言)实现一个加密/解密程序,调试并通过该程序。
你们也太麻烦了,下面是我自己写的加密及解密函数,VC6下测试可用!
加密程序源码:
#include<stdio.h>
void main()
{
int a[7],i,count,n,temp;
for(i=0;i<75;i++) //输出一行*,75个
printf("*");
printf("\n此程序将把您输入的一个小于8位的数通过一个算法进行加密.\n");
printf("\n\n加密规则如下:\n");
printf("\n\t首先将数据倒序,然后将每位数字都加上5,再用和与10取余代替该数字.\n");
printf("最后将第一位数和最后一位数字交换.\n");
printf("\n\n\t\t\t\t\t\t\tBY:sunflover\n");
for(i=0;i<75;i++)
printf("*");
printf("\n\n请输入需要加密的数:");
scanf("%d",&n);
if(n>0 && n<=9999999) //判断输入的密码是否超出范围,大家可以想办法让他实现n为无穷大
{
for(i=0,count=1;i<7;i++,count++) //把原数据反转并存到数组中,并计算循环次数,n=1234567
{
a[i]=n%10; //a[0]=7,a[1]6,a[2]=5
n=n/10; //n=123456,n=12345,n=1234
if(n==0)
break;
}
for(i=0;i<count;i++)//把数组中的数+5并和10取余,i<7
{
a[i]=a[i]+5; //a[0]=7+5=12,a[1]=11,a[2]=10
a[i]=a[i]%10; //a[0]=12%10=2,a[1]=1,a[2]=0
}
temp=a[0]; //交换第一位和最后一位数的位置
a[0]=a[count-1];
a[count-1]=temp;
printf("\n加密后的数是:");
for(i=0;i<count;i++)//输出最终的数
{
printf("%d",a[i]);
}
printf("\n\n");
}
else
printf("Error!Please try again!\n\n");
}
解密程序源码:
#include<stdio.h>
void main()
{
int a[7],i,count,n,temp;
for(i=0;i<75;i++) //输出一行*,75个
printf("*");
printf("\n此程序将把您输入的一个小于8位的数通过一个算法进行解密.\n");
printf("\t解密规则如下:\n");
printf("\n\t首先将第一位数和最后一位数字交换.\n");
printf("\t然后将每位数字都加上5,再用和与10取余.\n");//参考示例,观察规律//如(4+5)%10=9;(9+5)%10=4//再如(5+5)%10=0,(0+5)%10=5
printf("\t最后将数据倒序.\n");
printf("\n\n\t\t\t\t\t\t\tBy:sunflover\n");
for(i=0;i<75;i++)
printf("*");
printf("\n\n请输入需要解密的数:");
scanf("%d",&n);
if(n>0 && n<=9999999) //判断输入的数据是否超出范围,大家可以想办法让他实现n为无穷大
{
for(count=1;count<8;count++) //把数据反转并存到数组中,并计算循环次数,即数据位数
{
a[count-1]=n%10; //已实现将第一位数和最后一位数字交换,但多交换了几位
n=n/10;
if(n==0)
break;
}
for(i=0;i<count;i++)//把数组中的数+5并和10取余,如果不为0,余数加5
{
a[i]=a[i]+5;
a[i]=a[i]%10;
}
temp=a[0]; //交换第一位和最后一位数的位置,其他位置已经逆序,上面多交换了几位,这样就实现了,数据倒序
a[0]=a[count-1];
a[count-1]=temp;
printf("\n解密后的数是:");
for(i=0;i<count;i++)//输出最终的数
{
printf("%d",a[i]);
}
printf("\n\n");
}
else
printf("Error!Please try again!\n\n");
getch();
}
经验证很好用。希望能帮上忙。
2. c语言编写hill密码
// 希尔算法的加密与解密
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <memory.h>// nDime为全部变量,可逆矩阵的维数
int nDime;
int index = 0;// MAXN为明文的最大长度
const int MAXN = 256;// 矩阵相乘,a是一个列为1的矩阵
void MultiplyMatrix(int a[], int b[][10], int *text)
{
int i, j, t; for (i = 0; i < nDime; i++)
{
t = 0;
for (j = 0;j < nDime; j++)
t += b[i][j] * a[j];
text[index++] = t;
}
}// 求行列式的值
int determinant(int m[][10], int size)
{
int row, column;
int temp1[10], temp2[10], t; for (column = 0; column < size; column++)
{
temp1[column] = m[0][column];
temp2[column] = m[0][column];
}
for (row = 1; row < size; row++)
{
for (column = 0; column < size; column++)
{
int diff = column - row;
int sum = column + row;
if (diff < 0)
diff += size;
if (sum >= size)
sum %= size;
temp1[diff] *= m[row][column];
temp2[sum] *= m[row][column];
}
}
t = 0;
for (row = 0; row < size; row++)
t += temp1[row] - temp2[row]; return t;
}// 求矩阵中某一元素的代数余子式
int func(int matrix[][10], const int i, const int j)
{
int row, column, m, n;
int NewMatrix[10][10]; m = n = 0;
for (row = 0; row < nDime; row++)
{
if (i == row)
continue;
for (column = 0; column < nDime; column++)
{
if (j == column)
continue;
NewMatrix[m++][n++] = matrix[row][column];
}
}
printf ("New Array:\n");
for (row = 0; row < nDime - 1; row++)
{
for (column = 0; column < nDime - 1; column++)
printf("%d ", NewMatrix[row][column]);
printf("\n");
} int sign = (!((i + j) % 2)) ? 1 : -1;
return sign * determinant(NewMatrix, nDime - 1);
}// 对矩阵求逆,cm矩阵与m矩阵互逆
void ConverseMatrix(int m[][10], int cm[][10])
{
// 矩阵求逆,利用数学公式A(逆)= (1 / |A|)乘以A*
// 其中,|A|表示行列式A的值,而A*表示矩阵A的伴随矩阵
int row, column;
int StarMat[10][10]; // StarMat表示m的伴随矩阵
int t; // 初始化伴随矩阵
for (row = 0; row < 10; row++)
for (column = 0; column < 10; column++)
StarMat[row][column] = 0; // 求伴随矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
{
StarMat[row][column] = func(m, row, column);
printf("伴随矩阵:%d", StarMat[row][column]);
} // 求行列式的值
t = determinant(m, nDime); // 求出逆向矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
cm[row][column] = StarMat[row][column] / t;
// 输出逆向矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
printf("%d ", cm[row][column]);
printf("\n");
}// 希尔加密及解密算法
void ShellPassword(int *OText, int TextLen, int matrix[][10], int *text)
{
int i, j, n, a[10];
// 判断要将OText分成几部分
n = TextLen / nDime;
if (TextLen % nDime)
n++; // 矩阵相乘
// 将OText分成的几部分分别与matrix矩阵相乘
for (i = 0; i < n; i++)
{
for (j = 0; j < 10; j++)
a[j] = 0;
for (j = 0; j < nDime; j++)
a[j] = OText[i * nDime + j];
MultiplyMatrix(a, matrix, text);
}
}
int main(void)
{
int i, temp, row, column;
// matrix存放加密或解密矩阵,Password为加密后的结果
// OText存放原文转换为普通数字,如A~1,Z~26
int matrix[10][10], ConMatrix[10][10], OText[MAXN], Password[MAXN], OriText[MAXN];
char text[MAXN];
char sel; printf("=================================================\n");
putchar('\n');
printf(" SHELL加密解密器\n");
putchar('\n');
printf("=================================================\n"); while (1)
{
// 初始化矩阵
for (row = 0; row < 10; row++)
for (column = 0; column < 10; column++)
matrix[row][column] = 0; putchar('\n');
printf("1.加密\n");
printf("2.解密\n");
printf("0.退出\n");
printf("请输入你的选择:\n");
sel = getche(); switch (sel)
{
case '1':
printf("\n请输入原文:\n");
memset(text, '\0', sizeof(text) / sizeof(char));
memset(Password, 0, sizeof(Password) / sizeof(int));
gets(text); printf("输入加密矩阵的维数,维数不能超过10维:\n");
scanf("%d", &nDime);
printf("输入矩阵,该矩阵必须为可逆矩阵,否则将不能进行解密:\n");
// 可逆矩阵即,设A为n阶矩阵,如果存n在阶矩阵B使得AB=BA=1
// 则矩阵A是可逆的,称B是A的逆矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
scanf("%d", &matrix[row][column]);
// 将小写字母转换为大写字母
for (i = 0; text[i] != '\0'; i++)
if (islower(text[i]))
text[i] |= 0x20;
// OText存放将字母转换为相应数,如A~1,Z~26
for (i = 0; i < MAXN; i++)
OText[i] = 0;
for (i = 0; text[i] != '\0'; i++)
OText[i] = text[i] - 'A' + 1;
// 加密
ShellPassword(OText, strlen(text), matrix, Password);
// 将加密后的内容打印出来
printf("加密后的内容为:\n");
for (i = 0; i < strlen(text); i++)
printf("%d ", Password[i]);
putchar('\n');
break;
case '2':
break;
case '0':
return 0;
default:
break;
}
getchar();
} return 0;
} 译码算法我会在明天上传上来,你的加密密钥是一个三阶的数组,密文C是:1729 2514 811 1659 2472 858 1739 2514 849 1902 2736 905 1659 2472 858
3. C语言对称及可逆加密算法,急!!!
#include<stdio.h>
#include<string.h>
voidEncode(chars[],charkey[]){
inti,j,k,t,ch;
chartmp[9];
intlen=strlen(key);
for(i=0,j=0;s[i];++i){
t=key[j];
for(k=0;k<8;++k){
tmp[k]=(s[i]&1)^(t&1);
s[i]>>=1;
t>>=1;
}
ch=0;
for(k=7;k>=0;--k)
ch=2*ch+tmp[k];
s[i]=ch;
j=(j+1)%len;
}
}
intmain(){
chars[]="AbcdXYZ2014";
charkey[]="GodKnow";
printf("明文:%s ",s);
Encode(s,key);
printf("密文: %s ",s);
Encode(s,key);
printf("明文:%s ",s);
return0;
}