加解密与编解码基础知识

BASE64编码

26个大写英文字母
26小写英文字母
10数字
”+””/”

转换前 10101101,10111010,01110110
转换后 00101011, 00011011 ,00101001 ,00110110
十进制 43 27 41 54 对应码表中的值 r b p 2
所以上面的24位编码,编码后的Base64值为 rbp2
原理是38=46

关于这个编码的规则:
① .把3个字节变成4个字节。 总长度长了1/3
如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?此时,需在原数据后面添加1个或2个零值字节,使其字节数是3的倍数。然后,在编码后的字符串后面添加1个或2个等号“=”,表示所添加的零值字节数。解码的时候,会自动去掉。
② 每76个字符加一个换行符。
③ .最后的结束符也要处理。
优点:可以将二进制数据转换成可打印字符,方便传输数据;对数据进行简单的加密,肉眼安全。
缺点:内容编码后的体积会变大,编码和解码需要额外的工作量

它的使用场景有很多,比如将图片等资源文件以Base64编码形式直接放于代码中,使用的时候反Base64后转换成Image对象使用;有些文本协议不支持不可见字符的传递,只能转换成可见字符来传递信息。有时在一些特殊的场合,大多数消息是纯文本的,偶尔需要用这条纯文本通道传一张图片之类的情况发生的时候,就会用到Base64,比如多功能Internet 邮件扩充服务(MIME)就是用Base64对邮件的附件进行编码的。

信息摘要算法SHA-2和HMAC算法

单向散列函数,又称单向Hash函数、杂凑函数,就是把任意长的输入消息串变化成固定长的输出串且由输出串难以得到输入串的一种函数。这个输出串称为该消息的散列值。一般用于产生消息摘要,密钥加密等.

SHA1 比 MD5 的 安全性更强。对于长度小于 2 ^ 64 位的消息,SHA1 会产生一个 160 位的 消息摘要。基于 MD5、SHA1
的信息摘要特性以及 不可逆 (一般而言),可以被应用在检查文件完整性 以及 数字签名 等场景。
SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

2017年2月23日,Google公司公告宣称他们与CWI Amsterdam合作共同创建了两个有着相同的SHA-1值但内容不同的PDF文件,这代表SHA-1算法已被正式攻破。

SHA-2下又可再分为六个不同的算法标准包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
在这里插入图片描述

两个不同的消息产生同一个散列值的情况称为碰撞。
密钥技术中所使用的单向散列函数,都需要具备抗碰撞性。
这里所说的抗碰撞性,指的是难以找出另外一条具备特定散列值的消息

MAC(MessageAuthentication Code):消息认证代码,是一种使用密钥的单向函数,可以用它们在系统上或用户之间认证文件或消息。HMAC(用于消息认证的密钥散列法)就是这种函数的一个例子。

HMAC 运算利用 哈希算法 (MD5、SHA1 等),以 一个密钥 和 一个消息 为输入,生成一个 消息摘要 作为输出。在IPSec和其他网络协议(如SSL)中得以广泛应用。

对称加密算法AES

对称加密算法
加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。

DES曾经统一密码学,成为大佬,但是20年后被黑客攻破了几次。
3倍DES能撑一会儿,但是太慢
于是就有了AES,比3倍DES更快更灵活 成为分组界的加密boss

AES加密过程

1.字节代换 查表
2.行位移 第几行左移几个字节
3.列混合 乘上一个固定矩阵
逆变换矩阵同正变换矩阵的乘积恰好为单位矩阵 PAP-1 =A 可逆矩阵
4.轮密钥加 逐位异或

密钥扩展 轮常量Rcon[j]异或 Word
新列以如下的递归方式产生:
1.如果i不是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁W[i-1] W[4]=W[0]⨁W[3]
2.如果i是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁T(W[i-1]) W[5]=W[1]⨁T(W[4])
其中 函数T由3部分组成:字循环、字节代换和轮常量异或。

注意:加密的第1轮到第9轮的轮函数一样,包括4个操作:字节代换、行位移、列混合和轮密钥加。
在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作。另外最后一轮迭代不执行列混合。

逆向识别标准的AES算法最关键的是找到置换表s_box,在AES算法中该置换表为固定的256元素数字:
在这里插入图片描述
s_box的内容过长,这里不做展示。如果顺利找到该表,那么所用的加密算法很有可能就是AES算法。
此后,再查看一下是否存在形式如下的赋值语句:
mov al , [esi + eax]
mov [ecx + edx - 1] , al
截图如下:
在这里插入图片描述
是否存在列混合矩阵的几个关键常量:0×02, 0×01,0×01, 0×03:
在这里插入图片描述
以及是否存在与密钥的异或操作,并存储异或结果的操作:
在这里插入图片描述
当以上所有结果都判断为真,那么已经可以认定为基本的AES算法了。

RSA算法

1976年以前,所有的加密方法都使用对称加密算法:加密和解密使用同一套规则。例如:甲使用密钥 A 加密,将密文传递给乙,乙仍使用密钥 A 解密。如果密钥 A 在甲传递给乙的过程中泄露,或者根据已知的几次密文和明文推导出密钥 A,则甲乙之间的通讯将毫无秘密。

RSA算法通信过程

假如甲要和乙通讯,甲使用公钥 A 加密,将密文传递给乙,乙使用私钥 B 解密得到明文。其中公钥在网络上传递,私钥只有乙自己拥有,不在网络上传递,这样即使知道了公钥 A 也无法解密。反过来通讯也一样。只要私钥不泄漏,通信就是安全的,这就是非对称加密算法。

RSA算法的重要性
如果没有 RSA 算法,现在的网络世界毫无安全可言,也不可能有现在的网上交易。上一篇文章 ssh 协议为什么安全 中的 ssh 协议也是基于 RSA 加密算法才能确保通讯是加密的,可靠的。
这是目前地球上最重要的加密算法
RSA 是第一个能同时用于 加密 和 数字签名的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已被 ISO 推荐为公钥数据加密标准.

生成密钥对,即公钥和私钥。

第一步:随机找两个质数 P 和 Q ,P 与 Q 越大,越安全。
比如 P = 67 ,Q = 71。计算他们的乘积 n = P * Q = 4757 ,转化为二进为 1001010010101,该加密算法即为 13 位,实际算法是 1024 位 或2048 位,位数越长,算法越难被破解。

第二步:计算 n 的欧拉函数 φ(n)。
φ(n) 表示在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。例如:在 1 到 8 之中,与 8 形成互质关系的是1、3、5、7,所以 φ(n) = 4。
如果 n = P * Q,P 与 Q 均为质数,则 φ(n) = φ(P * Q)=φ(P - 1)φ(Q - 1) = (P - 1)(Q - 1) 。
本例中 φ(n) = 66 * 70 = 4620,这里记为m, m = φ(n) = 4620

第三步:随机选择一个整数 e,条件是1< e < m,且 e 与 m 互质。
公约数只有 1 的两个整数,叫做互质整数,这里我们随机选择 e = 101
请注意不要选择 4619,如果选这个,则公钥和私钥将变得相同。
第四步:有一个整数 d,可以使得 e*d 除以 m 的余数为 1。
即找一个整数 d,使得 (e * d ) % m = 1。
等价于 e * d - 1 = y * m ( y 为整数)
找到 d ,实质就是对下面二元一次方程求解。
e * x - m * y =1 ,其中 e = 101,m= 4620
101x - 4620y =1
这个方程可以用"扩展欧几里得算法"求解,此处省略具体过程。 总之算出一组整数解(x,y )= ( 1601,35),即 d = 1601。

到此密钥对生成完毕。不同的 e 生成不同的 d,因此可以生成多个密钥对。

本例中公钥为 (n,e) = (4757 ,101),私钥为 (n,d) = (4757 ,1601) ,仅(n,e) = (4757 ,101) 是公开的,其余数字均不公开。可以想像如果只有 n 和e,如何推导出 d,目前只能靠暴力破解,位数越长,暴力破解的时间越长。

加密生成密文

比如甲向乙发送汉字“中”,就要使用乙的公钥加密汉字
“中”, 以 utf-8 方式编码为 [e4 b8 ad],转为 10 进制为 [228,184,173]。要想使用公钥(n,e) = (4757 , 101)加密,要求被加密的数字必须小于 n,被加密的数字必须是整数,字符串可以取 ascii 值或unicode值,因此将“中”字折为三个字节
[228,184,173],分别对三个字节加密。

假设 a 为明文,b 为密文,则按下列公式计算出 b
a^e % n = b

计算 [228,184,173]的密文:
228^101 % 4757 = 4296
184^101 % 4757 = 2458
173^101 % 4757 = 3263

即 [228,184,173]加密后得到密文 [4296,2458,3263] ,如果没有私钥 d
,神仙也无法从 [4296,2458,3263]中恢复 [228,184,173]

解密生成明文

乙收到密文 [4296,2458,3263],并用自己的私钥(n,d) = (4757 ,1601) 解密。解密公式如下:
假设 a 为明文,b 为密文,则按下列公式计算出 a
a^d % n = b

密文 [4296,2458,3263]的明文如下:
4296^1601% 4757 = 228
2458^1601% 4757 = 184
3263^1601% 4757 = 173
即密文 [4296,2458,3263] 解密后得到 [228,184,173]
将[228,184,173] 再按 utf-8 解码为汉字 “中”,至此解密完毕。

"对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。
目前被破解的最长RSA密钥就是768位。实际应用中 RSA 的密钥长度为 1024 位,重要场合 2048 位,未来半个世纪不可能破解。

ECC加密算法

公开密钥算法总是要基于一个数学上的难题。比如RSA 依据的是:给定两个素数p、q 很容易相乘得到n,而对n进行因式分解却相对困难。那椭圆曲线上有什么难题呢?

在椭圆曲线系统中我们只需要使用相对于RSA 短得多的密钥就可以达到与其相同的安全强度。一般认为160比特的椭圆曲线密钥提供的安全强度与1024比特RSA密钥相当。使用短的密钥的好处在于加解密速度快、节省能源、节省带宽、存储空间。
比特币以及中国的二代身份证都使用了256 比特的椭圆曲线密码算法。
在这里插入图片描述
这里所说的椭圆和高中学的完全不一样。
一条椭圆曲线是在射影平面上满足威尔斯特拉斯方程(Weierstrass)所有点的集合。
在这里插入图片描述
椭圆曲线在软件注册保护的应用

我们知道将公开密钥算法作为软件注册算法的好处是Cracker很难通过跟踪验证算法得到注册机。下面,将简介一种利用Fp(a,b)椭圆曲线进行软件注册的方法。
  
  软件作者按如下方法制作注册机(也可称为签名过程)
  1、选择一条椭圆曲线Ep(a,b),和基点G;
  2、选择私有密钥k(k  
3、产生一个随机整数r(r  4、将用户名和点R的坐标值x,y作为参数,计算SHA(Secure Hash Algorithm 安全散列算法,类似于MD5)值,即Hash=SHA(username,x,y);
  5、计算sn≡r - Hash *k (mod n)
  6、将sn和Hash作为 用户名username的序列号

软件验证过程如下:(软件中存有椭圆曲线Ep(a,b),和基点G,公开密钥K)
  1、从用户输入的序列号中,提取sn以及Hash;
  2、计算点R≡snG+HashK( mod p ),
如果sn、Hash正确,其值等于软件作者签名过程中点R(x,y)的坐标,因为 sn≡r-Hashk (mod n)
    所以 sn
G + HashK  
=(r-Hash
k)G+HashK   
=rG-HashkG+HashK   
=rG- HashK+ HashK  
=rG=R ;
  3、将用户名和点R的坐标值x,y作为参数,计算H=SHA(username,x,y);
  4、如果H=Hash 则注册成功。如果H≠Hash ,则注册失败(为什么?提示注意点R与Hash的关联性)。

简单对比一下两个过程:
  作者签名用到了:椭圆曲线Ep(a,b),基点G,私有密钥k,及随机数r。
  软件验证用到了:椭圆曲线Ep(a,b),基点G,公开密钥K。
  Cracker要想制作注册机,只能通过软件中的Ep(a,b),点G,公开密钥K ,并利用K=kG这个关系获得k后,才可以。而求k是很困难的。

首先,感谢任何一个阅读,关注或点赞我博客的朋友!! 当然博客中的任何问题都欢迎大家随时指出! 欢迎有兴趣的人私信留下你的联系方式,我们可以一起沟通,一起学习哦!我的学习交流QQ群366469549。 再次感谢大家的支持!!! 我会再接再厉的!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

摔不死的笨鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值