include iostream;
using namespace std;
#define N 6 //定义N的大小
#define M 5 //定义M的大小,N=M
void main()
{
char P[N]={0};
char K[M]={0};
char C[M]={0};//因为要用Ki加密,所以C[]只能有M个大
int i,j;//定义循环变量
cout "请输入明文数组,你可以输入"N"个字符长度"endl;
for (i=0;iN;i++)//为P[N]赋值
{
cout " P"i"=";
cin P[i];
}
cout "请输入密钥数组,你可以输入"M"个字符长度"endl;
for (j=0;jM;j++)//为K[M]赋值
{
cout "K"j"=";
cin K[j];
}
for (i=0;iM;i++)//加密!因为K[j]个数有限,只能用M做为循环次数
{
j=i%(M+1);
C[i]=P[i]+K[j];
cout P[i]endl;
cout K[j]endl;
cout C[i]endl;
if (0C[i])//7F=127
{
//C[cnt]=P[cnt]+K[i%(j+1)];//Ci=Pi+Kj(j=i mod(m+1)) (当Ci=7FH)
C[i]=C[i]+128;
cout C[i]endl;
}
else
{
//C[cnt]=P[cnt]+K[i%(j+1)]-128;//Ci=Pi+Kj-80H(j=i mod(m+1)) (当Ci7FH)
C[i]=C[i];
cout C[i]endl;
}
}
coutendlendl"输出加密后的密文C[i]如下:"endl;
for (i=0;i=40;i++)
cout "#";
cout endl;
for (i=0;iM;i++)//输出加密后的C[i]
{
cout C[i]endl;
}
for (i=0;i=40;i++)
cout "#";
cout endl;
for (i=0;iM;i++)//解密!因为K[j]个数有限,只能用M做为循环次数
{
j=i%(M+1);
if (C[i]=K[j])
{
P[i]=C[i]-K[j]+128;//Pi=Ci-Kj (j=i mod(m+1)) (当Ci=Kj)
}
else
{
P[i]=C[i]-K[j];//80H=128,Pi=Ci-Kj+80H(j=i mod(m+1))(当CiKj)
}
}
coutendlendl"输出解密后的明文P[i]如下:"endl;
for (i=0;i=36;i++)
cout "#";
cout endl;
for (i=0;iN;i++)//输出解密后的P[i]
{
cout P[i]endl;
}
for (i=0;i=36;i++)
cout "#";
cout endlendl;
摘来的一段代码,思路可做参考。
/* RSA */
#includestdio.h
int candp(int a, int b, int c) //数据处理函数,实现幂的取余运算
{
int r = 1;
b= b + 1;
while(b != 1) {
r = r * a;
r = r % c;
b--;
}
printf("%d\n", r);
return r;
}
int fun(int x, int y) //公钥e与t的互素判断
{
int t;
while(y) {
t = x;
x = y;
y = t % y;
}
if(x == 1)
return 0; //x与y互素时返回0
else
return 1;//x与y不互素时返回1
}
int main()
{
int p, q, e, d, m, n, t, c, r;
printf("请输入两个素数p,q:");
scanf("%d%d", p, q);
n= p * q;
printf("计算得n为%3d\n", n);
t= (p - 1) * (q - 1); //求n的欧拉数
printf("计算得t为%3d\n", t);
printf("请输入公钥e:");
scanf("%d", e);
if(e 1 || e t || fun(e, t)) {
printf("e不合要求,请重新输入:");//e1或et或e与t不互素时,重新输入
scanf("%d", e);
}
d= 1;
while(((e * d) % t) != 1)
d++; //由公钥e求出私钥d
printf("经计算d为%d\n", d);
printf("加密请输入1\n");//加密或解密选择
printf("解密请输入2\n");
scanf("%d", r);
switch(r) {
case 1:
printf("请输入明文m:");//输入要加密的明文数字
scanf("%d", m);
c = candp(m, e, n);
printf("密文为%d\n", c);
break;
case 2:
printf("请输入密文c:");//输入要解密的密文数字
scanf("%d", c);
m = candp(c, d, n);
printf("明文为%d\n", m);
break;
default:
;
}
return 0;
}
PKI(Public Key Infrastructure 的缩写)是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系。 原有的单密钥加密技术采用特定加密密钥加密数据,而解密时用于解密的密钥与加密密钥相同,这称之为对称型加密算法。采用此加密技术的理论基础的加密方法如果用于网络传输数据加密,则不可避免地出现安全漏洞。因为在发送加密数据的同时,也需要将密钥通过网络传输通知接收者,第三方在截获加密数据的同时,只需再截取相应密钥即可将数据解密使用或进行非法篡改。 区别于原有的单密钥加密技术,PKI采用非对称的加密算法,即由原文加密成密文的密钥不同于由密文解密为原文的密钥,以避免第三方获取密钥后将密文解密。 CA: CA是证书的签发机构,它是PKI的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。 CA 也拥有一个证书(内含公钥)和私钥。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。 如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。 如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。 证书:证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。 证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。目前,证书的格式和验证方法普遍遵循X.509 国际标准。 加密: 我们将文字转换成不能直接阅读的形式(即密文)的过程称为加密。 解密: 我们将密文转换成能够直接阅读的文字(即明文)的过程称为解密。 如何在电子文档上实现签名的目的呢?我们可以使用数字签名。RSA公钥体制可实现对数字信息的数字签名,方法如下: 信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在传递过程中未被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。 在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数) 生成的。对这些HASH函数的特殊要求是: 1.接受的输入报文数据没有长度限制; 2.对任何输入报文数据生成固定长度的摘要(数字指纹)输出; 3.从报文能方便地算出摘要; 4.难以对指定的摘要生成一个报文,而由该报文可以算出该指定的摘要; 5.难以生成两个不同的报文具有相同的摘要。 验证: 收方在收到信息后用如下的步骤验证您的签名: 1.使用自己的私钥将信息转为明文; 2.使用发信方的公钥从数字签名部分得到原摘要; 3.收方对您所发送的源信息进行hash运算,也产生一个摘要; 4.收方比较两个摘要,如果两者相同,则可以证明信息签名者的身份。 如果两摘要内容不符,会说明什么原因呢? 可能对摘要进行签名所用的私钥不是签名者的私钥,这就表明信息的签名者不可信;也可能收到的信息根本就不是签名者发送的信息,信息在传输过程中已经遭到破坏或篡改。 数字证书: 数字证书为实现双方安全通信提供了电子认证。在因特网、公司内部网或外部网中,使用数字证书实现身份识别和电子信息加密。数字证书中含有密钥对(公钥和私钥)所有者的识别信息,通过验证识别信息的真伪实现对证书持有者身份的认证。 使用数字证书能做什么? 数字证书在用户公钥后附加了用户信息及CA的签名。公钥是密钥对的一部分,另一部分是私钥。公钥公之于众,谁都可以使用。私钥只有自己知道。由公钥加密的信息只能由与之相对应的私钥解密。为确保只有某个人才能阅读自己的信件,发送者要用收件人的公钥加密信件;收件人便可用自己的私钥解密信件。同样,为证实发件人的身份,发送者要用自己的私钥对
用超级兔子比较好点
超级兔子他可以帮你加密文件也可以帮你隐藏你的加密文件
这样比较保险点`!
调了半天,楼主真是太粗心了!middle1[]应该这样声明:
char middle1[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
最后输出start的时候要注意控制长度,改个for循环就好了!
#includestdio.h
#includestring.h
int main(void)
{
int i,j,length,n;
char temp;
char middle2[27];
char start[201],finish[201];
char middle1[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
gets(middle2);
gets(finish);
scanf("%d",n);
length=strlen(finish);
for(i=0;i25;i++)
{
for(j=i+1;j26;j++)
{
if(middle2[i]middle2[j])
{
temp=middle2[i];
middle2[i]=middle2[j];
middle2[j]=temp;
temp=middle1[i];
middle1[i]=middle1[j];
middle1[j]=temp;
}
}
}
for(i=1;i=n;i++)
{
for(j=0;jlength;j++)
{
if(finish[j]==' ')
{
start[j]=' ';
}
else
{
start[j]=middle1[finish[j]-'A'];
}
}
}
for( i = 0;i length;++i)
printf("%c",start[i]);
printf("\n");
return 0;
}
/*
ABCDEFGHIJKLMNOPQRSTUVWXYZ
*/