|
楼主 |
发表于 2017-11-25 00:40:54
|
显示全部楼层
湖北省孝感市
本帖最后由 落款hMZ 于 2017-11-25 00:55 编辑
问题的原因找到了
先听我啰嗦一句
windows CryptAPI最可怕的地方在于:他并不是完全依靠密码学的计算来达到目的的,他为了达到目的可以动用一切手段
因此,当你调用密钥对生成函数的时候,系统会缓存你的公钥私钥信息,后来虽然你是在用公钥解密,但是实际上系统内部还是从缓存中找到了你的私钥,然后用私钥解的密。
如果你认为这样就可以解释了?那你错了,继续往下看
这个缓存,并不基于进程,也不基于你是否有开关机
也就是说,只要你用你的电脑生成过一个密钥对,他就会永远缓存你的密钥对,即使你关掉软件,关掉电脑,下次开机,再用这个公钥解密,他仍然还会找到你以前缓存的私钥
这样解释就结束了吗?
NO,还没有,还有更可怕的
openssl的机制跟windows不同,但是如果你在你的这个进程里调用了openssl 的密钥生成函数,他一样会缓存openssl生成的密钥对,然后你用公钥解密的话,他还是在缓存中找到了你的私钥用于解密
你以为我是在胡说八道?
测试方法:
1、去下载一个我曾经发表过的openssl帖子,用那个帖子生成公钥和私钥密钥对的PEM文件(注意,这个openssl帖子的例子可能有些问题,生成PEM文件的时候要用原始的RSA指针,不要跟我帖子里展示的一样,生成一个RSA指针后植入e、n、d 再生成PEM文件,这是不严禁的)
2、用上一步生成的PEM私钥公钥去测试,你会发现可以加密成功,但是不能解密了
3、在你的例子里加一个私钥解密,载入正规的私钥文件,解密。这时候按常理说,你应该能成功解密,毕竟公钥加密的确实可以用私钥解密
4、回过头再点你例子里的公钥解密,你会发现这次成功了,可以解密了,于是推论:因为你用私钥解密过,系统缓存了你的私钥,所以这次可以成功
5、关掉你的例子,重新打开,再点公钥解密,你会发现还可以解密,于是推论:这个缓存不基于进程,即使换了进程,一样解密
6、把openssl里生成PEM公钥私钥的那部分代码抠到你的程序里面,在你的程序里用openssl来生成公钥私钥,然后公钥加密,公钥解密,你会发现,仍然可以解密成功,于是推论:这个东西,连openssl生成的密钥对他都会缓存
7、关掉你的电脑,重启,再打开,再公钥加密公钥解密,仍然还可以成功,于是推论:除非重装系统了,否则这个缓存会永远存在
=============================================================
如果你还有别的电脑,那么还有个更简单的测试办法
就是你那个源码,放在别人电脑里生成两个PEM文件,复制到你的电脑里去,再调用公钥加密,公钥解密,会发现不行了,解密不出来了,然后你调用一下导入私钥解密,再调用公钥解密,就发现可以了
|
|