对称与非对称RSA加密

加密方法根据是否使用同一把密钥,分为对称与非对称加密。使用同一把钥匙进行加密及解密,称为对称加密。使用一对钥匙,其中一把钥匙加密的内容,必须用与之配对的钥匙解密,称为非对称加密。对称加密是可逆的,非对称加密是不可逆的。

对称加密及密钥交换

异或运算就是一种对称加密。比如使用二进制密钥1111对二进制数字1010进行异或运算:加密过程1010xor1111=0101,解密过程0101xor1111=1010。第一次异或运算是加密,第二次异或运算是解密。数学过程就是AxorBxorB=A。异或是可逆运算,而取模是不可逆运算。比如5%3=2, 但是X%3=2求X,这X就有很多解,3*n+2,运算不可逆。

要使用对称加密通讯内容,就需要双方通过安全方式交换密钥。使用取模运算结合指数运算,就可以通过“迪菲-赫尔曼-墨克密钥交换方案(Diffie–Hellman–Merkle key exchange)”安全交换密钥。过程如下:

  1. 双方约定一个运算法则g^X%p。比如g=3, p=5;
  2. Alice选一个私密的数X=a,执行g^a%p运算得到A。比如a=2,A=3^2%5=4;
  3. Bob选一个私密的数X=b,执行g^b%p运算得到B。比如b=3,B=3^3%5=2;
  4. 通讯告知各自运算得到的结果,A=4,B=2;
  5. Alice通过自己私密的a=2和Bob告知的B=2,算出密钥K=B^a%p=2^2%5=4;
  6. Bob通过自己私密的b=2和Alice告知的A=4,算出密钥K=A^b%p=4^3%5=4;
  7. 之后采用对称密钥K加密内容进行通讯。

如下图所示,红色为私密内容,其它都可公开:

由于第三方不知道Alice和Bob内心想的那个数是什么,即便窃听了全部通讯过程,也无法算出密钥。

非对称RSA加密

若是使用非对称加密,就无需考虑密钥交换的事。将公钥PublicKey公开,隐藏与之对应的私钥PrivateKey。公钥加密的内容只能用与之对应的私钥解密,反之亦然。公钥加密的内容,只有拥有私钥的接收方才能解密,确保信息不泄露。私钥加密的内容,任何人都可以拿公钥尝试解密,验证发信人都身份,可当作电子签名使用。其中一种公开公钥的算法就是RSA加密算法。RSA是三个发明人首字母的缩写,Ron Rivest、Adi Shamir、Leonard Adleman。他们在文章《A Method for Obtaining Digital Signatures and Public-Key Cryptosystems》中描述了该方法。

简单说,随机挑选两个隐密的大质数p, q, 计算n=p*q,r=(p-1)*(q-1)。对信息M加密得到密文C=E(M)=M^e%n;对密文C解密得到原文M=D(C)=C^d%n。私钥是(d, n),公钥是(e, n)。私钥d满足gcd(d,r) = 1,gcd指greatest common divisor,最大公约数,即d是与r互质的整数;公钥e满足e*d%r=1,e和d相乘对r取模,余数是1。使用公钥加密过程为Encryption E,使用私钥解密过程为Decryption D,密文称为Ciphertext C。E, D满足:D(E(M))=M,E(D(M))=M,即用其中一把钥匙加密对内容,要用与之配对的钥匙解密。

整个过程:

  1. 随机私密大质数p, q, 计算n=p*q, r=(p-1)*(q-1);
  2. 挑选私钥d,满足gcd(d,r)=1;计算公钥e,满足e*d%r=1;
  3. 销毁p, q, r;公开公钥(e, n),保密私钥(d, n);
  4. Bob发信息M给Alice,就用Alice的公钥(e, n)加密:C=M^e%n;
  5. Alice收到密文C,用自己的私钥(d, n)解密:M=C^d%n。

举个简单例子:

  1. 挑选p=2, q=5,计算出n=10, r=4;
  2. 挑选私钥d=3,计算出公钥e=7;(可在WolframAlpha 输入gcd(x,4)=1挑一个3,输入x*3%4=1挑一个7);
  3. Alice全网公开公钥(7, 10), 保密私钥(3, 10);
  4. Bob发信息2给Alice,使用Alice的公钥(7, 10)加密:2^7%10=8 (在WolframAlpha 输入2^7 mod 10得到8);信息2使用Alice的公钥加密后的密文是8。
  5. Alice收到密文8,使用私钥(3, 10)解密:8^3%10=2。2这就是Bob发给Alice的信息。

示意图如下:

每个字母通过ASCII表都对应着一个数字编码,通过将数字进行RSA加密,就可以保证通讯过程即便被监听,通讯内容也不会被第三方知道。上面的n=p*q=10,换算成二进制就是1010,4-bit加密。HTTPS通讯协议,zerossl默认证书是RSA-4096bit加密。ProtonMail默认是RSA-2048bit加密。

要破解RSA,方法是因数分解n,取得p和q。目前就是拼计算机的速度,遍历法求解。比如上文的n=10,一猜就是p=2, q=5。目前有记录的,被破解的最长RSA密钥是768位,2009年被破解。

2019/12/29, Sat

安全邮件ProtonMail

网上的一切服务都经由服务器提供,邮件服务也不例外。若是邮件内容以明文方式存储在服务器,就有可能被“非法”访问。

比如,在你“不知情”的条件下,第三方服务获取了读写你邮件的权限,就可以无障碍阅读你的邮件。Gmail邮件门事件就是用户主动授权给第三方,使得第三方可以明文阅读用户的邮件。无需知道你的邮件秘密,只需要你授权告知Google,Google就能开放权限给第三方明文阅读你的邮件。

也就是说,有一种方法,可以越过你的密码验证,只要Google点头,就可以无障碍读写你的邮件。而实际上,Google就曾通过扫描用户的邮件,获取私人信息,用于他的广告业务[1]。谷歌告诉华尔街日报,其内部员工可以在“特殊情况”下访问用户的电子邮件, 例如为了安全,需要获取用户信息调查数据泄露或滥用。邮件门事件中的电子邮件管理公司Return Path软件公司,扫描过2百万注册用户的邮件,他们的电脑每天扫描分析1亿封邮件。他们的员工为了训练自己的软件算法,读过8千多封私人邮件[2]。

拿我自己的学校邮箱举例。因为它是明文存储,我自己作为普通用户能读取的文件,管理员root用户就可以无障碍读写,也可以授权其它用户读写。如下图所示,只要有必要,完全可以检索分析出,我在什么时候,给谁,发过什么内容的邮件。也可以统计出我使用邮件的习惯,全部关键词,我的全部联系人,等等等。任何使用该邮件服务的用户,包括各个级别的教授,只要需要,管理员root用户都可以分析统计并修改他们的邮件。这是指从原理上能技术实现,至于用户和邮件是否被分析,不是技术问题。

有一种方法可以防止服务器管理员读写我们的邮件,那就是将邮件加密后存储在服务器中。虽然管理员依然可以读取邮件的内容,但因为邮件的内容是加密的,所以看到的是加密后的乱码。如下图,test1.me@protonmail.com 发邮件到test2.me@protonmail.com,内容分别为hi1和hi2,因为邮件是端到端(End-to-End Encryption, E2EE)加密的,所以服务器存储的是乱码。即便服务器被非法访问,读到的也是加密后的密文,无法使用。

端到端加密 (E2EE),是指通过公钥-私钥对(public key-private key)加密通讯的内容(注:并不是加密通讯过程)。公钥加密的内容,只能被配对的私钥解密,反之,私钥加密的内容,只能用配对的公钥解密。通常,公钥会对全网公开,私钥自己保存。

比如Bob和Alice通讯。Bob和Alice都有各自的公钥-私钥对,且称为Bob-PublicKey,Bob-PrivateKey,Alice-PublicKey, Alice-PrivateKey。Bob发邮件给Alice,为了保证内容只被Alice读出,Bob会使用Alice-PublicKey加密。即便通讯被监听,第三方拿到邮件内容,也只有Alice用Alice-PrivateKey才能解密,阅读。为了确保邮件的确是Bob发出,而不是别人伪造的,Bob会用自己的的PrivateKey再加密内容。若是第三方谎称自己是Bob给Alice发邮件,那Alice只要使用Bob-PublicKey尝试解密,只要能顺利解密,就能验证,这是Bob发来的邮件[3]。

图片引自ProtonMail: How does end-to-end encryption work?

ProtonMail (PM) 就是采用来端到端加密的邮件服务,保证了只有通讯双方才知道邮件内容。整个过程都自动完成,无需用户理会,跟普通邮件的使用过程一样。PM服务器存储的是加密后的内容,无法被任何第三方读取。

如果是PM与PM之间的通讯,默认是E2EE加密;若是PM到跟其它邮件系统通讯,那就不是E2EE通讯;但保存在PM服务器的内容,任何情况下都是E2EE加密的[4]。为了保证通讯内容是E2EE,最好双方都使用PM。或者通过PM提供的“Encrypt for non-ProtonMail users”功能,手动设置密钥。对方收到邮件链接,而不是邮件明文;通过密钥登陆PM临时邮件系统,查看内容。比如HSBC Enterprise给我Gmail发邮件的时候,就是用这种方式,我需要通过链接登陆他们的系统读取邮件内容,不能直接在Gmail上查看。即便是只有你自己使用PM,用最省事的方式直接发邮件给非PM用户,也至少保证了,PM服务器无法从我这一端读取邮件。至于对方服务器是否监听通讯内容,PM控制不了。

有不少提供E2EE邮件服务的公司,其中PM是最流行的。据说有些线人爆料,会要求记者提供PM邮箱收取内容。还听说,Snowden除了Lavabit就是使用PM。PM邮件可以免费使用,500M空间,够一般用户私人使用。若要更多存储空间或其它功能,需要付费订阅。通过设置自己操作系统的时间为黑色星期五,网页登陆PM邮件系统后,有30~50%的优惠,这是官方故意留的后门。它提供域名邮箱,提供公司邮件系统服务。尤其是对于公司,各式企业邮箱服务,若非E2EE,通讯内容都是被明文存储在服务器。如果需要,邮件服务商都可以明文读取邮件内容,窃取商业机密。

PS:

  • 我跟PM及Gmail不存在利益关系,是两者的普通用户。
  • PM也可以想法子窃取用户的邮箱密码。但保护用户隐私是他们的商业模式,若被发现它们窃听某用户邮件,所有用户都会瞬间抛弃它。
  • Gmail的用户并非Google的客户,它要靠广告客户盈利。如果我不是他的客户,那我就会成为它的产品,被卖给它的客户。Google和Facebook都一样,是由商业模式决定的。

参考资料:

  1. Google to Stop Reading Users’ Emails to Target Ads
  2. Tech’s ‘dirty secret’: App developers are sifting through your Gmail
  3. 省略了通讯过程中非对称加密的很多细节
  4. What is encrypted?

2018/12/11, Tue