c语言实现维吉尼亚加密

导读:本篇文章讲解 c语言实现维吉尼亚加密,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1.声明
此程序是我自己手敲的,可能会有很多未知的bug我不清楚,我也是小白,刚学完线性表想分享一下,希望大佬看了代码能指出优化。
在这里插入图片描述
这是我用双向链表写出来的,话不多说直接上代码!
在这里插入图片描述


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
typedef struct node
{
	char data;
	int num;
	struct node* prior;//前驱结点
	struct node* next;//后继结点
}node,*Node;

static int v[20];
//初始化双向循环链表
node* Creat(node *head)
{
	int i;
	node* p,*s=NULL;
	srand((unsigned)time(NULL));
	head = (node*)malloc(sizeof(node));
	head->prior = NULL;
	head->next = NULL;
	head->num = rand() % 10+1;
	head->data = 65;
	p = head;
	for (i = 66; i <=90; i++)
	{
		s = (node*)malloc(sizeof(node));
		s->data = i;
		s->num = rand() % 10 + 1;
		s->next = NULL;
		s->prior = NULL;
		p->next = s;
		s->prior = p;
		p = p->next;
	}
	s->next = head;
	head->prior = s;
	return head;
}

//打印循环双向链表函数
void print(node* head)
{
	node* p=head;
	while (p->next != head)
	{
		printf("%c ", p->data);
		p = p->next;
	}
	printf("%c ", p->data);
	
}

//打印随机密钥
void secret(node *head)
{
	node* p = head;
	while (p->next != head)
	{
		printf("%d ", p->num);
		p = p->next;
	}
	printf("%d ", p->num);
	
}

//打印生成密文
void List(node* head,int m,char *c)
{
	node* p = head;
	int i,n,s=0;
	printf("改造的密码为:");	
	for (i=0;i<m;i++)
	{
		while (p->data != c[i])
		{
			p = p->next;
		}
		s = p->num;  //这里也要注意,如果直接用p->num去比较你会发现p->num无时无刻会改变
		v[i] = s;
		for (n = 0; n < s; n++)//这里要注意不要贪图一个变量
		{
			p = p->next;
		}
		c[i] = p->data;
		
	}

	for (i = 0; i < m; i++)
	{
		printf("%c ", c[i]);
	}
}

//破解密码
void List_2(node* head, int m, char* c)
{
	node* p = head;
	int i, n, s = 0;
	printf("原来的明文为:");
	for (i = 0; i < m; i++)
	{
		while (p->data != c[i])
		{
			p = p->next;
		}
		s = v[i];  //这里也要注意,如果直接用p->num去比较你会发现p->num无时无刻会改变
		for (n = 0; n < s; n++)//这里要注意不要贪图一个变量
		{
			p = p->prior;
		}
		c[i] = p->data;
	}

	for (i = 0; i < m; i++)
	{
		printf("%c ", c[i]);
	}
}

int main()
{
	node* head=NULL,*s=NULL;
	int m,i,q;
	char a[26],c,d[26];
	s=Creat(head);
	printf("初始化成功!:");
	print(s);
	printf("\n\n");
	printf("初始化成功!:");
	secret(s);
	printf("\n\n");
	printf("请输入有几个密码:");
	scanf_s("%d", &m);
	printf("请输入%d个密文:",m);
	c = getchar();//吃一个换行,不能省
	for (i = 0; i < m; i++)
	{
		scanf_s("%c", &a[i],sizeof(a[26]));
		
	}
	printf("\n");
	List(s,m,a);
	printf("\n\n");
	printf("%d个密文的密钥为:", m);
	for (i = 0; i < m; i++)
	{
		printf("%d ", v[i]);
	}
	printf("\n");
	printf("返回最开始密码(破解原先打入的密码):");
	printf("\n\n请输入1表示需要0表示不需要:");
	scanf_s("%d", &q);
	c = getchar();
	if (q != 0)
	{
		printf("请输入密文:");
		for (i = 0; i < m; i++)
		{
			scanf_s("%c", &d[i], sizeof(d[26]));
		}
		printf("\n");
		List_2(s, m, d);
	}
	printf("\n\n");
	return 0;
}



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/66884.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!