赞
踩
数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码为“密文”,使其只能在输入相应的密钥之后才能显示出原容,本篇会介绍各种加密算法。
SHA hash独有得算法,算法可以有多种,根据每个人来算出来
是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
SHA1 SHA224 SHA256 SHA384 SHA512 MD5 HmacMD5 HmacSHA1 HmacSHA224 HmacSHA256 HmacSHA384 HmacSHA512 PBKDF2
包括常用得md5算法,缩减版得sha1
只要是哈希函数,就存在碰撞,所谓碰撞的意思是,有两个不同的数据,他们的哈希值相同(SHA1值相同)但是很少得,达到千万分之一
Sha-1算法标准规定,必须对消息摘要进行补位操作,即将输入的数据进行填充,使得数据长度对512求余的结果为448 ,填充比特位的最高位补一个1,其余的位补0,如果在补位之前已经满足对512取模余数为448,也要进行补位,在其后补一位1即可。 总之,补位是至少补一位,最多补512位,我们依然以“abc”为例,其补位过程如下:
初始的信息摘要:01100001 01100010 01100011
第一步补位: 01100001 01100010 01100011 1
..... ......
补位最后一位: 01100001 01100010 01100011 10.......0(后面补了423个0)
而后我们将补位操作后的信息摘要转换为十六进制,如下所示:
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000
在信息摘要后面附加64bit的信息,用来表示原始信息摘要的长度,在这步操作之后,信息报文便是512bit的倍数。通常来说用一个64位的数据表示原始消息的长度,如果消息长度不大于2^64,那么前32bit就为0,在进行附加长度值操作后,其“abc”数据报文即变成如下形式:
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000018
因为“abc”占3个字节,即24位 ,换算为十六进制即为0x18,
一个160位MD缓冲区用以保存中间和最终散列函数的结果。它可以表示为5个32位的寄存器(H0,H1,H2,H3,H4)。初始化为:
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0
大端存储模式:高位数据放在低地址,低位数据放在高地址
S函数
循环左移操作符Sn(x),x是一个字,也就是32bit大小的变量,n是一个整数且0<=n<=32。Sn(X) = (X<<n)OR(X>>32-n)
常量字k(0)、k(1)、...k(79)
Kt = 0x5A827999 (0 <= t <= 19)
Kt = 0x6ED9EBA1 (20 <= t <= 39)
Kt = 0x8F1BBCDC (40 <= t <= 59)
Kt = 0xCA62C1D6 (60 <= t <= 79)
非线性函数
所要用到的一系列函数
Ft(b,c,d) ((b&c)|((~b)&d)) (0 <= t <= 19)
Ft(b,c,d) (b^c^d) (20 <= t <= 39)
Ft(b,c,d) ((b&c)|(b&d)|(c&d)) (40 <= t <= 59)
Ft(b,c,d) (b^c^d) (60 <= t <= 79)
根据结果无法反推
开始计算摘要
计算需要一个缓冲区,由5个32位的字组成,还需要一个80个32位字的缓冲区。第一个5个字的缓冲区被标识为A,B,C,D,E。80个字的缓冲区被标识为W0, W1,..., W79
另外还需要一个一个字的TEMP缓冲区。
为了产生消息摘要,在补好位的数据中前16个字的数据块M1, M2,..., Mn
会依次进行处理,处理每个数据块Mi 包含80个步骤。
现在开始处理M1, M2, ... , Mn。为了处理 Mi,需要进行下面的步骤
(1). 将 Mi 分成 16 个字 W0, W1, ... , W15, W0 是最左边的字
(2). 对于 t = 16 到 79 令 Wt = S1(Wt-3 XOR Wt-8 XOR Wt- 14 XOR Wt-16).
(3). 令 A = H0, B = H1, C = H2, D = H3, E = H4.
(4) 对于 t = 0 到 79,执行下面的循环
TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;
E = D; D = C; C = S30(B); B = A; A = TEMP;
(5). 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.
在处理完所有的 Mn, 后,消息摘要是一个160位的字符串,以下面的顺序标识
H0 H1 H2 H3 H4.
进行循环位数;
不断得变加工,计算,最后得到得摘要就为千万分之一,并且不是线性得。散列函数,不断调用得。
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当他们三人都在美国麻省理工学院工作实习,RSA就是他们三人姓氏得开头字母一起拼在一起得。
RSA是目前最有影响力和最常用得公钥加密算法,他能够抵抗到目前为止已知得绝大数密码攻击,已被iso推荐为公钥数据加密的标准。
今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战和质疑。
1970年以前,密码学一直使用的是对称密钥,如果一个人需要和多人分享信息,比如银行需要存放所有人的密码,来进行信息交换,必然需要管理所有的密钥,能否有一种更简单的方法
1970年一个英国工程师和数学家James H.Ellis 在研究一个非秘密的加密想法,基于一个简单又聪明的想法,上锁和解锁是相反的操作
他可以把锁打开,交给对方后,由对方上好锁,再还给他,由他自己开锁
这样他可以大量发出他的信息,而只需要保留单个钥匙
当然他给出了工作原理,但不知如何用数学方法解决 也就是
而到了后期,被另一个数学家和密码专家Cocks发现,他需要一个特殊的单向函数,正推容易,求逆很难
被另一个数学家和密码专家Cocks发现,他需要一个特殊的单向函数,正推容易,求逆很难
继续将公因子扩大,所得的值只在17之内不断变换
然后如果知道结果为9,然后 17为密钥得到 这个值是很难的,也就是
而反过来 是很难的
这里做函数的推导
然后做函数转换
最后带入进去得到下面的函数
求素数的因子分解589=19*31,计算很难,如果是个1000位数呢?
这里然后往深处深追,欧拉一个重要的函数phi(n),用于找到整数的可分解性
这就要说到费马小定理
假设p是一个质数(一个大于1的自然数,除了1和它本身外,不能被其他自然数整除),而整数a不是p的倍数
a^p-a (a的p次方-a)一定是p的倍数
a^(p-1)-1 一定是p的倍数
a^(p-1) =1(mod p) 这里 a的p-1次方 和1对p取余相等
通过杨辉三角进行证明
而杨辉三角是什么,杨辉三角,则是由左上和右上的两个数进行相加得到的数,
上面的杨辉三角满足的公式就是下面的,从1开始这个公式 x+1; x^2+2*x+1;往下进行推导
上面的杨辉三角满足的特性
其中只看质数这一个的时候,中间的数据,都等于当前数的倍数,这也算是一个规律。
1,3,5,7.。。。,也就是刚才的规律。
归纳法中是正确的。
然后欧拉提出了一个欧拉总计函数
也就是n取正整数,在<=n的正整数中,计算与n互质的个数 计成fn(8)=4,互质,没有公约数,比如说小于8的 质数 就为4个,
7为质数,求7的互为质数,那就 一定有n -1个互为公约数。 把n分解为两个素数
则下面的
最后欧拉推出来,并不需要一定是质数,但是只需要是有相同的公约数就行了。
通过前面的时间公式 往下进行推
而这个d是未知数, 然后得到的结果
然后同时乘以m
提多项式
欧拉定理
RSA的推导算法
加密和解密的公钥也是利用的这个公式
公钥的生成
生成私钥的方式
然后加密过的数据
事实上,如果n足够大,需要几千年才能破解。
最后本篇主要是介绍的是银行常用的hash算法,和非对称加密算法,其中涉及包括hash算法中按非线性组合,和rsa算法中应用了费马定理。以及改进的欧拉定理,怎么推出的rsa算法;下篇文章我会介绍对称加密,及在jdk中应用的各种api实现
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。