南京邮电大学算法分析与设计实验四(密码算法)

该博客详细介绍了RSA加密算法的实现过程,包括最大公约数的计算、欧几里得扩展算法以及公钥和私钥的生成。同时,展示了如何在C++中进行加密和解密操作。通过示例代码,读者可以理解RSA的工作原理及其在信息安全中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0 相关简介

密码算法是信息安全和加密技术的核心,用于保护数据的机密性、完整性和真实性。在数字化时代,随着网络攻击和数据泄露事件的增多,密码算法的重要性日益凸显。下面将介绍密码算法的分类、原理及应用。

0.1 密码算法的分类

  1. 对称加密算法

    • 在对称加密算法中,加密和解密使用相同的密钥。这种算法速度快,适用于大量数据的加密。
    • 常见的对称加密算法包括数据加密标准、高级加密标准等。
  2. 非对称加密算法

    • 非对称加密算法使用一对密钥:公钥用于加密,私钥用于解密。这种方式解决了密钥分发的问题,但处理速度较慢。
    • 常见的非对称加密算法有RSA、椭圆曲线加密算法等。
  3. 散列函数

    • 散列函数可以将任意大小的数据转换为固定大小的哈希值。它们通常用于验证数据的完整性。
    • 著名的散列函数有安全散列算法和消息摘要算法5。
  4. 密码学摘要算法

    • 与普通散列函数不同,密码学摘要算法设计用于抵抗碰撞攻击和预设防原像攻击。
    • 典型的例子包括安全散列算法和消息摘要算法5。

0.2 密码算法的原理

  1. 对称加密的工作原理

    • 通过使用密钥将明文数据转化为不可识别的密文,只有持有相同密钥的用户才能解密得到原始信息。
    • 对称加密算法通常更快速,适用于加密大量数据。
  2. 非对称加密的工作原理

    • 利用数学问题的复杂性(如大数分解),使得在没有私钥的情况下,从公钥推导出私钥或解密信息在计算上不可行。
    • 非对称加密算法可以在不安全的通信渠道上安全地交换密钥。
  3. 散列函数的工作原理

    • 通过特定的数学算法将任何输入转化为固定长度的输出,且几乎不可能找到两个不同的输入产生相同的输出。
    • 散列函数广泛应用于数字签名和数据完整性验证。
  4. 密码学摘要算法的工作原理

    • 与散列函数类似,但在设计上额外考虑了抗碰撞性和安全性,确保即使攻击者拥有大量计算资源也难以找到碰撞。
    • 这些算法常用于加强数据的安全性和完整性。

0.3 密码算法的应用

  1. 数据传输安全

    • 在互联网通信中,密码算法用于确保传输的数据不被第三方窃取或篡改。
    • 例如,SSL/TLS协议就是基于密码算法,为网络通信提供安全保障。
  2. 数据存储安全

    • 存储在数据库或磁盘中的重要数据通常被加密,以防止未经授权的访问。
    • 企业和个人用户都依赖于此方法来保护敏感信息。
  3. 用户认证

    • 密码算法在用户认证过程中发挥作用,例如在登录过程中验证用户的身份。
    • 多因素认证中的密码部分也依赖于安全的加密算法。
  4. 数字签名和证书

    • 数字签名使用非对称加密技术来验证信息的发送者和确保信息的完整性。
    • 数字证书则广泛用于建立网络中各方的信任关系。

总之,密码算法是现代信息安全的基石,涵盖了对称加密、非对称加密、散列函数和密码学摘要算法等多种类型。每种类型的算法都有其独特的工作原理和应用场景。了解这些基本概念对于任何涉及信息安全和数据保护的专业人士至关重要。随着技术的不断进步,密码算法也在不断发展,以应对日益复杂的安全威胁。

1、实验代码

#include <iostream>
using namespace std;

int GCD(int x, int y);
int ext_euclid(int a, int b, int f, int e);
int GetPrivateKey(int f, int e);


void GetAllSecretKey(int p, int q) {
	bool ok = true;
	int f = (p-1)*(q-1);
	int i = f - 1;
	int num = 0;
	while (i) {
		if (GCD(i, f) == 1) {
			num++;
			cout << "公钥e = " << i << endl << "私钥d = " << GetPrivateKey(f, i) << endl << endl;
		}
		i--;
	}
}

int GetPublicKey() {
	return 0;
}

// 计算私钥
int GetPrivateKey(int f, int e) {
	int d = ext_euclid(0, 1, f, e);
	while (d <= 0) 
		d += f;
	return d;
}

void Menu() {
	cout << "请问您需要那种服务?" << endl;
	cout << "1: 计算秘钥  2: 加密  3: 解密  4: 退出系统" << endl;
	cout << "请选择: ";
}

// 加密 , 返回密文
int Encryption(int e, int n, int M) {
	int C;
	C = 1;
	for (int i = 1; i <= e; i++)
	{
		C = C * M % n;
	}
	
	return C;
}

// 解密,返回明文
int Decryption(int d, int n, int C) {
	int M = 1;
	for (int i = 1; i <= d; i++)
	{
		M = M * C % n;
	}
	return M;
}

// 最大公约数
int GCD(int x, int y)
{
	int z = y;
	while (x % y != 0)
	{
		z = x % y;
		x = y;
		y = z;
	}
	return z;
}

// 获取秘钥 d
int ext_euclid(int a, int b, int f, int e)
{
	int m, n, t;
	if (e == 1) 
		return b;
	m = f / e; n = f % e;
	t = a - b * m;
	ext_euclid(b, t, e, n);
}

// 在main() 函数中实现 RSA 加 解密过程 的主要流程:
void main()
{
	//输入质数p和q
	int p, q;
	int mode = 0;


	int C = 0;

	// φ(n)=(p-1)*(q-1)
	int f = 0;

	int n = 0;

	//公钥
	int e = 0;
	// 私钥
	int d = 0;

	int M = 0;

	

	while (mode != 4) {
		Menu();
		cin >> mode;
		switch (mode)
		{
		case 1:
			cout << "输入一个质数p(如101):";
			cin >> p;
			cout << "输入一个质数q(如113):";
			cin >> q;
			n = p * q;
			GetAllSecretKey(p, q);
			cout << endl << endl;
			break;
		case 2:

			cout << "请输入加密的公钥(如3533): e = ";
			cin >> e;
			cout << "请输入需要传输的明文内容进行加密(如9726):";
			cin >> M;
			C = Encryption(e, n, M);
			cout << "明文M =" << M << "经加密后得到密文C = " << C << endl;
			cout << endl << endl;
			C = 0;
			M = 0;
			break;
		case 3:
			cout << "请输入加密的私钥(如6597): d = ";
			cin >> d;
			cout << "请输入需要解密的密文内容进行解密(如5761):";
			cin >> C;
			M = Decryption(d, n, C);
			cout << "密文C =" << C << "经解密后得到明文M = " << M << endl;
			cout << endl << endl;
			C = 0;
			M = 0;
			break;

		default:
			return;
		}
	}
}

2、运行效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦是远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值