S-DES加密过程
加密模型
输入输出
算法流程
密钥生成流程
已知10位的种子密钥k=(k0,k1,...,k9)k=(k_0,k_1,...,k_9)k=(k0,k1,...,k9)
执行P10P10P10置换变换得到m1=P10(k)m_1=P10(k)m1=P10(k)
5位一组分割成两组,每组内循环左移s位记作变换SLsSL_sSLs,对m1m_1m1进行5位一组分割的循环左移1位变换,得m2=SL1(m1)m_2=SL_1(m_1)m2=SL1(m1)
执行10位变8位的P8置换变换得到k1=P8(m2)k_1=P8(m_2)k1=P8(m2)
对m2m_2m2进行5位一组分割的循环左移2位变换,得m3=SL2(m2)m_3=SL_2(m_2)m3=SL2(m2)
执行10位变8位的P8置换变换得到k2=P8(m3)k_2=P8(m_3)k2=P8(m3)
加密流程
先来看加密算法,已知明文ppp
对ppp执行初始变换IPIPIP得到IP(p)IP(p)IP(p)
对IP(p)IP(p)IP(p)执行依赖密钥k1k ...
Hill密码
Hill密码
已知明文“Thank you”,密钥为
K=[1203]K=\begin{bmatrix}
1 & 2\\
0 & 3
\end{bmatrix}
K=[1023]
加密公式为C=KmC=KmC=Km ,试用Hill密码算法进行加密,并求出K−1K^{-1}K−1,用你得到的密文进行解密验算。
手算过程
加密过程
将消息划分为m1,m2,…,m8 = t,h,…,u
[c1c2]=K⋅[m1m2]=[1203]⋅[197]=[3321]mod 26=[721]=[hv]\begin{bmatrix}
c_1 \\
c_2
\end{bmatrix}
=
K
\cdot
\begin{bmatrix}
m_1 \\
m_2
\end{bmatrix}
=
\begin{bmatrix}
1 & 2\\
0 & 3
\end{bmatrix}
\cdot
\begin{bmatrix}
19 \\
7
\end{bmatrix}
=
\begin{bmatrix}
33 \\
21
\end{bmatrix}
mod \ ...
Vigenere密码
Vigenere密码
设明文为“visit beijing tomorrow”,密钥为“enjoy”,试用Vigenere算法进行加密。
手动实现
a
b
c
d
e
f
g
h
i
j
0
1
2
3
4
5
6
7
8
9
k
l
m
n
o
p
q
r
s
t
10
11
12
13
14
15
16
17
18
19
u
v
w
x
y
z
20
21
22
23
24
25
c1 = (v+e) % 26 = (21+4) % 26 = 25 = z
c2 = (i+n) % 26 = (8+13) % 26 = 21 = v
同理c = zvbwr onwhmap rszxfpsj
代码实现
1234567891011121314151617181920212223242526272829303132333435#include <iostream>using namespace std;char getTableElement(char a, char b) { a -= & ...
Playfair密码
Playfair密码
Playfair密码出现于1854年,它将明文中的双字母组合作为一个单元对待,并将这些单元转换为密文双字母组合。Playfair密码基于一个字母矩阵,该矩阵使用一个关键词(密钥)来构造。
字母矩阵
其构造方法是:从左至右、从上至下依次填入关键词的字母(去除重复的字母),然后再以字母表顺序依次填入其他字母。字母I和J被算为一个字母(即J被当做I处理)。
如密钥为monarchy,则构造字母矩阵如下:
当密钥串有重复字符出现时,需要去重,否则矩阵将无法覆盖26个字母。
我们可以方便地实现字母矩阵的数据结构的代码如下,
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889#include <iostream>#include <sstream>#include ...
密码学基本术语
基本术语
(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 ...