密码学基础知识

密码学算法主要分为两种:对称加密和非对称加密。

对称加密就是使用了一样的密钥来加密,需要在只有通信的双方知道密钥的情况下才安全。

非对称加密

在非对称加密算法中,有公钥和私钥两种密钥,其中,公钥是公开的,不需要保密,私钥由个人持有,必须妥善保管和注意保密。加密和解密使用两种不同的密钥,用公钥加密,只有私钥能解密,用私钥加密,只有公钥能解密。RSA就是一种常见的,应用很广的非对称加密算法。

加密解密

A往B发送消息,A用B的公钥把消息加密,只有B的私钥能解密。然后A把加密后的消息发送给B,B用自己的私钥解密就能看到了,途中没有别人可以破解消息,因为别人只有B的公钥。然后B用自己的私钥加密消息,回复给A,A用B的公钥解密读取回复。

但是这样真的安全吗?如果传输过程中消息被人修改了怎么办?如果A加密使用的公钥不一定是B的公钥呢,只是他以为是B的公钥。

数字签名和数字证书

上面的问题可以用数字签名和数字证书解决。

数字签名可以解决消息被人修改的问题,数字签名是一个hash算法,A把要发送的消息通过hash算法计算出一个hash值,当做摘要,和消息一起传送,B把消息hash之后得到另一个摘要,是否和A传送过来的摘要相同。如果担心消息和hash摘要都被修改,可以把hash摘要用B的公钥加密,就不怕别人改了。

数字证书可以解决这个公钥是不是B的公钥,数字证书通过权威机构-证书管理机构发放的证书,如同现实中的身份证一样,是证明这个公钥是某人的,数字证书会把这个人的公钥,姓名,证书机构名称,有效期放在一起。

这样A就可以先请求B的公钥,然后B把数字证书给A看,就证明这个是B的公钥,A再拿这个B的公钥去发送消息。但是证书也可以伪造,中途被拦截了,修改成C的公钥,以及B的名字,这怎么办呢?

所以在证书机构办颁发证书的时候,会用数字签名给证书内容做个摘要,然后用机构的私钥加密这个摘要,这样就不怕别人篡改造假证书了。

现在的https协议就是基于非对称加密技术的,首先客户端往服务器发起加密请求,于是服务器会用自己的私钥加密网页,然后连同自己的数字证书(这个证书里包含证书颁发机构做的签名),然后客户端浏览器会查看操作系统认证的受信任的证书颁发机构查找公钥,验证证书是否被篡改,如果被篡改会发出警告。如果查找不到受信任的证书颁发机构,浏览器也会发出警告。

个人理解

什么时候用公钥加密什么时候用私钥加密呢?我觉得是当你的消息不想让接收者意外的人看到的时候,就用对方的公钥加密。当你需要证明这个消息是你发出的,但是怕被篡改的时候,就用自己的私钥加密签名,然后附上自己的数字证书(包含公钥)。

比如区块链中,为什么说掌握了私钥就掌握了这些币呢,因为你要使用这些币进行交易,你就必须要用你的私钥来加密这条交易信息的摘要,然后别人用你的公钥来解密你的摘要,再进行SHA256哈希你的交易信息,证明这笔交易确实是你发出的。

RSA

RSA是最流行的非对称加密技术,只要加密的越长,就越难以破解,因为没有可靠的破解方法。RSA的核心是欧拉定理,证明在之后给出。

RSA算法的主要过程:

  • 发送者A和接收者B,A需要先选择两个不同的质数 p p q,这两个质数越大越难以被破解
  • 然后计算出 n=p×q n = p × q ,以及 n n 的欧拉函数
    ϕ(n)=ϕ(pq)=ϕ(p)×ϕ(q)=(p1)×(q1)
  • 选择一个整数 e e ,满足1<e<ϕ(n)并且 gcd(e,ϕ(n))=1 g c d ( e , ϕ ( n ) ) = 1
  • 计算 e e 在模ϕ(n)下的逆元 d d ed1modϕ(n)
  • 所以 (n,d) ( n , d ) 是私钥, (n,e) ( n , e ) 是公钥,一共有6个参数 p,q,n,ϕ(n),e,d p , q , n , ϕ ( n ) , e , d n n e可以被其他人知道,其余四个参数不能被别人知道。
  • A把公钥 (n,e) ( n , e ) 给B,然后要发送消息了,消息为 m m ,这是一个整数,并且要满足m<n,这个整数可以是一段文字的ascii码值或者unicode码值。
  • B用公钥加密信息得到密文 c c ,加密过程为mecmodn
  • c c 传给A,然后A用私钥解密,得到cdmmodn
  • 下面需要证明解密一定能得到明文 m m ,证明如下:
    cdmmodn
    medmmodn m e d ≡ m mod n
    mhϕ(n)+1mmodn m h ϕ ( n ) + 1 ≡ m mod n
  • 下面需要分类讨论一下,当 gcd(n,m)=1 g c d ( n , m ) = 1 的时候:
    mϕ(n)1modn m ϕ ( n ) ≡ 1 mod n
    mhϕ(n)1modn m h ϕ ( n ) ≡ 1 mod n
    mhϕ(n)+1mmodn m h ϕ ( n ) + 1 ≡ m mod n
    得证
  • gcd(n,m)1 g c d ( n , m ) ≠ 1 的时候,因为 m<n m < n ,所以假设 gcd(n,m)=p,m=kp g c d ( n , m ) = p , m = k p ,证明如下:
    (kp)ϕ(q)1modq ( k p ) ϕ ( q ) ≡ 1 mod q
    (kp)hϕ(p)ϕ(q)+1kpmodq ( k p ) h ϕ ( p ) ϕ ( q ) + 1 ≡ k p mod q
    (kp)hϕ(p)ϕ(q)+1=tq+kp ( k p ) h ϕ ( p ) ϕ ( q ) + 1 = t q + k p
    p|(kp)hϕ(p)ϕ(q)+1 p | ( k p ) h ϕ ( p ) ϕ ( q ) + 1
    p|tq+kp p | t q + k p
    p|tq p | t q
    p|t p | t
    n|tq n | t q
    (kp)hϕ(p)ϕ(q)+1kpmodn ( k p ) h ϕ ( p ) ϕ ( q ) + 1 ≡ k p mod n
    mhϕ(n)+1mmodn m h ϕ ( n ) + 1 ≡ m mod n
    得证

我们来看下RSA到底会不会被破解,你目前已知的是 (n,e) ( n , e ) ,想要知道 m m 就得知道d,想要知道 d d 就得知道ϕ(n),想要知道 ϕ(n) ϕ ( n ) 就得知道 pq p q ,想要知道 pq p q ,就得把 n n 给分解质因数,但是目前并没有非常有效的分解质因数的方法,只能穷举,所以只需要你的pq越大,这个算法就越靠谱。

欧拉定理

首先求解欧拉函数,要知道欧拉函数是积性函数,比如 n=pk11pk22pkmm n = p 1 k 1 p 2 k 2 … p m k m

ϕ(n)=i=1mϕ(pkii) ϕ ( n ) = ∏ i = 1 m ϕ ( p i k i )
不过我们用容斥原理来求解欧拉函数,首先和 n n 不互质的数字肯定包含了n的素因子,所以我们可以这样:
ϕ(n)=ni=1mnpi+i=1,j=1,ijmnp1p2 ϕ ( n ) = n − ∑ i = 1 m n p i + ∑ i = 1 , j = 1 , i ≠ j m n p 1 p 2 − …
ϕ(n)=n(11p1)(11pm) ϕ ( n ) = n ( 1 − 1 p 1 ) … ( 1 − 1 p m )

欧拉函数求出来了,那我们来证明欧拉定理,对于一个正整数 n n ,它的剩余系为Sn={a1,a2,,aϕ(n)},那么对于一个和 n n 互质的数b来说,这样一个集合 Tn={ba1,ba2,,baϕ(n)} T n = { b a 1 , b a 2 , … , b a ϕ ( n ) } ,有 Sn=Tn S n = T n

那么两个集合里的所有数字的乘积应该是相等的,有 bϕ(n)ϕ(n)i=1ai=ϕ(n)i=1aimodn b ϕ ( n ) ∏ i = 1 ϕ ( n ) a i = ∏ i = 1 ϕ ( n ) a i mod n ,所以可以得到 bϕ(n)1modn b ϕ ( n ) ≡ 1 mod n

中国剩余定理

中国剩余定理主要是类似由一个故事得来的,相信大家都听过,就不说了。

中国剩余定理(CRT)主要是给多个同余方程,求解答案,如下:

xa1modm1xa2modm2xakmodmk { x ≡ a 1 mod m 1 x ≡ a 2 mod m 2 … x ≡ a k mod m k

其中每个模数都互质,如何求解这个 x x 呢?我们可以去凑一个情况
{bi1modmibi0modmjji

这样就可以得到
{aibiaimodmiaibi0modmjji { a i b i ≡ a i mod m i a i b i ≡ 0 mod m j j ≠ i

于是我们可以 bi=kjimj b i = k ∏ j ≠ i m j ,于是就有 kjimj1modmi k ∏ j ≠ i m j ≡ 1 mod m i ,记 Mi=jimj M i = ∏ j ≠ i m j ,那么 k=M1 k = M − 1 k k Mi的逆元。

所以可以得到一个解 x=ki=1aiMiM1i x = ∑ i = 1 k a i M i M i − 1

扩展欧几里德

普通的欧几里德很简单吧,应该大家都会,所以现在我们推导一下扩展欧几里德。

扩展欧几里德也叫裴蜀定理,形式是 ax+by=c a x + b y = c ,求 x,y x , y 的通解,其中 c=k×gcd(a,b) c = k × g c d ( a , b )

所以我们可以首先求解 ax+by=gcd(a,b) a x + b y = g c d ( a , b )

有下面两个式子 :

ax1+by1=gcd(a,b) a x 1 + b y 1 = g c d ( a , b )
bx2+(a%b)y2=gcd(b,a%b) b x 2 + ( a % b ) y 2 = g c d ( b , a % b )

因为欧几里德定理,所以可以得到
ax1+by1=bx2+(a[ab]b)y2=ay2+b(x2[ab]y2) a x 1 + b y 1 = b x 2 + ( a − [ a b ] b ) y 2 = a y 2 + b ( x 2 − [ a b ] y 2 )

所以得到结论 x1=y2,y1=x2[ab]y2 x 1 = y 2 , y 1 = x 2 − [ a b ] y 2
当欧几里德到最后一步的时候 b=0,ax=gcd(a,0)=a,x=1,y=0 b = 0 , a x = g c d ( a , 0 ) = a , x = 1 , y = 0 即可,所以可以用递归 实现扩展欧几里德,下面是代码实现。(扩展欧几里德的其他应用,可以参考后面链接)

void exgcd(int a, int b, int d, int &x, int &y){
    if(b == 0){
        d=a;
        x=1;
        y=0;
    }
    else{
        exgcd(b, a%b, d, x, y);
        int k = x;
        x = y;
        y = k - a/b*y;
    }
}

密码学哈希

密码学哈希算法主要是有MD5,以及SHA等算法,特点是不可逆以及没有 冲突(冲突概率极小),和普通的哈希算法很类似,和内存中的哈希表不同。

参考资料

RSA参考博客RSA算法

中国剩余定理参考David Lin的回答 - 知乎

扩展欧几里德参考欧几里得算法与扩展欧几里得算法_C++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值