加密技术包括两个元素:算法和密钥。算法是将普通的信息或者能够理解的信息与一串数字(密钥)结合,产生不可理解的密文的步骤,密钥是用来对数据进行编码和解密的一种算法。在安全保密中,可经过适当的钥加密技术和管理机制来保证网络的信息通讯安全。golang
经常使用的加密解密方法主要有如下加大类:算法
基本加密方法c#
对称加密方法安全
非对称加密方法服务器
下面咱们简单介绍一下这几种加密码方法网络
咱们先来了解一下加密解密的技术。函数
数据加密和数据解密是一对逆过程。学习
先来看加密解密的公式:网站
加密:编码
数据加密是用加密算法E和加密密钥K1将明文P转换成密文C 用上面公式表示。
解密:
数据解密是数据加密的逆过程, 解密算法D和解密密钥K2奖密文C转换成明文P。
经过下图咱们能够清晰的看到,数据加密及解密的整修过程:
发送端将明文P 经过加密算法E与加密密钥Ke,生成密文C,而后传输到接收端,接收端收到密文后经过解密算法D与解密密钥Kd对密文C进行解密,最终还原明文P。
知道了加密的整个过程,咱们来看看上面所说的三种加密解密方式。
基本加密方法只要分为:
位移法
按照必定的规则,从新安排明文中的比特或字符的顺序来造成密文,而字符自己保持不变。
> 例如: `hello world!` 咱们能够变为: `lord l!oleh`, 只须要按照必定的规则解开就能够了。
置换法
按照必定的规则,用一个字符去置换(替代)另外一个字符来造成密文。
> 咱们仍是以 `hello world!` 为例,约定一个简单的算法把`h`变成`9`,`r`>`c`, `l`>`#`,那么获得的结果就是: `9e##o woc##d!` 解密把它逆过来就行了,很是简单。
对称密钥加密 又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。
这类算法在加密和解密时使用相同的密钥,或是使用两个能够简单地相互推算的密钥。
实际上,这组密钥成为在两个或多个成员间的共同秘密,以便维持专属的通讯联系。
上面说得可能有点饶,举个简单的例子:
假设小明与小红在考试,他们相互约定了一个算法: 当小明连续咳嗽三声的时候小红看着小明,若是小明摸了下左耳朵,那就说明小红能够给小明传答案了。若是没有,那多是小明感冒了...
而后怎么传答案呢? 小红摸左耳朵表明A, 摸右耳朵表明B,左手抠鼻子表明C,右手抠鼻子表明D
怎么样,经过上面的个简单的例子是否是比较好理解呢,对称加密码就是双方约定好一个算法,经过这个算法进行加密解密。
经常使用的对称加密码主要分为如下几类:
DES
三重DES(TDEA)或3DES
RC-5
IDEA
AES
DES 主要采用替换和移位的方法加密,它用56位密钥对64位二进制数据进行加密,每次加密可对64位输入数据进行16轮编码,经一系列替换和移位后输入的64位原始数据转换成了不一样的64位输出数据。DES算法运算速度快,密钥产生容易。
三重DES 在DES的基础上采用了三重DES,用两个56位的密钥k1和k2. 发送方k1加密,k2解密,再使用k1加密。接收方则使用k1解密,k2加密,再使用k1解密
RC-5 引入了一种新的密码基本变换数据相依旋转方法,即一个中间的字是另外一个中间的低位所决定的循环移位结果,以提升密码强度
IDEA 是国际数据加密算法 是在DES算法的基础上发展而来,相似于三重DES。密钥长度为128位。
AES 基于排列和置换运算。提成列是对数据从新进行安排,置换是将一个数据单元替换成另外一个。可使用128,192,256们的密钥,而且用128位(16字节)分组加密和解密数据。
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第八、1六、2四、3二、40、4八、5六、64位是校验位, 使得每一个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法造成密文组的加密方法。
下图是它的加密流程:
DES的密钥长度为56位,这意味着加密时存在256个密钥可供选择,即72,057,594,037,927,936种可能性。
DES如今已经不是一种安全的加密方法,主要由于它使用的56位密钥太短。DES破解机包括1,856个自定义的芯片,能够在数天内破解一个DES密钥—本图显示了使用数个Deep Crack芯片搭成的DES破解机
下图就是专门破解DES加密的芯片:
AES为分组密码,分组密码也就是把明文分红一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每一个分组为16个字节(每一个字节8位)。密钥的长度可使用128位、192位或256位。密钥的长度不一样,推荐加密轮数也不一样。
好比咱们家里的无线路由器,通常使用的就是AES加密。
AES加密算法涉及4种操做:
字节替代
行移位
列混淆
轮密钥加
字节替换,上面已经讲过。
咱们能够把加密的数据分解成 4x4 大小的表格,而后对表格里的每一个空位进行替换而后移位,再进行列混淆加上密钥,重复上面几个步骤。
下图是加密解密的流程图:
字节代替的主要功能是经过S盒完成一个字节到另一个字节的映射。S盒的详细构造方法能够直接给出构造好的结果,S盒用于提供密码算法的混淆性。
用两张替换表能够秀好的理解:
加密替换表:
解密替换表:
假设: 字节00000000B能过加密替换表x=0,y=0替换后的值为(S0=)63H,再经过解密替换表便可获得替换前的值x=6,y=3,(S-1 6=)00H。
行移位是一个4x4的矩阵内部字节之间的置换,用于提供算法的扩散性。
行移位分有:
正向行移位
假设矩阵的名字为state,用公式表示:statei = statei;其中i、j属于[0,3]。
逆向行移位
用公式表示:statei = statei;其中i、j属于[0,3]。
正向行移位: 正向行移位用于加密,其原理图以下。其中:第一行保持不变,第二行循环左移8比特,第三行循环左移16比特,第四行循环左移24比特。
逆向行移位: 逆向行移位便是相反的操做,即:第一行保持不变,第二行循环右移8比特,第三行循环右移16比特,第四行循环右移24比特。
利用GF(28)域上算术特性的一个代替,一样用于提供算法的扩散性。
一样的也有:
正向列混淆
逆向列混淆
对称加密速度快可是安全性相对于非对称加密来讲低,为何呢?
密钥的交换须要创建在安全的通讯基础上,而通讯自己是不可能绝对安全的
加密和解密使用相同的密钥,若是信息泄露,提取到了密钥,密文就会被轻易破解
没法验证发送者,能够用相同的加密方式伪造密文,这时信息的来源就变得不可靠
密钥每使用一次都被抛弃,须要从新生成密钥
要想使用对称加密,那么分享信息的各个个体之间都须要分享这个密钥,好比1000我的之间都使用同一个密钥进行密文传输,只要其中一我的密钥被盗窃了,那么总体加密的信息将都被破解了。
那有什么方法呢,这个时候就能够引入另外一种加密算法 非对称加密。
如何作到即便一我的的密钥被盗窃了,最起码保证你给其余人发送密文不被破解?
简单来讲就是: 每一个人生成一个“私钥-公钥”对,这个私钥须要每一个人自行进行保护!公钥能够随便分享,同时,生成的这个“私钥-公钥”对还有个强大的功能就是,使用私钥加密的信息,只能由该私钥对应的公钥才能解密,使用公钥加密的信息,只能由该公钥对应的私钥才能解密!
仍是拿上面小明、小红来举例:
小明生成了他本身的一个“私钥-公钥”对,叫作“小明私钥-小明公钥”,小红生成了他本身的一个“小红私钥-小明公钥”对,以前咱们说过私钥要每一个个体本身进行保存,公钥能够随便分享,目的是为何呢?是为了加密信息!
有了公钥、私钥以后,小明在QQ群里与小红说:
非对称解密算法 即便别人截取了,也只是知道该公钥而已,可是要是想解密使用该公钥加密的密文!只有一我的能够办获得!就是小红! 为何?
小明使用小红的公钥加密的信息,只有小红的公钥所对应的私钥,这里就是“小红私钥”,才能解密!因此,没有小红私钥的第三方即时截取了这些密文,也破解不了!或者更严格的说在有限时间内好比说几十上面年内很难进行暴力破解!
咱们来看看官方对非对称加密的解释
公开密钥加密,也称为非对称加密,一种密码学算法类型,在这种密码学方法中,须要一对密钥(其实这里密钥说法很差,就是“钥”),一个是私人密钥,另外一个则是公开密钥。这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密。若是知道了其中一个,并不能计算出另一个。所以若是公开了一对密钥中的一个,并不会危害到另一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。
看明白了么?是否是有一种WFT的感觉?
非对称加密须要包含:
Private Key 私钥
Public Key 公钥
下图是非对称加密解密的过程图:
大概意思就是,要想使用非对称加密算法,首先要有一对key,一个为private key私钥,一个为public key公钥,而后能够把你的public key分发给想给你传密文的用户,而后用户使用该public key加密过得密文,只有使用你的private key才能解密,也就是说,只要你本身保存好你的private key,就能确保,别人想给你发的密文不被破解,因此你不用担忧别人的密钥被盗。
小明用小红给的公钥给明文进加密
小红用本身的私钥对密文进行解密
这种加密是单向的,因此被称为非对称加密算法
Ok 咱们来总结一下 非对称加密码的特色
优势:
容许在不安全的媒体上交换信息
解密的私钥不发往任何用户,即便密文泄露也不用担忧被破解,由于没有私钥
能够验证消息的发送者
缺点:
加密速度较慢
这种加密算法应用很是普遍,SSH, HTTPS, TLS,电子证书,电子签名,电子身份证等等。
咱们来举一个比较经常使用的算法RSA加密解密算法
RSA加密算法是非对称加密算法的一种,是三个牛逼的人一块儿提出的。RSA就是下图他们三人姓氏开头字母拼在一块儿组成的。
我猜左边两个会比右边这个更聪明(看头发(ˉ︶ˉ))
咱们来看看公钥与私钥的产生一共有四个步骤:
选择两个大素数p和我(大于10100)
令n=pq和z=(p-1)(q-1)
选择d与z的互质
选择e,使e*d=1(mod z)
(n,e)是公钥,(n,d)是私钥
明文P被分红了k位的块,k是知足2k<n的最大整数,因而有了0<=P<n (n最好大于 1024)
什么是互质关系?
若是两个正整数,除了1之外,没有其余公因子,咱们就称这两个数是互质关系(coprime)。好比,15和32没有公因子,因此它们是互质关系。这说明,不是质数也能够构成互质关系。
任意两个质数构成互质关系,好比13和61。
一个数是质数,另外一个数只要不是前者的倍数,二者就构成互质关系,好比3和10。
若是两个数之中,较大的那个数是质数,则二者构成互质关系,好比97和57。
1和任意一个天然数是都是互质关系,好比1和99。
p是大于1的整数,则p和p-1构成互质关系,好比57和56。
p是大于1的奇数,则p和p-2构成互质关系,好比17和15。
任意给定正整数n,在小于等于n的正整数之中,有多少个与n构成互质关系?
计算这个值的方法就叫作欧拉函数,以φ(n)表示。在1到8之中,与8造成互质关系的是一、三、五、7,因此 φ(n) = 4。
若是n能够分解成两个互质的整数之积:
n = p1 × p2
则:
φ(n) = φ(p1p2) = φ(p1)φ(p2)
因此:
φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24
小明想给小红发送一个消息M,他知道小红产生的公钥(n,e)他使用起先与小红约好的格式将M转换为一个小于n的整数m,好比他能够将每个字转换为这个字的Unicode码,而后将这些数字连在一块儿组成一个新的数字。若是他的信息很是长的话,他能够将这个信息分为几段,而后将每一段转换为m。用下面这个公式他能够将m加密为c
加密公式:
德龙获得海丰的消息c后就能够利用他的私钥d来解码。他能够用如下这个公式来将c转换为m
解密公式:
假设:
p = 3, q = 11, n = 33, z = 20, d = 7, e = 3 C = P3(mod 33) P = C7(mod 33)
套用公式:
则:
C = 23(mod 33) = 8(mod 33) = 8 P = 87(mod 33) = 2097152(mod 33) = 2
z=(p-1)(q-1), n=pq, Mod 取余数, (n,e)是公钥, (n,d)是私钥
设明文大P 为2, 2是明文。8是密文
参照上面的公式,咱们写一个很是很是很是很是简单的例子:
最终得出的结果以下:
最大值在 32
, 最小值: 1
,明文不得超过 p * q
,因此p,q
必须大。
RSA 的另外一个最大的优势是其在数字签名中的应用。数字签名的做用是确认消息来源的可靠性,保证信息的完整性和不能否认性。假如A要公开发布本身的文件,A先用HASH算法生成这个文件的消息摘要(或者叫信息指纹),再用 RSA 加密算法(A 的私钥)对摘要进行加密。用户想要下载 A 发布的文件,须要同时下载文件和摘要,下载完毕后,用户使用 A 的公钥对摘要进行解密获得 A 以前生成的摘要,而且用户用一样的 HASH 算法对下载到的文件生成一份摘要,比对这两份摘要是否相等,若是相等,那么能够肯定两件事情:文件是完整的,文件是 A 发布的。
咱们从不少下载文件的网站都会看到一些 SHA256, MD5 码,这就是对文件进行校验的,验证文件是否是官方发页的,有没有被窜改过。咱们看golang.org官方源码包:
RSA的算法安全性是基于大素数分解的困难性,攻击者能够分解已知的n,获得p和q,而后可获得z,最后用Euclid算法由e和z获得d。
咱们能够在服务器上生成本身的公钥私钥,服务器须要安装OpenSSL
:
私钥:
下面是所生成的公钥:
常见的 RSA 攻击方法有:
直接分解模数n
对 RSA 的选择密文攻击
对 RSA 的同模攻击
对 RSA 小指数的攻击
RSA 的比特性攻击
普遍的应用证实 RSA 体制的安全性是至关可靠的。RSA 密码体制的安全性取决于其加密函数求逆的困难性,即大数因子分解的困难性。虽然至今在理论和实践中还未能证实有分解大整数的有效方法,但大数因子分解未被证实为是 NP 问题,随着计算机计算能力的提升,原来被认为不可能分解的某些大整数可能会被成功分解,这对 RSA 密码体制的安全性构成潜在的威胁。
在将来比较长的时间范围内(在不动用国家级计算机的状况下),大约几百年上千年,在不考虑量子计算和对密码算法破解分析没有太大突破的前提下,不大可能经过计算能力提高而使得现有的密码算法获得轻易地破解。
本人才书学浅,如有写错,或理解错的地方,欢迎你们指正。
虚心向各们大佬们学习。
深情按压, 小额赞扬, 您的赞扬就是我更新的动力。