加密算法(DES\RSA\SHA\ELGAMAL)

DES算法

  • 1.DES算法的介绍

DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。

  • 2.DES算法的基本原理

其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性

  • 3.DES算法实现的主要流程

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下

在这里插入图片描述

置换规则表 其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则见下表:

58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,

62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,

57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,

61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,

即将输入的第58位换到第一位,第50位换到第2位,…,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0
是右32位,例:设置换前的输入值为D1D2D3…D64,则经过初始置换后的结果为:L0=D58D50…D8;R0=D57D49…D7。

经过16次迭代运算后。得到L16、R16,将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置换的逆运算。例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位,其逆置换规则如下表所示:

40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,

38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,

36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,

34,2,42,10,50,18,58 26,33,1,41,9,49,17,57,25,

放大换位表 32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,

12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,

22,23,24,25,24,25,26,27,28,29,28,29,30,31,32,1,

单纯换位表 16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,

2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25,

功能表
在f(Ri,Ki)算法描述图中,S1,S2…S8为选择函数,其功能是把48bit数据变为32bit数据。下面给出选择函数Si(i=1,2…8)的功能表:

选择函数Si

S1:

14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,

0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,

4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,

15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,

S2:

15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,

3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,

0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,

13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,

S3:

10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,

13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,

13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,

1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,

S4:

7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,

13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,

10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,

3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,

S5:

2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,

14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,

4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,

11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,

S6:

12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,

10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,

9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,

4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,

S7:

4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,

13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,

1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,

6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,

S8:

13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,

1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,

7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,

2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,

在此以S1为例说明其功能,我们可以看到:在S1中,共有4行数据,命名为0,1、2、3行;每行有16列,命名为0、1、2、3,…,14、15列。

现设输入为:D=D1D2D3D4D5D6

令:列=D2D3D4D5

行=D1D6

然后在S1表中查得对应的数,以4位二进制表示,此即为选择函数S1的输出。下面给出子密钥Ki(48bit)的生成算法

子密钥的生成算法
从子密钥Ki的生成算法描述图中我们可以看到:初始Key值为64位,但DES算法规定,其中第8、16、…64位是奇偶校验位,不参与DES运算。故Key
实际可用位数便只有56位。即:经过缩小选择换位表1的变换后,Key 的位数由64
位变成了56位,此56位分为C0、D0两部分,各28位,然后分别进行第1次循环左移,得到C1、D1,将C1(28位)、D1(28位)合并得到56位,再经过缩小选择换位2,从而便得到了密钥K0(48位)。依此类推,便可得到K1、K2、…、K15,不过需要注意的是,16次循环左移对应的左移位数要依据下述规则进行:

循环左移位数 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1

以上介绍了DES算法的加密过程。DES算法的解密过程是一样的,区别仅仅在于第一次迭代时用子密钥K15,第二次K14、…,最后一次用K0,算法本身并没有任何变化。

ELGAMAL算法

  • 算法原理:

ElGamal算法,是一种较为常见的加密算法,它是基于1985年提出的公钥密码体制和椭圆曲线加密体系。既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。在加密过程中,生成的密文长度是明文的两倍,且每次加密后都会在密文中生成一个随机数K,在密码中主要应用离散对数问题的几个性质:求解离散对数(可能)是困难的,而其逆运算指数运算可以应用平方-乘的方法有效地计算。

  • 算法内容:

1984年,ElGamal提出了一种基于离散对数的公开密钥体制,他的密钥产生基于一个公开的素数,利用离散对数计算上的困难性保证安全。
首先是生成密钥对的过程:
(1) 随机生成整数X,使得1 < X < q - 1(q 是用户共同选择的素数)
(2) 计算 Y = aX mod q (a 是素数q的本原根)
(3) A 的私钥是X,公钥是{q , a , Y}
其他的用户可以通过上面的公钥加密信息:
(1)将信息表示为一个整数M,其中1 <= M <= q - 1,以分组密码序列的方式来发送消息
(2)选择任意整数k,使得1 <= k <= q - 1
(3)计算一次密钥K = (Y)k mod q
(4) 将M加密成明文对(C1,C2),其中C1 = a k mod q;C2 = KM mod q
知道私钥就可以恢复明文:
(1)计算密钥K = (C1)X mod q 恢复密钥
(2)计算M = (C2K-1) mod q
具体步骤:
(1) 素数判断: int mpz_probab_prime_p (mpz_t n, int reps)判断 n 是否为素数,若 n 确定是素数则返回 2,如果 n 是概率素数 (不能完全确定) 那么返回 1,或者如果 n 确定是合数那么返回 0。这个函数首先做一些试除,然后再作 Miller-Rabin 概率素性判别。reps 控制这样的判别做多少次,5 到 10 是较合理的数值,更多次的判别可以减小合数被返回为概率素数的可能。调用 Miller-Rabin 判别和其他相似的判别组成的复合判别可能更为合理。判别失败的数可以知道是合数,但是通过判别的数可以是素数也可能是合数。只有极少数的合数可以通过判别,因此通过判别的数一般都被认为是素数。
(2) 随机数函数:void mpz_urandomb(mpz_t rop,gmp_randstate_t state,unsigned long int n) [函数]产生一个均匀分布在 0 到 2^n − 1(包含) 范围内的随机整数。在激活这个函数之前必须先调用某个 gmp_randinit 函数对变量 state 进行初始化。随机状态初始化:void gmp_randinit_default (gmp_randstate_t state) [函数]用默认算法初始化 state。这是速度与随机性之间的权衡,建议没有特殊要求的应用使用它。输入:bits 输出:生成一个范围在0~2^n - 1 的随机素数

RSA加密解密算法

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能 如何,而且密码学界多数人士倾向于因子分解不是NPC问题。
RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET( Secure Electronic Transaction )协议中要求CA采用比特长的密钥,其他实体使用比特的密钥。

SHA512算法

  • 算法原理

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。Hash码的每一个位都是全部输入位的函数。基本函数F多次复杂重复运算使得结果充分混淆,从而使得随机选择两个消息,甚至于这两个消息有相似的特征,都不太可能产生相同的Hash码。除非SH-512中存在目前未公开的隐藏缺陷,找到两个具有相同摘要的消息的复杂度需要2256次操作,给定摘要寻找消息的复杂度需要2512次操作。

  • 算法内容:

    每个安全散列函数的输出,在应用到一个分为N个分组的消息后,结果记为散列量H(N)。对于SHA-384和SHA-512,它可以被认为是8个64位的字,记为:H(i)0、H(i)1、…、H(i)7。
    散列字被初始化为一个特定的值,并在处理完每一个消息分组后对它进行更新,并在处理最后一个块后将其连接起来以产生输出。对于SHA-512,所有的H(N)变量都是串联的,而SHA-384散列值是通过最后连接时,省略一些而产生的。
    与前面类似,对于SHA-384,初始化散列值有下述8个64为的16进制数组成。这些数由第9到16个质数平方根的小数部分的前64位得到。
    H(0)0 = cbbb9d5dc1059ed8
    H(0)1 = 629a292a367cd507
    H(0)2 = 9159015a3070dd17
    H(0)3 = 152fecd8f70e5939
    H(0)4 = 67332667ffc00b31
    H(0)5 = 8eb44a8768581511
    H(0)6 = db0c2e0d64f98fa7
    H(0)7 = 47b5481dbefa4fa4
    对于SHA-384,初始化散列值有下述8个64为的16进制数组成。这些数由前8个质数平方根的小数部分的前64位得到。
    H(0)0 = 6a09e667f3bcc908
    H(0)1 = bb67ae8584caa73b
    H(0)2 = 3c6ef372fe94f82b
    H(0)3 = a54ff53a5f1d36f1
    H(0)4 = 510e527fade682d1
    H(0)5 = 9b05688c2b3e6c1f
    H(0)6 = 1f83d9abfb41bd6b
    H(0)7 = 5be0cd19137e2179
    SHA-384和SHA-512对消息分组执行相同的处理,只在初始化H(0)和如何生成最终输出的过程中有所不同。SHA-384和SHA-5126可以用来散列处理长度为L位的消息,其中0 < L< = 2128。算法使用一个80个64位字的消息列表, 8个工作变量64位以及8个64位字的散列值。
    消息列表每32位分为一个子分组,被标记为W0、W1、…、W79。8个工作变量分别为a、b、c、d、e、f、g和h,8个散列值被标记为h(i)0、h(i)1、…、H(i)7,并保留初始散列值H(0),替换为每一个连续的中间散列值(在处理完每个消息分组后)H(i),并在处理完所有N块后,以最终的散列值H(N)结束。
    从前面我们知道,填充完了之后消息被分为了1024位的消息分组。每个分组被分为16个64位的子分组,记为:M(i)0、M(i)1、…、M(i)15。将对N个消息分组进行如下操作。
    a、准备消息列表
    For t = 0 to 15
    Wt = M(i)t
    For t = 16 to 79
    Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(W(t-15)) + W(t-16)
    b、初始化工作变量
    a = H(i-1)0
    b = H(i-1)1
    c = H(i-1)2
    d = H(i-1)3
    e = H(i-1)4
    f = H(i-1)5
    g = H(i-1)6
    h = H(i-1)7
    c、执行散列计算
    For t = 0 to 79
    T1 = h + BSIG1(e) + CH(e,f,g) + Kt + Wt
    T2 = BSIG0(a) + MAJ(a,b,c)
    h = g
    g = f
    f = e
    e = d + T1
    d = c
    c = b
    b = a
    a = T1 + T2
    d、计算最终结果
    H(i)0 = a + H(i-1)0
    H(i)1 = b + H(i-1)1
    H(i)2 = c + H(i-1)2
    H(i)3 = d + H(i-1)3
    H(i)4 = e + H(i-1)4
    H(i)5 = f + H(i-1)5
    H(i)6 = g + H(i-1)6
    H(i)7 = h + H(i-1)7
    所有消息分组顺序完成上述计算过程后,还会计算最终的输出结果。对于SHA-12来说,,是所有H(N)0、H(N)1到H(N)7的串联。对于SHA-384,则是H(N)0、H(N)1直到H(N)5的串联。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寻址00000001

千里之行,始于“足下”

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

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

打赏作者

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

抵扣说明:

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

余额充值