密码学基本术语
基本术语
(1)明文(Plaintext/Message):指待加密的信息,用P或M表示。明文可以是文本文件、图形、数字化存储的语音流或数字化的视频图像的比特流等。
(2)密文(Cipertext):指明文经过加密处理后的形式,用C表示。
(3)加密(Encryption):指用某种方法伪装消息以隐藏它的内容的过程。
(4)加密算法(Encryption Algorithm):指将明文变换为密文的变换函数,通常用E表示。
(5)解密(Decryption):指把密文转换成明文的过程。
(6)解密算法(Decryption Algorithm):指将密文变换为明文的变换函数,通常用D表示。
(7)密钥(Key):变换函数所用的一个控制参数。加密和解密算法的操作通常是在一组密钥控制下进行的,分别称为加密密钥和解密密钥,通常用K表示。
(8)密码分析(Cryptanalysis):指截获密文者试图通过分析截获的密文从而推断出原来的明文或密钥的过程。
(9)被动攻击(Passive Attack):指对一个保密系统采取截获密文并对其进行分析和攻击。这种攻击对密文没有破坏作用。
(10)主动攻 ...
凯撒密码及其变种
凯撒密码
凯撒密码是把字母表中的每个字母用该字母后面第3个字母进行替代,如表3-2所示。为便于区分,我们用小写字母表示明文,大写字母表示密文。
明文:this is a book。
密文:WKLV LV D ERRN。
明文和密文空间是26个字母的循环,所以z后面的字母是a。如果为每个字母分配一个数值(a=0,b=l,…,z=25),则该算法能够表示如下:
C=EK(p)=(p+3)%26C=E_K(p) = (p+3) \% 26
C=EK(p)=(p+3)%26
变种
我们可以把每个字母用该字母后面第k个字母进行替代,即
C=EK(p)=(p+k)%26C=E_K(p) = (p+k) \% 26
C=EK(p)=(p+k)%26
便得到凯撒密码的变种加密方式了。
代码实现
123456789101112131415161718192021222324// 凯撒密码的加密// key为加密字符相对原字符的向后偏移量string encrypt(string message, int key) { // 加密后的字符串长度应该和原字符串相同 stri ...
基于intel avx256f指令优化线段组求交算法的实验
设[(Asx, Asy), (Aex, Aey)]表示线段A由顶点(Asx, Asy)和顶点(Aex, Aey)所组成。
设线段集B如下,
123456{ [(Barrsx[0], Barrsy[0]), (Barrsx[0], Barrsy[0])] [(Barrsx[1], Barrsy[1]), (Barrsx[1], Barrsy[1])] ... [(Barrsx[n-1], Barrsy[n-1]), (Barrsx[n-1], Barrsy[n-1])]}
现在需要线段A与线段集B进行求交得到如下信息:
交点数组
1[(Rarrx[0], Rarry[0]), (Rarrx[1], Rarry[1]),...,(Rarrx[n-1], Rarry1])]
其所在直线是否相交的bool数组 Rintersection[n]
线段是否真正相交的bool数组 Roverlap[n]
线段集的大小 size = n
12345678910111213141516171819202122232425262728293031323334 ...
基于装饰器模式实现n阶逆矩阵的求解
首先mn矩阵只是一个mn的数表,首先对于一个数表,需要有四个基本行为即设置某行某列的值,获取某行某列的值,获取行数列数,还可基于该这些行为为其实现一些便捷通用的函数。如打印输出该矩阵。故所有的矩阵可抽象成一个抽象的接口。
矩阵接口定义
接口定义如下:
1234567891011121314151617181920212223242526/// 矩阵接口template <class T>class IMatrix { public: // 获得行 virtual int cols() = 0; // 获得列 virtual int rows() = 0; // 设置元素 virtual void set(int row, int col, T e) = 0; // 获取元素 virtual T get(int row, int col) = 0; virtual string to_string() { stringstream ss; for (int i = 0; ...
k进制与等比数列求和公式的思考
关于二进制与公比为2的等比数列求和公式的思考
3位二进制最大表示的十进制数是多少?
3位二进制最大为(111)2(111)_2(111)2
换算成十进制位20+21+22=72^0+2^1+2^2=720+21+22=7
方法一:等比数列的求和公式为a1−anq1−q\frac{a_1-a_n q}{1-q}1−qa1−anq,这里a1a_1a1为首项,ana_nan为尾项,qqq为公比。
则有20+21+22=20−22×21−2=23−12^0+2^1+2^2=\frac{2^0-2^2 \times 2}{1-2}=2^3 - 120+21+22=1−220−22×2=23−1
方法二:我们知道(111)2=(1000)2−1(111)_2=(1000)_2-1(111)2=(1000)2−1,故有20+21+22=23−12^0+2^1+2^2=2^3-120+21+22=23−1
可以看出我们通过两种方法得到了相同的结果23−12^3-123−1。
关于k进制与公比为k的等比数列求和公式的思考
设有mmm位kkk进制数,nm...n1n0(n=0,1,2 ...
[手册翻译]微软FAT文件系统手册
Overview and Purpose
This document describes the on-media FAT file system format.
This document is written to help guide development of FAT implementations that are compatible with those provided by Microsoft.
这个文档描述了FAT文件系统的格式。
这个文档是微软为了引导FAT实现兼容性开发而编写的。
This document does not describe all algorithms contained in the Microsoft FAT file system driver implementation neither does it describe all algorithms contained in associated utilities (Microsoft format and chkdsk utilities).
However, it is e ...
jwt登录
概述
在实际应用中,很多API接口通常都需要在用户登录后才允许访问操作。但是显然不可能每次访问页面都携带用户名密码数据,这样不仅不安全,而且还会对数据库造成较大的压力。所以我们需要另辟蹊径。
实际上,由于http请求是无状态的,所以为了维持登录状态,必须在每次请求时,携带某种能够代表用户信息的字符串,且该字符串唯一,不可被伪造。这个字符串通常称为token。
想象以下,有一个地方,必须需要拿出相关证明才能入内。而该证明需要你通过某些个人信息去办理才能申请的到。为了防止开假证明,通常需要对证明进行签字,按压指纹等操作。
jwt实际上可以采用上述场景做比喻。当你需要访问服务器API时,服务器要求你携带jwt字符串才能访问该api,而jwt字符串需要你先使用用户名密码登录至系统才能申请到。为了防止jwt字符串被伪造,通常还需要使用服务器上存放的密钥来参与最终jwt字符串的构成。
由于计算机中字符串可轻易篡改,故不能将服务器上的密钥直接组合到jwt字符串中,而是需要服务器端存储的密钥数据与半成品jwt字符串做某种加密运算,得到加密后的签名,拼接在半成品jwt字符串之后,中间用.隔开。即实现j ...
二分查找编号所在位置
场景概述
有N组人,人数分别为a0,a1,a2,...,aN−1a_0,a_1, a_2, ..., a_{N-1}a0,a1,a2,...,aN−1,编号为0,1,2,...,a0−10,1,2,...,a_0-10,1,2,...,a0−1的人在第0组,其组内编号与编号一致,编号为a0,a0+1,...,a0+a1−1a_0,a_0+1,...,a_0+a_1-1a0,a0+1,...,a0+a1−1的人在第1组,其组内编号为0,1,...,a1−10,1,...,a_1-10,1,...,a1−1,编号为a0+a1,a0+a1+1,a0+a1+2,...,a0+a1+a2−1a_0+a_1,a_0+a_1+1,a_0+a_1+2,...,a_0+a_1+a_2-1a0+a1,a0+a1+1,a0+a1+2,...,a0+a1+a2−1的人在第2组。…以此类推。
问:编号为i的人所在组号x为多少?
算法分析
由题意可设
Si=a0+a1+...+aiS_i=a_0+a_1+...+a_iSi=a0+a1+...+ai
则有
第0组的 ...
LRU缓存实现
需求概述
实现一个满足LRU缓存的数据结构,即有一个容器,可以存放key-value型的数据,有以下功能:
根据缓存最大容量构造该缓存数据结构
能够根据key获取相应的value,若缓存未命中则返回相应异常标志
可以放入一个kv数据,若已存在则变更value,若不存在,则淘汰最久未使用的kv对
还能够获得当前容器已存放的kv数目
可以删除指定kv对,可以清空缓存
问题分析
使用golang实现该数据结构,即定义一个结构体,实现如下LRU接口
为了通用起见,key,value不限定类型,即interface{}类型
12type Key interface{}type Value interface{}
设计一个结构体,实现如下接口方法
1234567type LRU interface { Get(key Key) (value Value, ok bool) Put(key Key, value Value) Remove(key Key) Len() int ...
软件测试期末复习
基本路径测试法
基本路径测试法是在是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径 出基本可执行路径集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中程序的每一条可执行语句至少执行一次。
程序的控制流图
控制流图是描述程序控制流的一种图示方式。其中基本的控制结构对应的图形符号如图所示。在图所示的图形符号中,圆圈称为控制流图的一个结点,它表示一个或多个无分支的语句或源程序语句。
如下图所示,程序的流程图可以映射到控制流图
在具有复合条件的情况时,可以转化拆分成成单条件的流程图,如下图先判断单条件a,则根据短路直接可执行到y,否则继续判断b
环路复杂度
进行程序的基本路径测试 进行程序的基本路径测试时,程序的环路复杂性给出了程序基本路径集合中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必须的测试用例数的测试用例数目的最小值。
所谓独立路径,是指包括若干未曾处理的语句或条件的一条路径。
基本路径集不是惟一的,对于给定的控制流图,可以得到不同的基本路径集。
通常环路复杂性可用以下3种方法求得。
将环路复杂J性定义为控制流图中的区 ...