基于RSA和DES双重加密的可靠通信

喜你入骨 提交于 2019-11-29 10:43:46


    我们用比较经典的银行和用户的消息传输来讲解RSA和DES在建立可靠通信的作用,首先,我们知道非对称性加密有两个Key,一个是公钥Public Key,一个是私钥Private Key,私钥通常具有唯一性,而且不向外公开,而公钥可以向外公布,这种加密系统适合于C/S框架,用私钥加密的密文只能通过公钥解密,反之亦然,在我们的例子里,银行持有私钥而每个用户可以通过可靠机关获得公钥。


    至于非对称加密的好处我们可以想象下,用户A需要登陆银行系统,于是使用公钥加密自己的用户名登陆密码发送给银行,就算C截获了A的密文,但是C只有公钥,无法解密密文。非对称加密保证了所有用户发送给银行的消息只有银行本身可以知道内容。而银行发送登陆成功的提示给A,就算C截获了并且用public key解密了密文,但是很明显这些信息的重要性很低。我们可以设想一下,用户A的登陆,对账户进行操作(例如C最想的转账),查阅等操作都是由A发送的,而银行发回来的基本是对操作的确认,提示之类。由此我们可以知道非对称加密非常适合这种应用场景。


    但是为什么还需要在通信中加入对称加密呢?我们设想下,如果A发送登陆信息给银行而被C截获了,就算C无法解密该密文,但是只要C从本机模拟一次发送则可以让银行认为C就是用户A,从而让C登陆A的账户,对A的账户进行转账的操作。于是我们可以设想下用下面的办法来解决该问题:

//1.首先我们随机生成一个会话密钥des_key,并维持到会话结束后(例如用户退出登录,或者断开连接)才销毁

//2.我们每次发信息事用des_key加密该次信息,并用public_key加密该会话密钥并连同密文发给银行

//3.直到会话结束再销毁该des_key

    这样做有什么好处呢?我们到回之前的场景,假设c已经截获了a的登陆信息,并且从c发送一次给银行,但是由于c并不知道a随机生成的des_key,在进行转账操作时,无法将转账操作进行加密,因为银行会使用dek_key来相应解密操作密文,这直接导致就算c可以登陆银行,但是无法进行任何操作。另外,我们再回到更前面的场景,银行发送回给A的信息也会通过des_key进行加密再发回给A,这样就算C截获了银行发给A的信息,并且C拥有公钥,但是却无法知道密文的内容。


注记:byte[] -> SecretKey

byte b_dec_key[] = RSA.decrypt(b_key, private_key);
System.out.println("RSA解密后会话密钥:\n" + Utils.toHexString(b_dec_key));

DESKeySpec dks = new DESKeySpec(b_dec_key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey des_key = keyFactory.generateSecret(dks);


转载于:https://my.oschina.net/gal/blog/200165

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!