精华内容
下载资源
问答
  • AES

    千次阅读 2018-10-22 16:18:04
    如果大家想学习更多关于AES的内容,可以参考这本书:The design of rijndael, AES—the advanced encryption standard 一、 AES的出现 尽管3DES能够抵抗利用当前技术发起的蛮力攻击,但它仍然存在一些问题,首先3...

    一、 AES的出现
    尽管3DES能够抵抗利用当前技术发起的蛮力攻击,但它仍然存在一些问题,首先3DES的软件实现并不十分高效,DES已经不适合软件实现,而3DES实现所需要的时间是DES的三倍多。DES的第二个缺点是它的分组大小相对较小,一般每个分组是64bits,这也是一个非常大的缺陷,如果使用量子计算机攻击DES,密钥长度最好接近256bits。因此,NIST得出一个结论:需要一个全新的分组密码来代替DES。1997年4月15日,美国ANSI发起征集AES(advanced encryption standard)的活动,在一开始征集AES时,有四个要求:
    1、 该密码必须是分组密码且分组大小为128位;
    2、 必须支持三种密码长度:128位,192位,256位。
    3、 比提交的其他算法更安全
    4、 在软件和硬件实现上都很高效。
    经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。Rijndael由比利时的Joan Daemen和Vincent Rijmen设计。算法的原型是Square算法,它的设计策略是宽轨迹策略(wide trail strategy)。算法有很好的抵抗差分密码分析及线性密码分析的能力。AES过程也为分组密码的设计、分析和应用提供了巨大的推动力。除非AES中存在灾难性的弱点,否则这种密码将在未来20到30年几乎在所有地方使用。
    二、 AES描述
    AES采用的是SP网络(代换-置换网络,而非Feistel架构),该密码的分组长度是128bits,加密密钥有128,192,256bits三种,AES采用的是byte结构,将明文分组放在一个4 × \times × 4的矩阵中(每个项代表一个byte(8bits)),在学习AES加密过程之前,需要掌握关于GF( 2 n 2^n 2n)的计算(加法和乘法),这对之后学习S盒非常重要。有限域:函数的运算结果全部包含在一个域中,这个域不同于实数域,有限域有一个最大值,超过最大值的数都会经过一定的方法是的这个数回到这个域中。
    三、 AES的加密过程
    AES被定义为分组长度为128bits,密钥长度为128,192,256bits,根据密钥长度不同,将AES记为AES-128,AES-192和AES-256,他们三个的区别在于加密的轮数和密钥编排方面。AES-128需经历10轮,AES-192需经历12轮,AES-256需经历14轮,下面我们以AES-128为例。
    在这里插入图片描述
    128-bit的输入被写为 b 0 b 1 ⋯ b 7 b_{0}b_{1} \cdots b_{7} b0b1b7 ,这128bits可以写为16byte(每byte代表8bits) B 0 B 1 ⋯ B 7 B_{0}B_{1} \cdots B_{7} B0B1B7,每个 B i B_{i} Bi可以表示为 b 8 i b 8 i + 1 ⋯ b 8 i + 7 b_{8i}b_{8i+1} \cdots b_{8i+7} b8ib8i+1b8i+7,每个byte都可以用GF( 2 n 2^n 2n)的元素表示成一个度为7的多项式:
    在这里插入图片描述
    因此,将128bits的输入写为一个矩阵的形式:
    在这里插入图片描述
    在这里插入图片描述
    AES一共分为以下几个操作:SubBytes(S盒)—每个byte经过一个非线性计算,ShiftRows(行移位)—矩阵的每行右移的字节数不同,MixColums(列混合)—乘一个矩阵M,Addkey(密钥加)—与子密钥矩阵进行异或运算。AES加密的整个过程:
    在这里插入图片描述
    下面分开介绍:
    1、 SubBytes
    字节变换使用一个S盒,S盒是一个16 × \times × 16的矩阵,如下表,其非线性置换为:输入的前四位指定S盒的行,后四位制定S盒的列,例如“03”,行0,列3,因此输入为“03“,输出为“7B”。
    n i = S [ m i ] , 1 ≤ i ≤ 15 n^{i}=S[m_{i}],1\leq i\leq 15 ni=S[mi]1i15
    在这里插入图片描述
    在这里插入图片描述
    2、 ShiftRows
    矩阵第一行不动,第二行左移一位,第三行左移两位,第四行左移三位。
    在这里插入图片描述
    3、 MixColumns
    将状态矩阵的每一列看作一个在GF( 2 8 2^8 28)的(4 × \times × 1)的列向量,将一个(4 × \times × 4)在GF( 2 8 2^8 28)上的矩阵M与列向量相乘(用到不可约多项式)。
    在这里插入图片描述
    在这里插入图片描述
    4、AddRoundKey
    将列混合的状态矩阵与子密钥进行XOR逻辑运算(子密钥是通过初始密钥经过密钥编排派生出来的),即将轮密钥与状态矩阵按比特异或,如下图:
    在这里插入图片描述
    5、 AES加密的整个过程
    AES在加密之前,首先与子密钥进行密钥加运算,然后进行(n-1)轮的SubBytes、ShiftRows、MixColumns、AddRoundKey,最后一轮有SubBytes、ShiftRows、AddRoundKey变换。
    在这里插入图片描述
    6、 AES密钥编排
    AES算法加密盒解密的过程中采用的密钥同样是以矩阵的形式,以字节为基本单位,AES-128, AES-192, 和AES-256是16,24,32 bytes,,对应的矩阵是:(4 × \times × 4)、(4 × \times × 6)、(4 × \times × 8),需要的扩展密钥分别是(16 × \times × 11)、(16 × \times × 13)、(16 × \times × 15)bytes,AES的密钥编排是面向单词的,也就是将4byte看作一个单词,如下图分别是AES-128, AES-192, 和AES-256的密钥编排流程图以及AESS加密的流程图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    7、AES中S盒的设计特点
    AES与DES的不同点在于,DES的S盒给攻击者提供了破解DES的可能,而AES可以很好的抵御差分攻击和线性攻击,AES的S盒的设计如下图:
    在这里插入图片描述
    第一步:对每个byte求逆,利用多项式,GF( 2 8 2^8 28)中的逆元用作字节代换层核心功能的优势在于,它提供了高度的非线性,能防御一些目前已知的最强的分析攻击;
    第二步:乘以一个矩阵L,在这里将状态矩阵的每个byte看作一个列向量,注意:列向量的第一个位置的数在表示回byte时应放在最右边的位置,L表示为:
    在这里插入图片描述
    第三步:加上一个常量位矩阵c,常数值就是01100011= 6 3 x 63_{x} 63x,在进行矩阵运算时,注意位置。
    8、AES的扩散层
    AES 的扩散层是由两个子层组成的:ShiftRow(行移位)和MixColumn(列混合),扩散指的是将单个位的影响扩散到整个状态中(明文中的每一位影响密文中的许多位),与非线性的S盒不同,扩散层对状态矩阵执行的是线性操作即DIFF(A)+DIFF(B)=DIFF(A+B)。ShiftRow保证了状态矩阵的同一列元素的关系被打乱,它的目的是增加AES的扩散属性。MixColumn也是一个线性变换,它混淆了状态矩阵的每一列,每个输入字节经过MixColumn变换都影响了四个输出字节,因此,MixColumn是AES的主要扩散元素,当输入中有两个byte不为0,那么输出至少有三个字节不为0,下面详细介绍一下矩阵M的特点。
    在这里插入图片描述
    在这里插入图片描述
    矩阵M:最大距离可分码(Maximal Distance Separable, MDS)是线性码中较为重要的一类纠错码。设 M 是域 F 上的 n × n n\times n n×n矩阵,若M 的差分分支数和线性分支数均达 到 n+1,则称矩阵M 为一个极大最小距离可分矩阵 (简 称 MDS 矩阵)。与扩散结构的其他设计方法相比,采用MDS矩阵设计的扩散结构可以最大限度地保证分组 密码模型在差分和线性意义下的安全性,因此MDS 矩 阵是设计扩散结构的一类重要方法,AES中采用的矩阵M是MDS矩阵,并且也是循环矩阵、Hadamard矩阵,AES使用的MDS矩阵是从MDS码中提取出来的。
    四、AES解密的过程
    在上一次小组讨论时我们知道DES解密和加密一样,只是使用的解密密钥是倒置的加密密钥,这是因为DES使用的是Feistel结构,但是AES采用的是SPN结构,解密应该将所有的层倒过来,即字节代换层变为逆向代换层,ShiftRow层变为逆向ShiftRow层,MixColumn层变为逆向MixColumn层,而且子密钥的顺序也颠倒了,需要一个逆向的密钥编排,下图是AES解密的流程图:
    在这里插入图片、描述
    1、逆向MixColumn层
    在密钥加之后,再对状态矩阵使用逆向MixColumn操作(解密的第一轮除外),逆向MixColumn操作必须使用M矩阵的逆矩阵,输入时状态C(密文)的一个4字节长的列,状态C会与 M − 1 M^{-1} M1相乘,系数的乘法和加法(按位或)都是在GF( 2 8 2^8 28)中完成的,下图是矩阵M的逆矩阵:
    在这里插入图片描述
    2、逆向ShiftRow层
    为了逆转加密算法中的ShiftRow操作,我们必须反向移动状态矩阵中的行,第一行仍不变,第二行向左移三个字节,第三行向左移两个字节,第四行向左移一个字节。
    3、逆向S盒操作
    在解密密文时会用到逆向S盒,AES的S盒是双向映射,即一对一映射,因此满足下列公式是可能的:
    A i = S − 1 ( B i ) = S − 1 ( S ( A i ) ) A_{i}=S^{-1}(B_{i})=S^{-1}(S(A_{i})) Ai=S1(Bi)=S1(S(Ai))
    下图为逆向S盒的表示,逆向S盒的设计和S盒的设计相反,逆向S盒是先将状态矩阵成以一个矩阵再加一个常数矩阵,最后对得到的结果求逆元,下图为逆向S盒的表示:
    在这里插入图片描述
    4、解密密钥编排
    由于解密的第一轮需要最后一个子密钥,解密的第二轮需要倒数第二个子密钥,以此类推,我们需要逆序的子密钥,实际中主要是通过首先计算整个密钥编排,然后将所有的11、13、15个子密钥存储起来实现的。
    五、 AES算法与安全性
    目前,已知的针对AES的分析攻击都比蛮力攻击的复杂度要高,到现在为止,人们普遍认为这些攻击方法将不会威胁到AES,这些攻击包括代数攻击、平方攻击、不可能差分攻击和相关密钥攻击,关于AES的最新研究可通过在线资源AES Lounge来了解,下面简单的介绍一下平方攻击和代数攻击以及侧信道攻击。
    1、平方攻击
    在平衡数据、内存、以及时间方面,针对AES最好的攻击是Square攻击,该分析方法也被AES的设计者熟知,它最初是用来攻击the block cipher Square(AES的前身),Square是选择明文攻击,下面介绍Square针对AES的攻击:
    针对4轮AES的Square攻击:
    在第三轮的MixColumns变换之前,得到的仍然是Λ集合,但在第三轮MixColumns之后,由于Λ集合在每个字节取遍所有的256个元素,,因此他们在每个字节上的异或和均为0,Λ集合变换到第四轮输入时,在每一个字节都是平衡的(对于Λ集合在某个位置是平衡的当且仅当所有状态该位置字节异或的结果为0,即该字节是平衡的),这种平衡经过接下来的S盒操作后有可能被破坏,如果第四轮是最后一轮,那么它不包括MixColumns操作,每一个密文字节仅仅依赖于第四轮的一个输入字节,猜测第四轮子密钥的一个子密钥的字节,则可由密文计算出第三轮输出在一个字节的值,从而验证异或结果是否为0,如果不成立,那么猜测的结果不正确,所猜测额密钥字节总共有256个候选值,上述等式成立的概率为 2 − 8 2^{-8} 28
    5轮AES的Square攻击:
    利用对4轮的攻击,末尾增加一轮,就得到了5轮的攻击,用等价密钥 M i x C o l u m n s − 1 ( K 4 ) MixColumns^{-1}(K_{4}) MixColumns1(K4)代替子密钥 ( K 4 ) (K_{4}) (K4),则可将第四轮的MixColumns和AddRoundkey交换顺序,要计算第三轮的输出在某一个字节上的值,需猜测第五轮子密钥的4个字节和第四轮等价子密钥的1个字节。
    针对AES 6轮的Square攻击:
    攻击者先构造一个含有 2 32 2^{32} 232个元素的明文集合,在第一轮之前,在后三列取相同的值,第一列取遍所有可能的 2 32 2^{32} 232个可能的值,然后猜测初始子密钥的相关的4个字节,,猜测最后一轮的四个字节以及第五轮的一个字节,共猜测9个字节,人们一旦猜测出这9个字节,那么猜测第六轮剩下的12个字节就非常容易了。
    2、代数攻击
    代数攻击的主要思想将密码体制内在加密活动描述为输入和输出之间的多元方程组,并且通过求解低次超定(方程个数比未知元个数多)或稀疏方程组来恢复密钥,所需要的数据非常少,虽然代数攻击对Rijndael算法还没有可行的攻击实例,但S盒超定稀疏方程的存在已经成为Rijndael的威胁,随着解低次多元方程组有效算法-XL算法,代数攻击采用将MQ问题转化为SAT问题求解的算法可以破解6轮DES(仅使用了一个已知明文),下面介绍一下RijndaelS盒的超定方程。上面讲到S盒是由GF( 2 8 2^8 28)下的求乘法逆的运算和GF(2)的域下的仿射变换再加常量‘63’两个步骤完成。对每个字节在其有限域中的乘法逆元,‘00’映射到本身,当不是0时,如果x的逆是 ω \omega ω x = ω − 1 = ω 254 x=\omega ^{-1}=\omega ^{254} x=ω1=ω254,S盒的定义如下:
    在这里插入图片描述
    在这里插入图片描述
    其中y是输入字节x的逆元,因此 y = x 254 y=x^{254} y=x254 z = f ( y ) = f ( x 254 ) z=f(y)=f(x^{254}) z=f(y)=f(x254),上述公式变为:
    在这里插入图片描述
    根据z和y的关系,我们可以得到:
    在这里插入图片描述
    因为xy=1,所以 ( x 7 X 7 + x 6 X 6 x 5 X 5 + x 4 X 4 + x 3 X 3 + x 2 X 2 + x 1 X + x 0 ) ( y 7 Y 7 + y 6 Y 6 + y 5 Y 5 + y 4 Y 4 + y 3 Y 3 + y 2 Y 2 + y 1 Y + y 0 ) = 1 (x_{7}X^{7}+x_{6}X^{6}x_{5}X^{5}+x_{4}X^{4}+x_{3}X^{3}+x_{2}X^{2}+x_{1}X+x_{0})(y_{7}Y^{7}+y_{6}Y^{6}+y_{5}Y^{5}+y_{4}Y^{4}+y_{3}Y^{3}+y_{2}Y^{2}+y_{1}Y+y_{0})=1 (x7X7+x6X6x5X5+x4X4+x3X3+x2X2+x1X+x0)(y7Y7+y6Y6+y5Y5+y4Y4+y3Y3+y2Y2+y1Y+y0)=1,可以通过这个公式得到八个公式,其中七个公式没有常数项,一个公式是1(概率是 255 256 \frac{255}{256} 256255),因为当X所有的系数为0时,不可能得到结果为1的等式。下面将上面y和z的关系等式带入到这八个公式,得到八个输入字节和输出字节之间的等式,如下图:在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这两个方程会生成概率为1的16个方程,这样S盒就会得到23个以概率1成立的双仿射方程,在这23个方程中涉及到的变量时81个,若考虑以下两个平方方程,那么就会得到16个仿射方程,此时方程总数39,涉及的分量是137:
    在这里插入图片描述
    因此,对于Rijndael-128,如果用S盒的全部二次方程r=40,t=137,那么需要总的方程数M是8000,有N=1600个变量,如果用r=24,t=81,那么需要的方程数M是3880,N=1600。代数攻击也许是为了AES而提出来的,为了抵御线性分析和差分分析,AES的轮数设计的非常少,按说代数攻击应该给出更好的攻击效果,但是方程组容易得到,却是非常难解的,解非线性多元方程组的问题通常是NP难的。现在解方程一个比较著名的方法是XSL方法(由XL方法得来的),XL算法的提出和不断改进,带动了代数攻击的蓬勃发展。
    3、侧信道攻击
    自从AES发布以来,各种结果表明AES和其他密码系统一样容易受到侧信道密码分析的影响,针对加密电子设备在运行过程中的时间消耗、功率消耗或电磁辐射之类的侧信道信息泄露而对加密设备进行攻击的方法被称为侧信道攻击,侧信道攻击分为SPA-简单功耗分析和DPA-差分功耗分析,这类新型攻击的有效性远高于密码分析的数学方法,因此给密码设备带来了严重的威胁。
    六、 结束语
    展望未来,AES倡议背后的目的是与21世纪的单一分组密码达成一致;AES提供了至少与三重DES(两个密钥)相同的安全性,但在软件方面AES的性能要好得多。此外,对于AES,向DES或三重-DES移动时,我们需要考虑分组和密钥大小的差异。当然,大多数新应用程序将使用AES。然而,与旧应用程序的互操作性可能需要继续使用其他密码,尤其三重DES使用居多。
    如果大家想学习更多关于AES的内容,可以参考这本书:The design of rijndael, AES—the advanced encryption standard

    展开全文
  • #region AES加密 /// <summary> /// AES加密 /// </summary> /// <param name="source"></param> /// <param name="key">密钥</param> /// <param name="iv">初始向量&...
  • AES_AES加密_AES_源码

    2021-10-01 15:11:22
    AES加密的C语言实现
  • AES加密过程详解

    万次阅读 多人点赞 2018-07-03 16:55:58
    AES算法流程: AES加密过程涉及到4种操作,分别是字节替代、行移位、列混淆和轮密钥加。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由...

    AES算法流程

    AES加密过程涉及到 4 种操作,分别是字节替代行移位列混淆轮密钥加。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。算法中 16 个字节的明文、密文和轮密钥都以一个 4x4 的矩阵表示。 

    注意:前9次的加密过程是一样的,而最后一次的加密过程是没有列混淆的。

     

    1.字节替换:字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。

    例如:字节66替换后的值为S[6][6]=33,再通过S-1即可得到替换前的值,S-1[3][3]=66。

     

    2.行移位:行移位的功能是实现一个4x4矩阵内部字节之间的置换。

    移位的操作是:第一行保存不变,第二行循环左移1个字节,第三行循环左移2个字节,第四行循环左移3个字节。

     

    3.列混淆:

    根据矩阵的乘法可知,在列混淆(利用域GF(28)上的算术特性的一个代替)的过程中,每个字节对应的值只与该列的4个值有关系。此处的乘法和加法需要注意如下几点:

    (1)将某个字节所对应的值乘以2,其结果就是将该值的二进制位左移一位,如果该值的最高位为1(表示该数值不小于128),则还需要将移位后的结果异或00011011

    (2)乘法对加法满足分配率,例如:07·S0,0=(01⊕02⊕04)·S0,0= S0,0⊕(02·S0,0)(04·S0,0)

    (3)此处的矩阵乘法与一般意义上矩阵的乘法有所不同,各个值在相加时使用的是模2加法(异或运算)。

        因为:说明两个矩阵互逆,经过一次逆向列混淆后即可恢复原文。

     

    4.轮密钥加:加密过程中,每轮的输入与轮密钥异或一次(当前分组和扩展密钥的一部分进行按位异或);因为二进制数连续异或一个数结果是不变的,所以在解密时再异或上该轮的密钥即可恢复输入。首尾使用轮密钥加的理由:若将其他不需要密钥的阶段放在首尾,在不用密钥的情况下就能完成逆过程,这就降低了算法的安全性。

    加密原理:轮密钥加本身不难被破解,另外三个阶段分别提供了混淆和非线性功能。可是字节替换、行移位、列混淆阶段没有涉及密钥,就它们自身而言,并没有提供算法的安全性。但该算法经历一个分组的异或加密(轮密钥加),再对该分组混淆扩散(其他三个阶段),再接着又是异或加密,如此交替进行,这种方式非常有效、非常安全。

     

    5.密钥扩展:其复杂性是确保算法安全性的重要部分。当分组长度和密钥长度都是128位时,AES的加密算法共迭代10轮,需要10个子密钥。AES的密钥扩展的目的是将输入的128位密钥扩展成11个128位的子密钥。AES的密钥扩展算法是以字为一个基本单位(一个字为4个字节),刚好是密钥矩阵的一列。因此4个字(128位)密钥需要扩展成11个子密钥,共44个字。

    密钥扩展过程说明:将初始密钥以列为主,转化为4个32 bits的字,分别记为w[0…3];按照如下方式,依次求解w[i],其中i是整数并且属于[4,43]。

    1)将w[i]循环左移一个字节。

    2)分别对每个字节按S盒进行映射。

     

    3)32 bits的常量(RC[i/4],0,0,0)进行异或,RC是一个一维数组,其中RC = {01, 02, 04, 08, 10, 20, 40, 80, 1B, 36}。

    4)除了轮密钥的第一列使用上述方法,之后的二到四列都是w[i]=w[i-4]⊕w[i-1]

     5)最终得到的第一个扩展密钥为(之后的每一轮密钥都是在前一轮的基础上按照上述方法得到的):

    展开全文
  • AES_AES.zip

    2021-10-11 23:45:21
    AES_AES.zip
  • AES_AES加密_源码

    2021-09-29 09:34:36
    AES 加密
  • 实现aes加密,完成基本功能,做学习资料
  • AES_51aes_AES加密_源码

    2021-09-29 13:00:12
    51单片机上可用,aes适当的修改后,减少运算占用RAM
  • AES_AES_源码

    2021-10-02 04:06:42
    通过verilog来实现aes算法的加密和解密
  • aes_AES_源码

    2021-09-29 14:03:54
    用C实现的关于密码学编程的AES算法,自有有效
  • AES128_ECB模式驱动,STM32F103单片机测试
  • 使用c语言实现信息安全中的常见的AES算法
  • AES 加密算法的原理详解

    万次阅读 多人点赞 2018-07-23 22:18:49
    高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图: 下面简单介绍下各个部分的....

    本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分。

    AES简介

    高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图: 
    加密流程图
    下面简单介绍下各个部分的作用与意义:

    • 明文P

      没有经过加密的数据。

    • 密钥K

      用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。

    • AES加密函数

      设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。

    • 密文C

      经加密函数处理后的数据

    • AES解密函数

      设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。

    在这里简单介绍下对称加密算法与非对称加密算法的区别。

    • 对称加密算法

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

    • 非对称加密算法

      加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。

    实际中,一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。

    本文下面AES原理的介绍参考自《现代密码学教程》,AES的实现在介绍完原理后开始。

    AES的基本结构

    AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

    AES密钥长度(32位比特字)分组长度(32位比特字)加密轮数
    AES-1284410
    AES-1926412
    AES-2568414

    轮数在下面介绍,这里实现的是AES-128,也就是密钥的长度为128位,加密轮数为10轮。 
    上面说到,AES的加密公式为C = E(K,P),在加密函数E中,会执行一个轮函数,并且执行10次这个轮函数,这个轮函数的前9次执行的操作是一样的,只有第10次有所不同。也就是说,一个明文分组会被加密10轮。AES的核心就是实现一轮中的所有操作。

    AES的处理单位是字节,128位的输入明文分组P和输入密钥K都被分成16个字节,分别记为P = P0 P1 … P15 和 K = K0 K1 … K15。如,明文分组为P = abcdefghijklmnop,其中的字符a对应P0,p对应P15。一般地,明文分组用字节为单位的正方形矩阵描述,称为状态矩阵。在算法的每一轮中,状态矩阵的内容不断发生变化,最后的结果作为密文输出。该矩阵中字节的排列顺序为从上到下、从左至右依次排列,如下图所示: 
    state

    现在假设明文分组P为”abcdefghijklmnop”,则对应上面生成的状态矩阵图如下: 
    state2
    上图中,0x61为字符a的十六进制表示。可以看到,明文经过AES加密后,已经面目全非。

    类似地,128位密钥也是用字节为单位的矩阵表示,矩阵的每一列被称为1个32位比特字。通过密钥编排函数该密钥矩阵被扩展成一个44个字组成的序列W[0],W[1], … ,W[43],该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,用于加密运算中的初始密钥加(下面介绍);后面40个字分为10组,每组4个字(128比特)分别用于10轮加密运算中的轮密钥加,如下图所示: 
    keystate
    上图中,设K = “abcdefghijklmnop”,则K0 = a, K15 = p, W[0] = K0 K1 K2 K3 = “abcd”。

    AES的整体结构如下图所示,其中的W[0,3]是指W[0]、W[1]、W[2]和W[3]串联组成的128位密钥。加密的第1轮到第9轮的轮函数一样,包括4个操作:字节代换、行位移、列混合和轮密钥加。最后一轮迭代不执行列混合。另外,在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作。 
    aes_struct
    上图也展示了AES解密过程,解密过程仍为10轮,每一轮的操作是加密操作的逆操作。由于AES的4个轮操作都是可逆的,因此,解密操作的一轮就是顺序执行逆行移位、逆字节代换、轮密钥加和逆列混合。同加密操作类似,最后一轮不执行逆列混合,在第1轮解密之前,要执行1次密钥加操作。

    下面分别介绍AES中一轮的4个操作阶段,这4分操作阶段使输入位得到充分的混淆。

    一、字节代换

    1.字节代换操作

    AES的字节代换其实就是一个简单的查表操作。AES定义了一个S盒和一个逆S盒。 
    AES的S盒:

    行/列0123456789ABCDEF
    00x630x7c0x770x7b0xf20x6b0x6f0xc50x300x010x670x2b0xfe0xd70xab0x76
    10xca0x820xc90x7d0xfa0x590x470xf00xad0xd40xa20xaf0x9c0xa40x720xc0
    20xb70xfd0x930x260x360x3f0xf70xcc0x340xa50xe50xf10x710xd80x310x15
    30x040xc70x230xc30x180x960x050x9a0x070x120x800xe20xeb0x270xb20x75
    40x090x830x2c0x1a0x1b0x6e0x5a0xa00x520x3b0xd60xb30x290xe30x2f0x84
    50x530xd10x000xed0x200xfc0xb10x5b0x6a0xcb0xbe0x390x4a0x4c0x580xcf
    60xd00xef0xaa0xfb0x430x4d0x330x850x450xf90x020x7f0x500x3c0x9f0xa8
    70x510xa30x400x8f0x920x9d0x380xf50xbc0xb60xda0x210x100xff0xf30xd2
    80xcd0x0c0x130xec0x5f0x970x440x170xc40xa70x7e0x3d0x640x5d0x190x73
    90x600x810x4f0xdc0x220x2a0x900x880x460xee0xb80x140xde0x5e0x0b0xdb
    A0xe00x320x3a0x0a0x490x060x240x5c0xc20xd30xac0x620x910x950xe40x79
    B0xe70xc80x370x6d0x8d0xd50x4e0xa90x6c0x560xf40xea0x650x7a0xae0x08
    C0xba0x780x250x2e0x1c0xa60xb40xc60xe80xdd0x740x1f0x4b0xbd0x8b0x8a
    D0x700x3e0xb50x660x480x030xf60x0e0x610x350x570xb90x860xc10x1d0x9e
    E0xe10xf80x980x110x690xd90x8e0x940x9b0x1e0x870xe90xce0x550x280xdf
    F0x8c0xa10x890x0d0xbf0xe60x420x680x410x990x2d0x0f0xb00x540xbb0x16

    状态矩阵中的元素按照下面的方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出。例如,加密时,输出的字节S1为0x12,则查S盒的第0x01行和0x02列,得到值0xc9,然后替换S1原有的0x12为0xc9。状态矩阵经字节代换后的图如下: 
    (第二个字符0xAB查表后应该是转换成0x62的,感谢细心的朋友指出,有空再重新画图更正了) 
    byte

    2.字节代换逆操作

    逆字节代换也就是查逆S盒来变换,逆S盒如下:

    行/列0123456789ABCDEF
    00x520x090x6a0xd50x300x360xa50x380xbf0x400xa30x9e0x810xf30xd70xfb
    10x7c0xe30x390x820x9b0x2f0xff0x870x340x8e0x430x440xc40xde0xe90xcb
    20x540x7b0x940x320xa60xc20x230x3d0xee0x4c0x950x0b0x420xfa0xc30x4e
    30x080x2e0xa10x660x280xd90x240xb20x760x5b0xa20x490x6d0x8b0xd10x25
    40x720xf80xf60x640x860x680x980x160xd40xa40x5c0xcc0x5d0x650xb60x92
    50x6c0x700x480x500xfd0xed0xb90xda0x5e0x150x460x570xa70x8d0x9d0x84
    60x900xd80xab0x000x8c0xbc0xd30x0a0xf70xe40x580x050xb80xb30x450x06
    70xd00x2c0x1e0x8f0xca0x3f0x0f0x020xc10xaf0xbd0x030x010x130x8a0x6b
    80x3a0x910x110x410x4f0x670xdc0xea0x970xf20xcf0xce0xf00xb40xe60x73
    90x960xac0x740x220xe70xad0x350x850xe20xf90x370xe80x1c0x750xdf0x6e
    A0x470xf10x1a0x710x1d0x290xc50x890x6f0xb70x620x0e0xaa0x180xbe0x1b
    B0xfc0x560x3e0x4b0xc60xd20x790x200x9a0xdb0xc00xfe0x780xcd0x5a0xf4
    C0x1f0xdd0xa80x330x880x070xc70x310xb10x120x100x590x270x800xec0x5f
    D0x600x510x7f0xa90x190xb50x4a0x0d0x2d0xe50x7a0x9f0x930xc90x9c0xef
    E0xa00xe00x3b0x4d0xae0x2a0xf50xb00xc80xeb0xbb0x3c0x830x530x990x61
    F0x170x2b0x040x7e0xba0x770xd60x260xe10x690x140x630x550x210x0c0x7d

    二、行移位

    1.行移位操作

    行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节,如下图所示: 
    shiftRows

    2.行移位的逆变换

    行移位的逆变换是将状态矩阵中的每一行执行相反的移位操作,例如AES-128中,状态矩阵的第0行右移0字节,第1行右移1字节,第2行右移2字节,第3行右移3字节。

    三、列混合

    1.列混合操作

    列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图的公式所示: 
    col

    状态矩阵中的第j列(0 ≤j≤3)的列混合可以表示为下图所示: 
    col2

    其中,矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算,并不是通常意义上的乘法和加法。这里涉及到一些信息安全上的数学知识,不过不懂这些知识也行。其实这种二元运算的加法等价于两个字节的异或,乘法则复杂一点。对于一个8位的二进制数来说,使用域上的乘法乘以(00000010)等价于左移1位(低位补0)后,再根据情况同(00011011)进行异或运算,设S1 = (a7 a6 a5 a4 a3 a2 a1 a0),刚0x02 * S1如下图所示: 
    col3 
    也就是说,如果a7为1,则进行异或运算,否则不进行。 
    类似地,乘以(00000100)可以拆分成两次乘以(00000010)的运算: 
    col4 
    乘以(0000 0011)可以拆分成先分别乘以(0000 0001)和(0000 0010),再将两个乘积异或: 
    col5
    因此,我们只需要实现乘以2的函数,其他数值的乘法都可以通过组合来实现。 
    下面举个具体的例子,输入的状态矩阵如下:

        
    C9E5FD2B
    7AF2786E
    639C2667
    B0A782E5

    下面,进行列混合运算: 
    以第一列的运算为例: 
    col7 
    其它列的计算就不列举了,列混合后生成的新状态矩阵如下:

        
    D4E7CD66
    2802E5BB
    BEC6D6BF
    220FDFA5

    2.列混合逆运算

    逆向列混合变换可由下图的矩阵乘法定义: 
    col6 
    可以验证,逆变换矩阵同正变换矩阵的乘积恰好为单位矩阵。

    四、轮密钥加

    轮密钥加是将128位轮密钥Ki同状态矩阵中的数据进行逐位异或操作,如下图所示。其中,密钥Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]为32位比特字,包含4个字节,他们的生成算法下面在下面介绍。轮密钥加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3 组成的32位字与W[4i]的异或运算。 
    roundadd
    轮密钥加的逆运算同正向的轮密钥加运算完全一致,这是因为异或的逆操作是其自身。轮密钥加非常简单,但却能够影响S数组中的每一位。

    密钥扩展

    AES首先将初始密钥输入到一个4*4的状态矩阵中,如下图所示。 
    keyextends
    这个4*4矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为W[0]、W[1]、W[2]和W[3],它们构成一个以字为单位的数组W。例如,设密钥K为”abcdefghijklmnop”,则K0 = ‘a’,K1 = ‘b’, K2 = ‘c’,K3 = ‘d’,W[0] = “abcd”。 
    接着,对W数组扩充40个新列,构成总共44列的扩展密钥数组。新列以如下的递归方式产生: 
    1.如果i不是4的倍数,那么第i列由如下等式确定: 
    W[i]=W[i-4]⨁W[i-1] 
    2.如果i是4的倍数,那么第i列由如下等式确定: 
    W[i]=W[i-4]⨁T(W[i-1]) 
    其中,T是一个有点复杂的函数。 
    函数T由3部分组成:字循环、字节代换和轮常量异或,这3部分的作用分别如下。 
    a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。 
    b.字节代换:对字循环的结果使用S盒进行字节代换。 
    c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。 
    轮常量Rcon[j]是一个字,其值见下表。

    j12345
    Rcon[j]01 00 00 0002 00 00 0004 00 00 0008 00 00 0010 00 00 00
    j678910
    Rcon[j]20 00 00 0040 00 00 0080 00 00 001B 00 00 0036 00 00 00

    下面举个例子: 
    设初始的128位密钥为: 
    3C A1 0B 21 57 F0 19 16 90 2E 13 80 AC C1 07 BD 
    那么4个初始值为: 
    W[0] = 3C A1 0B 21 
    W[1] = 57 F0 19 16 
    W[2] = 90 2E 13 80 
    W[3] = AC C1 07 BD 
    下面求扩展的第1轮的子密钥(W[4],W[5],W[6],W[7])。 
    由于4是4的倍数,所以: 
    W[4] = W[0] ⨁ T(W[3]) 
    T(W[3])的计算步骤如下: 
    1. 循环地将W[3]的元素移位:AC C1 07 BD变成C1 07 BD AC; 
    2. 将 C1 07 BD AC 作为S盒的输入,输出为78 C5 7A 91; 
    3. 将78 C5 7A 91与第一轮轮常量Rcon[1]进行异或运算,将得到79 C5 7A 91,因此,T(W[3])=79 C5 7A 91,故 
    W[4] = 3C A1 0B 21 ⨁ 79 C5 7A 91 = 45 64 71 B0 
    其余的3个子密钥段的计算如下: 
    W[5] = W[1] ⨁ W[4] = 57 F0 19 16 ⨁ 45 64 71 B0 = 12 94 68 A6 
    W[6] = W[2] ⨁ W[5] =90 2E 13 80 ⨁ 12 94 68 A6 = 82 BA 7B 26 
    W[7] = W[3] ⨁ W[6] = AC C1 07 BD ⨁ 82 BA 7B 26 = 2E 7B 7C 9B 
    所以,第一轮的密钥为 45 64 71 B0 12 94 68 A6 82 BA 7B 26 2E 7B 7C 9B。

    AES解密

    在文章开始的图中,有AES解密的流程图,可以对应那个流程图来进行解密。下面介绍的是另一种等价的解密模式,流程图如下图所示。这种等价的解密模式使得解密过程各个变换的使用顺序同加密过程的顺序一致,只是用逆变换取代原来的变换。 
    deaes

    AES原理到这里就结束了。实际开发中都是直接使用第三方已经封装好的库,这时候就需要根据使用的编程语言直接加载第三方库,来实现。所以省去了原文的C的代码实现部分,愿意深度了解代码实现的请移步到文章开头标明的原文出处。

    个人博客里面也有如何用 Java、JavaScript(含两者的跨语言加密解密) 去实现的文章,感兴趣的可以在我的个人博客里面找一下。

    其他加密算法相关参考:

    RSA 加密算法原理简述:https://blog.csdn.net/gulang03/article/details/81176133

    Java 实现 AES 和 RSA 算法:https://blog.csdn.net/gulang03/article/details/81771341

    JS 与 JAVA 跨语言实现 RSA 和 AES 加密算法:https://blog.csdn.net/gulang03/article/details/82230408

    展开全文
  • AES_AES算法_源码

    2021-10-03 13:17:15
    实现AES加解密算法
  • AES加解密算法c语言实现,及测试代码,说明等文档
  • AES加密解密的基本原理与Python爬取AES加密接口

    万次阅读 多人点赞 2021-06-30 15:08:39
    大家好,我是小小明,今天我要带大家学习AES加密的基本原理,并爬取一个经过AES加密的接口。一起来学习吧! AES编码解码基础 AES简介 AES(Advanced Encryption Standard)是取代其前任标准(DES)而成为新标准的一种...

    大家好,我是小小明,今天我要带大家学习AES加密的基本原理,并爬取一个经过AES加密的接口。一起来学习吧!

    AES编码解码基础

    AES简介

    AES(Advanced Encryption Standard)是取代其前任标准(DES)而成为新标准的一种对称加密算法
    DES因为应用时间较早,密文已经可以在短时间内被破译,所以现在已经基本不再使用。

    被选定为AES的Rijndael算法

    全世界的企业和密码学家提交了多个对称密码算法作为AES的候选,最终在2000年从这些候选算法中选出了一种名为 Rijndael的对称密码算法,并将其确定为了AES。

    Rijndael分组密码算法,会多次重复以下4个步骤:SubBytesShiftRowsMixColumnsAddRoundkey

    1. SubBytes:将每一组16字节的明文数据以每个字节的值(0-255)为索引,从一张拥有256个值得表中查找对应值进行替换(类似Base64的查表替换)。
    2. ShiftRows:将以4字节为单位的行按照一定的规则向左平移,且每一行平移的字节数不同。
    3. MixColumns:对一个4字节的值进行位运算,将其变为另一个4字节的值。
    4. AddRoundkey:将MixColumns的输出与轮密钥进行xor异或。

    Rijndael的分组长度和密钥长度可以分别以32比特为单位在128比特到256比特的范围内进行选择。不过在AES的规格中,分组长度固定为128比特,密钥长度只有128、192和256比特三种。

    流密码与分组密码

    对数据流进行连续处理的密码算法称为流密码,流密码一般以1bit、8bit、32bit等单位进行加密解密运算。
    流密码需要对一串数据进行连续处理,因此需要保持内部状态。

    分组密码则每次只处理特定长度的一块数据,一个分组的比特数(bit)就称为 分组长度。DES、AES等多数对称加密算法都属于分组密码。

    AES的分组长度是128bit(16字节),因此一次可以加密128bit的明文,并生成128bit的密文。每次处理完一个分组就结束了,不需要通过内部状态来记录加密的进度。

    分组密码算法只能加密固定长度的分组数据,对于一段很长的明文,需要不断迭代出固定的长度进行加密;对于最后不够固定长度的明文需要补齐至固定长度,最终全部加密。

    AES常用的分组模式有:

    • ECB模式:Electronic CodeBook mode(电子密码本模式)
    • CBC模式:Cipher Block Chaining mode(密码分组链接模式)
    • CFB模式:Cipher FeedBack mode(密文反馈模式)
    • OFB模式:Output FeedBack mode(输出反馈模式)
    • CTR模式:Counter mode(计数器模式)

    目前笔者只见过ECBCBC两种密码模式,下来针对这两种模式介绍:

    ECB模式

    ECB模式的全称是 Electronic CodeBook mode(电子密码本模式)。在ECB模式中,将明文分组加密之后的结果将直接成为密文分组。

    加密:

    image-20210630102059605

    解密:

    image-20210630102217830

    使用ECB模式加密时,相同的明文分组会被转换为相同的密文分组。可以理解为是一个巨大的“明文分组→密文分组”的对应表,因此ECB模式也称为电子密码本模式

    当最后一个明文分组的内容小于分组长度时,需要用一些特定的数据进行填充( padding)。

    注意:ECB模式最简单的一种模式,明文分组与密文分组是一一对应的关系,只要观察一下密文,就可以知道明文中存在怎样的重复组合,并可以以此为线索来破译密码,因此ECB模式安全性也是最低的。

    CBC模式

    CBC模式的全称是Cipher Block Chaining(密文分组链接)模式,因为密文分组是像链条一样相互连接在一起的。

    在CBC模式中,首先将密文分组与前一个密文分组进行XOR运算,然后再进行加密。

    当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个(长度为一个分组的随机数据)来代替“前一个密文分组”,这个随机数据就称为:初始化向量(IV)

    加密:

    image-20210630102909771

    解密:

    image-20210630102928856

    CBC模式明文分组在加密之前一定会与“前一个密文分组”进行XOR运算,因此即便明文分组1和2的值是相等的,密文分组1和2的值也是不相等的。ECB模式的缺陷也就不存在了。

    参考:《图解密码技术》

    AES支持的填充方式

    前面说到当最后一个明文分组的内容小于分组长度时,需要用一些特定的数据进行填充( padding)。

    AES支持支持的填充方式:

    • NoPadding
    • ISO10126Padding
    • Zeros
    • PKCS7

    简单介绍一下:

    NoPadding:表示不填充。

    ISO10126Padding:填充字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据。

    示例(块长度为 8,数据长度为 9):

    数据: FF FF FF FF FF FF FF FF FF

    ISO10126 填充: FF FF FF FF FF FF FF FF FF 7D 2A 75 EF F8 EF 07

    Zeros : 填充字符串由设置为零的字节组成。

    PKCS7 :填充字节序列,每个字节填充该字节序列的长度。

    示例(块长度为 8,数据长度为 9):

    数据: FF FF FF FF FF FF FF FF FF

    ISO10126 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

    PKCS5与PKCS7的区别

    在PKCS5Padding中,明确定义Block的大小是8位,而在PKCS7Padding定义中,对于块的大小可以在1-255之间,填充值的算法都是一样的。PKCS7填充方式在设定块长度为 8时,与 PKCS5 填充方式等价。

    Python爬取ECB加密数据示例

    这次我们爬取的网站是:https://www.qkl123.com/data/market-ratio/

    目的是抓取比特币市值占比数据:

    image-20210630115826283

    接口地址https://gate.8btc.com/w1/home/head_pair

    发现一个需要校验的加密字段,现在我们需要对它进行JS逆向分析:

    image-20210630115947722

    根据参数名secretKeyVersion我们可以尝试全局搜索。

    控制台全局搜索快捷键是:Ctrl+ Shift+ F

    image-20210630134203035

    由于并没有做很复杂的JavaScript混淆,直接搜索到了对应的加密代码。对于这种json数据,一般搜索JSON.stringify都能找到相应的加密入口。

    下面我们为sign打上断点,游览器一步步跟踪。

    image-20210630134727019

    仅仅进入第一层,我们已经清楚了加密算法是AES,采用ECB模式,Pkcs7填充方式,密钥是WTAHAPPYACTIVITY。

    被加密的文本包含appId、timestamp和serverCode三个参数。

    理解这些我们就可以开始编码了,首先获取参数e:

    import json
    import time
    
    e = json.dumps({"appId": "1", "timestamp": str(
        int(time.time())), "serverCode": "0"}, separators=(',', ':'))
    e
    
    '{"appId":"1","timestamp":"1625033091","serverCode":"0"}'
    

    加密后tostring方法通过简单的追踪未找到具体的实现,但根据最终结果可以推测是经过了base64加密,于是对上面的json参数加密并base64编码再进行相应的文本替换:

    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad
    
    text_pad = pad(e.encode('utf-8'), AES.block_size, style='pkcs7')
    key = b'WTAHAPPYACTIVITY'
    aes = AES.new(key, AES.MODE_ECB)
    text = base64.encodebytes(aes.encrypt(text_pad)).decode('utf-8')
    text.replace("/", "_").replace("+", "-")
    
    'gDt1nQ3Ay458FG_Xj-Aum4u82nFPsLr55DMo8rUM2gslpKNcGY8DuHqxHUQB1nzxTWeDNrlOJiri\nmPSo2PO0DQ==\n'
    

    结果形式已经与前端的参数大致一致,但多了\n换行符。虽然不清楚具体机制,我们继续把它替换掉即可,最终代码为:

    import requests
    import json
    import base64
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad
    import time
    import pandas as pd
    
    
    def encrypt(text):
        key = b'WTAHAPPYACTIVITY'
        aes = AES.new(key, AES.MODE_ECB)
        text_pad = pad(text.encode('utf-8'), AES.block_size, style='pkcs7')
        encrypt_aes = aes.encrypt(text_pad)
        encrypted_text = base64.encodebytes(encrypt_aes).decode('utf-8')
        return encrypted_text.replace("\n", "").replace("/", "_").replace("+", "-")
    
    
    def get_param():
        return json.dumps({"appId": "1", "timestamp": str(
            int(time.time())), "serverCode": "0"}, separators=(',', ':'))
    
    
    text = get_param()
    print(text)
    print(encrypt(text))
    
    {"appId":"1","timestamp":"1625034433","serverCode":"0"}
    gDt1nQ3Ay458FG_Xj-Aum4u82nFPsLr55DMo8rUM2gu7NrP6hBq4jYMFqd9lgylaTWeDNrlOJirimPSo2PO0DQ==
    

    然后我们就可以直接爬取接口的数据了:

    header = {
        "Accept-Encoding": "gzip",
        "Authorization": "",
        "Source-Site": "qkl123",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
    }
    
    sign = encrypt(get_param())
    header["Authorization"] = json.dumps({"secretKeyVersion": 1, "sign": sign})
    r = requests.get("https://gate.8btc.com/w1/home/head_pair", headers=header)
    df = pd.DataFrame(r.json()['pairs'])
    df
    

    image-20210630143729720

    可以看到已经成功的抓取到了相应的数据。

    对于pair_ext_info那列可以使用字典分列,扩展到当前表中:

    df = pd.concat([df.drop(columns="pair_ext_info"),
                   pd.json_normalize(df.pair_ext_info)], axis=1)
    
    展开全文
  • AES128加密解密源码
  • 自己用verilog写的AES加密,写的不是很好,仅供参考
  • AES_aes加密实现_源码

    2021-10-01 08:40:52
    实现加解密操作,实现基本的aes加解密操作,采用C语言实现aes方式的加解密
  • AES256/128 纯软件加解密时间效率测试–以Cortex-M0与M3 MCU为例 一、测试环境与方法 二、测试代码介绍(以AES256为例) 三、测试结果与抓包截图 AES软件源码库(C语言),包含全部CBC/CTR等模式,见链接: ...
  • AES128加密算法完整实现

    万次阅读 多人点赞 2019-02-26 22:38:02
    原本想把自己AES加密算法的整个实现过程给详细复述下来,分享给想学习的同学,也方便自己复习,但后来发现该工作量太大,加上作业太多没有过多的时间去写。所以就想把自己在学习的过程中多遇到的好的文章进行汇总,...
  • 使用C语言实现信息安全中常见的加密算法AES_ECB
  • Aes_delphi_AES.zip

    2021-10-11 23:23:18
    Aes_delphi_AES.zip
  • AES_AES_源码.zip

    2021-09-30 18:16:56
    AES_AES_源码.zip
  • aes java源码AES AES加密过程的Java源代码和新的加密算法KIASU。 仅用于加密
  • 一个基于aes256进行文件解密的工具,仅仅作为练手使用,请勿直接下载
  • 128位数据串的AES加密,实现平台为MATALB,加密和解密都在里面。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 121,822
精华内容 48,728
关键字:

Aes