这是在做一个项目的时候突然想到的一个和项目完全无关的问题。
问题是这样的:
是否存在一个确定协议,可以生成一个秘钥和配套的一组公钥,公钥数为N,N不小于1,且N可由协议确定,或通过协议中的输入参数确定。
对这N个公钥有如下要求:
- 对任意明文t,使用私钥k加密后得到的密文c,任何一个公钥
都可以解密出原文p,即:
;
- 在没有私钥k的情况下,使用任意个公钥
都无法得到公钥
;
第一个要求可以称为“配对原则”,而第二个要求可以称为“隔离原则”。
虽然这样的1对N公私钥体系现在看来应该没什么实际作用,但这个问题本身很有趣。
在不要求N可调节的情况下,或者N的限制可以略微放宽的情况下,这个问题的解还是很简单的——
我们以RSA的简化版为基础,假定私钥是质数v,公钥是质数b,到这里还是1对1的。
接着,b可以写成[]byte的形式,其每一位都是[0, 255]这个范围的。我们做一个变换,将一个byte拆解为两个。
新的字节数组记为bx,我们将bx每两位byte做一个xor,这是一个byte,这样就可以将2l长的bx映射到l长的[]byte上,因此只要这个映射的像是上面的公钥b,那么这个映射就可以将多个(事实上是个)字符串映射到真正的公钥上,那么这样的N个字符串就是我们所要的1对N的“公钥”了。
当然,这个简单粗暴的做法只满足配对原则,并无法满足隔离原则——一旦规则公开了,那么别人自然可以从任意公钥p1来推测出其他所有的公钥px了,所以不好。
类似的方案还有,寻找一个合数x,任意公钥pi也是一个合数,pi与x的最大公素约数只要正好是前面所给的素数b,那这样也就可以了,我们可以将v和x一起作为私钥。
一个可以保证隔离原则的方案,是故意构造哈希碰撞。
还是以简化的RSA为例,假定我们可以找到两个甚至更多个字符串,它们的哈希是同一个值,即它们发生了哈希碰撞。然后这个哈希值如果可以用来作为公钥,并生成相应的私钥,那么这样得到的公私钥组合就满足要求了。
这样的情况下,配对原则自然是满足的,而隔离原则由于哈希本身是散列的因此得到了保证。
当然,这个方案的难点在于,寻找合适的碰撞很难,要控制N就更难了。。。
所以,到现在还没想到好的方案。
通过本协议,您可以分享并修改本文内容,只要你遵守以下授权条款规定:姓名标示 、非商业性、相同方式分享。
具体内容请查阅上述协议声明。
纸媒与网络平台如需转载必须与本人联系确认。
网友评论