加解密

2023-11-17

目录

一,加密基础知识

1,加密函数、密钥、反函数

2,加密、解密

3,对称加密

4,非对称加密、公钥私钥

二,非对称加密

1,大素数分解问题类

(1)RSA

(2)Rabin

(3)Pollard's rho 素数分解算法

2,离散对数问题类

3,椭圆曲线类

4,广义离散对数问题的求解

三,对称密钥交换

1,DH算法(Diffie–Hellman)

(1)算法原理

(2)破解方法——中间人攻击

2,DHE、EDH

3,ECDHE

4,用RSA做对称密钥交换

5,完全正向保密(PFS,perfect forward secrecy)

四,OJ实战

力扣 91. 解码方法(组合计数)

力扣 535. TinyURL 的加密与解密

CSU 1059 Password


一,加密基础知识

1,加密函数、密钥、反函数

假设加密函数是f(x)=(ax+b)%255,其中x的范围是0-255,求出来的f(x)的范围自然也是0-255,算法是公开的,a,b就是密钥。
加密函数的反函数是g(x)=(x-b)*a^{-1}\%255
f(x)拥有反函数\Leftrightarrowa和255互质。
例如a=2, b=3,函数f(x)=(2x+3)%255的反函数是g(x)=(x-3)*128%255

2,加密、解密

发送者把信息表示成字符串,每个字符的ASCII码是0-255,通过函数f(x)把每个字符转化成另外一个字符,然后把得到的字符串发送出去,同时还需要想办法把密钥发出去而不被拦截。
例如‘0’是48, f(48)=99,也就是‘c’
接受者根据密钥得到具体的解密函数,即可破解信息。

3,对称加密

这种加密和解密用同一份密钥的加密算法,叫对称加密。
对称加密的最大弊端就是,一旦密钥被拦截,加密算法就完全失效。
常见对称加密、解密、破解 常见对称加密、解密、破解_nameofcsdn的博客-CSDN博客_对称解密

4,非对称加密、公钥私钥

如果可以构造一个函数f和反函数g,使得通过f推导g是几乎无法实现的,那么我们就可以公开f,保留g。
信息发送方式:接收方公开f,加密方用f加密并发送,接收方用g解密。因为不需要传输g,所以安全性大大的提高。

二,非对称加密

非对称加密体系都是建立在数学的基础之上的,目前一般分为三类:大素数分解问题类、离散对数问题类、椭圆曲线类

1,大素数分解问题类

(1)RSA

接收方A取 2 个大素数p,q, 令n=pq,当p和q足够大时,无法对n进行因式分解。(换句话说,以目前人类的数学能力和计算机能力找2个大素数是很简单的,但是分解素因子是很难的)
那么,接收方知道 \varphi({n})的值,但是其他人无法算出来。
取e,d 使 \mathrm{ed} \equiv 1(mod \varphi({n})),将e, n 公开, 这就是公钥,d保留,这就是私钥。
发送方B将密文m变成 \mathrm{m}^{\mathrm{e}} \equiv \mathrm{c}(\mathrm{mod}\ n) 发送给A,
A计算 \mathrm{c}^{\mathrm{d}} \equiv \mathrm{m}(\mathrm{mod}\ \mathrm{n})得到原文m
RSA是应用非常广泛的非对称加密算法,所有的windows和ATM机用的都是RSA算法,RSA的一个比较知名的应用是SSL

(2)Rabin

另外一种类似的非对称加密是Rabin
A取 2 个大素数 p,q, 令n=pq, 将 n 公开, 
B将密文 m 变成 \mathrm{m}^{2} \equiv \mathrm{c}(\mathrm{mod} \ n) 发送给 A, A求解 \mathrm{x}^{2} \equiv \mathrm{c}(\bmod \mathrm{p}) 和 \mathrm{x}^{2} \equiv \mathrm{c}(\mathrm{mod}\, q), 再求m

(3)Pollard's rho 素数分解算法

这个是因数分解的算法,时间复杂度为O(n^\frac{1}{4}logn)

Pollard‘s rho大数分解算法_nameofcsdn的博客-CSDN博客

2,离散对数问题类

在有限域F_p中取1个数a,再取b=a^x,那么根据b和a求x就是一个很困难的问题,x就是离散对数。

为了让破解最难,a一般取原根

3,椭圆曲线类

利用椭圆曲线上的加法运算,设计出不可求反的函数。

椭圆曲线加密 椭圆曲线加密_nameofcsdn的博客-CSDN博客

4,广义离散对数问题的求解

离散对数求解、BSGS算法 离散对数求解、BSGS算法_nameofcsdn的博客-CSDN博客

三,对称密钥交换

对称加密需要交换密钥,目标是通讯双方知道同一个密钥,其他任何用户都不知道。

这就涉及到密钥如何传递的问题,就像传统加密,需要用一个密码本(实体本子),已最高安全级别传递,而后根据密码本上的密钥加密。

1,DH算法(Diffie–Hellman)

(1)算法原理

首先Alice与Bob共享一个素数 p 以及该素数 p 的原根 g,

而后Alice产生一个私有的随机数 A,计算 g^A=Ya (mod p),将结果 Ya 通过公网发送给Bob

同样的,Bob保留随机数B,发送Yb给Alice

所以,双方共享的信息是p,g,Ya,Yb四个数,这都是可以被直接拦截的,双方私有的分别是A和B,这是安全的。

最后,Alice计算Yb^A,Bob计算Ya^B,这2个数是相同的,而且是安全的。

(2)破解方法——中间人攻击

如果攻击者能截断通讯,那么他就能分别和Alice、Bob加密通讯,DH算法是无法识别对方身份的,需要别的认证算法才能完成。

所以,密码学里面经常提到的算法有三类:加密、密钥交换、认证

2,DHE、EDH

DHE应该是Diffie–Hellman key exchange,DHE就是DH

EDH应该是Ephemeral Diffie–Hellman,即短暂DH

A cryptographic key is called ephemeral if it is generated for each execution of a key establishment process. 

3,ECDHE

DHE是建立在狭义离散对数问题的基础之上的,如果换成椭圆曲线,那就是ECDHE

4,用RSA做对称密钥交换

A想和B进行密钥交换,获得一个新的密钥,于是A就通过B的公钥加密了一个密钥K,然后将生成的密文发给B。B接到了这个密文之后使用自己的私钥解密获得密钥K。

用RSA做对称密钥交换,同样可以中间人攻击。

一般的,如果用RSA做对称密钥交换,认证算法也会选择RSA

5,完全正向保密(PFS,perfect forward secrecy)

完全正向保密指的是一个密钥被破解,并不影响其他密钥的安全性。设计旨在长期使用密钥不能确保起安全性的情况下而不影响过去会话的保密性。

DHE和ECDHE有PFS特性,而RSA没有PFS特性,所以一般选择ECDHE>DHE>RSA

四,OJ实战

力扣 91. 解码方法(组合计数)

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :

'A' -> 1
'B' -> 2
...
'Z' -> 26
要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"111" 可以将 "1" 中的每个 "1" 映射为 "A" ,从而得到 "AAA" ,或者可以将 "11" 和 "1"(分别为 "K" 和 "A" )映射为 "KA" 。注意,"06" 不能映射为 "F" ,因为 "6" 和 "06" 不同。

给你一个只含数字的 非空 字符串 num ,请计算并返回 解码 方法的 总数 。

题目数据保证答案肯定是一个 32 位 的整数。

示例 1:

输入:s = "12"
输出:2
解释:它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:

输入:s = "226"
输出:3
解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
示例 3:

输入:s = "0"
输出:0
解释:没有字符映射到以 0 开头的数字。含有 0 的有效映射是 'J' -> "10" 和 'T'-> "20" 。由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。
示例 4:

输入:s = "06"
输出:0
解释:"06" 不能映射到 "F" ,因为字符串开头的 0 无法指向一个有效的字符。 
 

提示:

1 <= s.length <= 100
s 只包含数字,并且可能包含前导零。

我的分析:

这题的输入是任何纯数字的字符串都有可能,要判断是否合法就只需要看字符0的前面是不是1或者2

我的思路是直接根据0进行截断,每一段中进行分析,最后化成斐波那契数列。

int F[] = { 1 ,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,
46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,
24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903 };

class Solution {
public:
    int numDecodingsNoZero(string s) {
        int ans = 1, start = -1;
        for (int i = 0; i < s.length(); i++) {
            if (s[i] <= '2')continue;
            if(s[i] > '6' && start<i-1 && s[i-1]=='2')ans *= F[i - start-1], start = i;
            else ans *= F[i - start], start = i;
        }
        return ans*F[s.length()-1-start];
    }
    int numDecodings(string s) {
        for (int i = 0; i < s.length(); i++)if (s[i] == '0') {
            if (i == 0 || s[i - 1] > '2')return 0;
            string s1 = s.substr(0, i - 1), s2 = s.substr(i + 1, s.length() - i - 1);
            return numDecodingsNoZero(s1) * numDecodings(s2);
        }
        return numDecodingsNoZero(s);
    }
};

力扣 535. TinyURL 的加密与解密

TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL http://tinyurl.com/4e9iAk.

要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的URL。

惊人的加解密:

class Solution {
public:
    string encode(string s) {
        return s;
    }
    string decode(string s) {
        return s;
    }
};

诡异的加解密:

class Solution {
public:
    unordered_map<string, string>m;
    string s;
    
    string encode(string longUrl) {
        string ans=s;
        s = m[s] = longUrl;
        return ans;
    }
    string decode(string shortUrl) {
        return m[shortUrl];
    }
};

CSU 1059 Password

题目:

Description

发送电报保密是一项重要的工作,尤其是在军事领域,所以,为了安全的需要常常会对发送的内容进行加密,然后,接收方再进行解密,这样就达到了安全的需要。

本次我们完成一个简单的对字母加密程序。首先对字母进行编号,小写字母a至z编号为1至26,大写字母A至Z分别编号27至52,这样每个字母都有唯一的一个序号,在发送内容时,我们以函数F(X)=X*X+X+1对发送字母的序号进行计算,就会获取个新的序号,对该序号再进行对52取余,该序号即为加密后的要发送字母的序号,这样就能达到加密的作用。

Input

有多组测试数据,每组测试数据占一行,包括需要加密的消息,消息的长度不超过100个字符,这些字符只包含大小写字母。

Output

输出加密后的字符,每个测试样例占一行。

Sample Input

abA

Sample Output

cgC
 

代码:

#include<iostream>
#include<string.h>
using namespace std;
 
int main()
{
	char c[101], ca = 'A';
	while (cin >> c)
	{
		for (int i = 0; i < strlen(c); i++)
		{
			int d = c[i] - ca + 1;
			if (d > 26)d -= 32;
			else d += 26;
			d = ((d*d) + d + 1) % 52;
			if (d > 26)d -= 26;
			else d += 32;
			cout << char(ca + d - 1);
		}
		cout << endl;
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加解密 的相关文章

  • Ubuntu16.04如何调整屏幕分辨率至1920*1080

    1 引言 ubuntu16 04桌面版安装好后 发现屏幕分辨率调整选项里没有1920x1080这一选项 经过一番研究 可通过如下方式进行屏幕分辨率设置 以下操作均在ubuntu16 04桌面版操作 不要用远程连接操作 否则xrandr命令会
  • 华为OD机试(2021-04)题目一

    题目 一个 0 1000 的整数 拆解为一个 本身 或多个连续自然数的和 按照自然数的个数从少到多输出各个方案 input solution 方案内的自然数按照从小到大排列 public static void main String ar

随机推荐

  • 循环“停止”的三种特殊语句

    对于一个初学者来说 循环的控制无疑是一个难点和重点 但是在有些时候循环是不需要执行完的 或者这个循环的这一次是不用执行的 那么我们如何来实现这些功能呢 下面通过一个例子来加以说明 1 break语句跳出就近的一层循环 while i lt
  • 渗透相关问题(3)

    1 sql注入绕过的方法 注释符号绕过 大小写绕过 内联注释绕过 双写关键字绕过 特殊编码绕过 宽字节绕过 2 WAF常用的类型 硬件设备类型 软件产品类型 基于云的WAF 3 sql注入漏洞防御方法 代码层面 对输入进行严格的转义和过滤
  • JavaSE学习总结:异常处理

    Java异常处理 1 什么是异常 2 异常的处理机制的原理 过程 3 异常的体系结构 1 java lang Throwable 2 java lang Error 3 java lang Exception 4 异常的处理机制 1 抛 2
  • 以太坊区块链技术开发岗位面试题集锦,附答案

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 超过100道以太坊区块链开发技术岗位的面试题 附参考答案 面试题目涵盖 以太坊的基本概念 Geth客户端使用 智能合约基本概念 Solidity开发语言 去中心化 应用DA
  • 目标检测中的IOU和CIOU原理讲解以及应用(附测试代码))

    上期讲解了目标检测中的三种数据增强的方法 这期我们讲讲目标检测中用来评估对象检测算法的IOU和CIOU的原理应用以及代码实现 交并比IOU 交并比IOU Interp over union 在目标检测任务中 我们用框框来定位对象 如下图定位
  • Linux文件/proc/net/tcp

    导语 proc net tcp文件提供了tcp的连接信息 是由net ipv4 tcp ipv4 c中的tcp4 seq show 实现信息打印的 本文内容来源于linux官方文档proc net tcp txt 官方文档解释 proc n
  • 输入框不能为空格

    需求 在表单中 输入的内容要去除两端空格 技术栈 vue elementui 最简单的做法 element ui 中自带的表单必填项校验输入空格时 依然能逃过验证 required true还是可以通过 需要再 在v model 加上 tr
  • 3.Jmeter学习_线程组(Thread Group)

    xxxx
  • VS2022安装qt插件

    1 安装Qt软件 Qt下载网址 5 14之后的需要手动编译 官方不提供exe文件 2 配置环境变量 3 安装插件 vs2022 qt vsaddin插件已经更新 可以下载安装 链接 https download qt io developm
  • 【正点原子STM32连载】第十七章 通用定时器中断实验 摘自【正点原子】APM32F407最小系统板使用指南

    1 实验平台 正点原子stm32f103战舰开发板V4 2 平台购买地址 https detail tmall com item htm id 609294757420 3 全套实验源码 手册 视频下载地址 http www openedv
  • python爬虫学习笔记-jQuery

    jQuery介绍 jQuery是什么 jQuery是一个快速 简洁的JavaScript框架 jQuery设计的宗旨是 write Less Do More 即倡导写更少的代码 做更多的事情 它封装JavaScript常用的功能代码 提供一
  • C# 集合

    数组是一种指定长度和数据类型的对象 在实际应用中有局限性 集合正是为这种局限性而生的 集合的长度能根据需要更改 也允许存放任何数据类型的值 集合简介 集合和数组比较类似 都用于存放一组值 但集合中提供了特定的方法直接操作集合中的数据 并提供
  • Java接口详解

    接口 接口的概念 在现实生活中 接口的例子比比皆是 比如 笔记本上的USB口 电源插座等 电脑的USB口上 可以插 U盘 鼠标 键盘等所有符合USB协议的设备 电源插座插孔上 可以插 电脑 电视机 电饭煲等所有符合规范的设备 通过上述例子可
  • OneNote复制为默认字体大小(只复制文字,不复制原有字体格式)

    当我们从word中复制一段文字到onenote中 onenote会自动带上原有字体的格式 非常不方便 下面是只复制文字的方法 1 随便按 ctrl c 复制一段文字 2 到onenote里按下 ctrl v 粘贴 选择右下角的框 3 在弹出
  • 使用XMind解决问题?只需4个简单步骤!

    我们每天都在解决问题并做出决定 从我应该穿什么到学校的小问题到如何找工作或上大学等等的问题 我们面临的问题可能或大或小 或简单或复杂 无论它是什么 我们都必须解决它 解决问题和决策是商业和生活的重要技能 我们生活中非常重要的一部分是找到解决
  • UE4_积分相同排名显示问题

    找了一下ue4 rank 函数相关 没找到合适的 自己简单写了个 解决积分相同时名次要一样 之后顺位排序 中国式排名 蓝图实现 c 原理一样 1 2 3 4 5
  • 编译 QT4.6.3 出现 derefIfNotNull 未定义 解决

    使用高版本的编译工具编译QT4 6 3 出现错误 derefIfNotNull 未定义 找到 RefPtr h文件 在WFT 的 public 里面增加 两个函数的定义 void derefIfNotNull T ptr if LIKELY
  • CS从头配置电脑清单(软件篇)

    CS从头配置电脑清单 软件篇 假设你电脑丢了 重新搞了一台 怎么从头配置 迅速可以进行高效产出 假设你是Linux ubuntu系统 安装zoom 安装slack 进行其他设备的信息发送 自己给自己发 项目交流 安装截图软件 推荐flame
  • 【Java】QueryWrapper方法解释

    继承自 AbstractWrapper 自身的内部属性 entity 也用于生成 where 条件 及 LambdaQueryWrapper 可以通过 new QueryWrapper lambda 方法获取 queryWrapper lt
  • 加解密

    目录 一 加密基础知识 1 加密函数 密钥 反函数 2 加密 解密 3 对称加密 4 非对称加密 公钥私钥 二 非对称加密 1 大素数分解问题类 1 RSA 2 Rabin 3 Pollard s rho 素数分解算法 2 离散对数问题类