Python my算法的密码分析

Python my算法的密码分析,python,encryption,python-2.7,cryptography,complexity-theory,Python,Encryption,Python 2.7,Cryptography,Complexity Theory,我需要帮助计算出这个算法字节码部分的所有可能输出。不要担心for循环和ord之类的东西-新手加密员出来。我不会担心循环和ord之类的东西,所以让我们把它扔掉,看看剩下的 另外,我不理解“我需要帮助来计算这个算法的unicode部分可能的总输出”,因为这个算法没有unicode部分,或者实际上你的代码中没有任何unicode部分。但我可以帮你算出整个事情可能的总产出。我们会一步一步地简化它 第一: import string,random,platform,os,sys def rPass():

我需要帮助计算出这个算法字节码部分的所有可能输出。不要担心for循环和ord之类的东西-新手加密员出来。

我不会担心循环和
ord
之类的东西,所以让我们把它扔掉,看看剩下的

另外,我不理解“我需要帮助来计算这个算法的unicode部分可能的总输出”,因为这个算法没有unicode部分,或者实际上你的代码中没有任何unicode部分。但我可以帮你算出整个事情可能的总产出。我们会一步一步地简化它

第一:

import string,random,platform,os,sys
def rPass():
    sent =  os.urandom(random.randrange(900,7899))
    print sent,"\n"
    intsent=0
    for i in sent:
        intsent += ord(i)
    print intsent
    intset=0
rPass()
这完全等同于:

li=[]
for a in range(900,7899):
    li.append(a)
li[random.randint(0,7000)]
random.choice(range(900,7899))
同时:

li = range(900, 7899)
因为
li
恰好有6999个元素长,所以这与
random.choice(li)
完全相同

把最后两个放在一起,这意味着它相当于:

li=[]
for a in range(900,7899):
    li.append(a)
li[random.randint(0,7000)]
random.choice(range(900,7899))
…相当于:

li=[]
for a in range(900,7899):
    li.append(a)
li[random.randint(0,7000)]
random.choice(range(900,7899))
但是等一下,那随机的洗牌(li,random.random)呢?好吧(忽略第二个参数的默认值是
random.random
),选择已经是随机的,但不是加密的,添加另一个shuffle不会改变这一点。如果有人试图用数学方法预测您的RNG,那么用同一个RNG再添加一个无关紧要的洗牌将不会使预测变得更困难(而根据结果添加更多的工作可能会使定时攻击更容易)

事实上,即使您使用了
li
的一个子集而不是整个东西,也没有办法让您的代码更不可预测。你将有一个较小的价值范围来强行通过,没有任何好处

所以,你的整个事情归结为:

random.randrange(900,7899)
可能的输出是:长度在900到7899字节之间的任何字节字符串

长度是随机的,并且大致均匀分布,但在密码学上不可预测的意义上它不是随机的。幸运的是,这可能无关紧要,因为攻击者可能可以看到他处理的字节数,而不必预测它

内容是随机的,分布均匀且加密不可预测,至少在系统的
uradom
不可预测的程度上是如此

这就是我要说的

然而,事实上,您已经使它更难读、写、维护和思考,这给了您一个主要的缺点,对您的攻击者没有补偿的缺点

所以,只要使用一个班轮


我想在接下来的问题中,你会问900-7898字节的随机数据有多少个可能的值

900字节有多少个值<代码>256**900。901要多少<代码>256**901。因此,答案是:

sent = os.urandom(random.randrange(900, 7899))
…是关于
2**63184
10**19020

所以,63184位的安全性听起来相当令人印象深刻,对吗?可能不会。如果你的算法没有缺陷,那么100位就比你需要的要多。如果你的算法有缺陷(当然是的,因为它们都有缺陷),盲目地向它扔上数千比特是没有用的

另外,请记住,加密的全部要点是,对于一些较大的N,您希望破解速度比合法解密速度慢。因此,使合法解密速度慢得多会使方案更糟糕。这就是为什么每个实际工作的加密方案都使用几百位的密钥、salt等(是的,公钥加密使用几千位的密钥,但这是因为它的密钥不是随机分布的。通常,你用这些密钥加密随机生成的几百位会话/文档密钥。)


最后一件事:我知道你说过忽略
ord
,但是

首先,您可以将整个部分写成
intsent=sum(bytearray(sent))

但是,更重要的是,如果你对这个缓冲区所做的只是求和,那么你将使用大量的熵来生成一个熵更少的数字。(仔细想想,这一点应该很明显。如果有两个单独的字节,则有65536个可能性;如果将它们相加,则只有512个。)

另外,通过生成几千个单字节随机数并将它们相加,这基本上是正态分布或高斯分布的一个非常接近的近似值。(如果你是一个D&D播放器,想想3D6是如何给出10和11比3和18更多……这对于3D6比2D6更真实,然后考虑6000 D6)。但是,通过使字节的数量从900到7899,你将它从700×127.5变为均匀分布到7899×127.5。无论如何,如果你能描述你想要得到的分布,你可能可以直接生成,而不会浪费所有的熵和计算

值得注意的是,很少有加密应用程序可以利用这么多的熵。甚至像生成SSL证书这样的事情也使用128-1024位,而不是64K位


你说:

试图杀死密码

如果您试图加密密码,使其可以存储在磁盘上或通过网络发送,那么这几乎总是错误的方法。您希望使用某种零知识证明的密码存储哈希,或者使用质询响应而不是发送数据等。如果您希望构建“让我保持登录”功能,请通过实际保持用户登录来实现这一点(创建并存储会话身份验证令牌,而不是存储密码)。有关基础知识,请参阅维基百科文章

有时,您确实需要加密和存储密码。例如,您可能正在为用户构建一个“密码锁”程序,以便在其中存储一组密码。或者将客户端连接到设计糟糕的服务器(或者70年代设计的协议)。或者别的什么。如果你需要的话