#include<iostream.h>//该文件包含C++的输入输出操作;
#include<string.h> //该文件包含字符串函数;
#include<ctype.h>//该文件包含字符函数;
#include<math.h>//该文件包含数学函数;
#include<stdlib.h>//随机选的函数文件
#include<stdio.h>//
#include<time.h>
#include <malloc.h>
#include<fstream.h>//输出数据到文件中
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef char ElemType;
typedef struct Node /*结点类型定义*/
{
ElemType data;
struct Node * next;
}Node, *LinkList; /* LinkList为结构指针类型*/
void init_linklist(LinkList *l)/*对单链表进行初始化*/
{
*l=(LinkList)malloc(sizeof(Node));
(*l)->next=NULL;
}
void CreateFromTail(LinkList L,int &d)//用一个单链表装输入的明文
{
Node *r, *s;
char c;
int flag =1,t=0; /*设置一个标志,初值为1,当输入"$"时,flag为0,建表结束*/
r=L; /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
while(flag) /*循环输入表中元素值,将建立新结点s插入表尾*/
{
c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
t++;
}
else
{
flag=0;
r->next=NULL; /*将最后一个结点的next链域置为空,表示链表的结束*/
}
}
d=t;
}
void main()
{
void miwen(int d[],int n);
int i,*a,*er,ru[7];//a数组放ASCLL值,er数组放二进制码,ru数组放除以2的余数;
LinkList l;
Node *p;
init_linklist(&l);
printf("请输入一串要加密的字符,不分大小写,以“$”号结束:\n");
CreateFromTail(l,i);//输入明文,用一个链表装要加密的字符
a=(int*)malloc(sizeof(int)*i);
er=(int*)malloc(sizeof(int)*(7*i));
p = l->next;
int q=0;
while(p!=NULL)//以下是把字符与数字转换成ASCLL值;
{
if(isdigit(p->data))//判断是否为数字
{
a[q]=p->data;
q++;
continue;
}
if(isupper(p->data))//判断是否为大写字母
p->data=tolower(p->data);
if(islower(p->data))//判断是否为小写字母
a[q]=p->data;
a[q]=p->data;
q++;
p=p->next;
}
int r=0;
for(int t=0;t<i;t++) //把对应的ASCLL值转换成二进制码
{
int z=0;
while(a[t]!=0)
{
ru[z]=a[t]%2;//除以2取余数
a[t]=a[t]/2;//除以2的取整数
z++;
}
while(z!=7)//不足7位的二进制码补上0
{
ru[z]=0;
z++;
}
for(int e=6;e>=0;e--)
{
er[r]=ru[e];
r++;
}
}
for(int k=0;k<7*i;k++) //输出二进制码
{
if(k%7==0)
cout<<endl;
cout<<er[k]<<' ';
}
cout<<endl;
miwen(er,r);//调用函数加密明文
}
void miwen(int d[],int m)//产生密文
{
int gongyao_y(int p,int q);
void erchifeiyu(int a,int*d);
int p=23,q=29,y;
cout<<"选两个任意大的素数,作密钥,现在选p="<<p<<" "<<"q="<<q<<"作密钥,"<<endl<<endl;
cout<<"公钥y产生中…………"<<endl;
y=gongyao_y(p,q);//调用函数产生公钥y
cout<<"以(y,n)作公钥,y="<<y<<" n="<<p*q<<endl<<endl;
long int h,*c;
c=(long int*)malloc(sizeof(long int)*m);
srand(time(NULL));
cout<<"以下为加密后的密文:"<<endl;
cout<<"以下密文会同时输出到文本文件“filel密文”中:"<<endl;
ofstream filel;
for(int j=0;j<m;j++)
{
h=1+rand()%(p*q-1);
if(d[j]==1)
c[j]=(y*h*h)%(p*q);
else
c[j]=h*h%(p*q);
if(j%7==0&&j!=0)
{
cout<<endl;
}
ofstream filel("file1密文.txt",ios::app);
//把密文输出到文本文件“filel密文”中
if(j==0)
filel<<endl<<"密文如下:"<<endl;
if(j%7==0&&j!=0)
filel<<endl;
filel<<c[j]<<" ";
cout<<" "<<c[j];
}
cout<<endl;
}
void erchifeiyu(int a,int*d)//算出非二次剩余
{
int *b,n=(a-1)/2;
b=(int*)malloc(sizeof(int)*a);
int f=0,r=0,l,q=0;
for(int i=1;i<a;i++)
{
f=(i*i)%a;
if(f!=0)
{
b[r]=f;
r++;
}
}
for(int k=1;k<a;k++)
{
l=0;
for(int j=0;j<r;j++)
{
if(k==b[j])
{
l=1;
break;
}
}
if(l==0)
{
*(d+q)=k;
q++;
}
}
}
int gongyao_y(int p,int q)//产生公钥_y
{
int *p1,*q1,n1=(p-1)/2,n2=(q-1)/2;
p1=(int*)malloc(sizeof(int)*n1);
q1=(int*)malloc(sizeof(int)*n2);
erchifeiyu(p,&p1[0]);//调用函数算出p和q的二次剩余
erchifeiyu(q,&q1[0]);
int *y,k=0;
y=(int*)malloc(sizeof(int)*n1);
y[0]=0;
for(int i=0;i<n1;i++)
for(int j=0;j<n2;j++)
{
if(p1[i]==q1[j])
{
y[k]=p1[i];
k++;
break;
}
}
if(y[0]==0) cout<<"出错"<<endl;
srand(time(NULL));
return y[rand()%k];//从非二次剩余中任选一个做公钥
}
C语言概率公开密钥加密算法
4星 · 超过85%的资源 需积分: 31 167 浏览量
2011-06-30
13:44:21
上传
评论
收藏 84KB RAR 举报
幻影cc
- 粉丝: 24
- 资源: 75
最新资源
- 基于Vue和TypeScript的房地产管理系统前端设计源码
- 基于微信小程序的通用订票系统设计源码
- 基于ThinkPHP的轻量级PHP开发框架设计源码
- 基于CSS的响应式鲜花网站全屏效果设计源码
- 基于JavaScript的访客预约系统设计源码
- 基于Vue和ECharts的工作租房数据可视化系统设计源码
- 1040g0cg310ravpiu6ibg5pg00tsipsln3ju2d0g 2
- 基于Python的SAR图像去噪CNN-NLM设计源码
- redhat6升级到redhat7,过程redhat6.x-> redhat6.10->rehat7.9 主版本最高版本
- 基于Django的流程引擎设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈