本来想尝试在客户端和服务器端使用RSA加密通信, 来增强通信的安全性.

我的客户端使用.net, 服务器端使用php. 然后噩梦就开始了.

首先php端的实现我采用的是phpseclib, 一个号称兼容openssl RSA加密, 支持OAEP,PKCS#1 padding的加密库. 客户端刚开始使用的是.net自带的加密库RSACryptoServiceProvider .

经过反复的尝试后, 发现无论是客户端还是服务器端, 加密后的字符串都不能在另外一边正确解密. 而通过phpseclib生成的key, .net端也不能正确加载.

经过一段时间的研究, 得出以下结论.

phpseclib生成的key, 是以明文base64编码保存的, 而.net的api则需要使用原始的key, 所以再加载时, 要先用base64解码 phpseclib生成的公私钥, 然后再加载, 经过尝试后, 发现偶尔会能成功.

但是这种情况下仍然无法正常解码加密后的信息.

再研究发现, RSA加密的标准的实现会有很多细节上的差异, 而这些差异则造成不同库之间协作的问题, 异同包括:

  1. 公私钥的格式不一样
  2. Padding格式不一样(即使号称用了同一种padding的库的结果貌似也不一致, (padding就是说会随机的往加密信息里填充一些字符, 来让加密更加难以破解)

所以要找到两个能协作很好的加密库很重要啊,

试了一些其他的.net的加密库, 貌似都不能和phpseclib很好的协作. 而由于时间关系, 就没有再继续研究这个问题了….