工行的电子密码器工作原理:编号 + 当前时间 + 特定的算法 = 显示的当前密码它不会自动连接网络,只是预置了一套算法和数据,每个密码器里有个加密的密钥和算法。比如把对方账号或者金额之类的输进去,它会算出一串数字给你,你再把这个数字输入到电脑传递到银行。密码器内部有一个与主服务器是同步的时钟,计算的时候时间是作为一个参量参与计算。每个电子密码器预置的数据可能会不同,预置的数据在银行那边也有对应的存储,所以你输入后它可以识别。
使用的是非对称加密算法,比如RSA存在密码器里的是私钥(加密专用,不能用于解密),存在服务器里的是公钥(解密专用,不能用于加密)。RSA中公钥和私钥是成对出现的,每个密码器对应的密钥对是不一样的。服务器产生随机数,让密码器进行加密,客户将加密结果传回服务器,服务器再用公钥将密文进行解密,如果解密结果和刚才的随机数相同,则验证客户身份成功。密码器给出答案的方式。都属于0知识证明,即用户不需直接向服务器提供自己的密钥就能证实自己的身份。即便是信息传输中被窃听,窃听者也是无法破解密钥。
密码理论中有一种理论叫做zero knowledge,简单来说就是:Alice问Bob:你是Bob么?Bob回答:我是。Alice问:那你证明给我看,i.e.告诉我只有Bob知道的密码。但是整个conversation是不加密的,任何人都能看到经过的数据,所以Bob不能直接告诉Alice他的密码,怎么办呢?于是Bob想到了,让Alice给他一个Challenge,Bob用只有自己知道的private key进行加密之后得到k给Alice,Alice收到这个之后可以用Bob的public key来试,如果得到的是原先给出的Challenge的话则证明了这个Bob拥有的是真正的private key。在这个过程中,假设有一个偷听的人,叫做Eve,那么她知道的有什么呢?Bob的public key,这是所有人都能知道的,Alice给的Challenge,和Bob用private key加密之后得到的k。如果她想要得到Bob的private key的话那么则需要进行log运算,而log运算是NP问题。所以结果是Bob证明了自己的身份,同时也不需要泄露自己的confidential信息。这里运用到了public key system的对称性,也就是说,(a^m)^n=(a^n)^m,以及discrete logarithm的困难度。利用了单向不可逆的加密算法。单向加密也就是对一个数据加密后,密文是任何人都无法进行解密的。简单的说,密码器存着一个密钥,主机存着一个与之相同密钥(当然,每个密码器密钥是不一样的)。每次支付时工行服务器产生一个随机数并要求客户在密码器中输入这个数字,然后工行服务器使用该密钥通过单向的算法算出一个结果,如果客户通过密码器算出的结果与工行服务器算出的结果一致,则验证客户身份成功。