伪随机数加密思路
伪随机数加密是伪随机数组作为密钥加密的例子。
它工作时需要用户输入密码。密码是干什么的?密码就像一个种子,有了它才能完成加密或解密。密码的数值渗透到整个过程,它决定,密钥的发生和使用细节,而密钥串正是伪随机数组,这里为每个明文字节准备一个或多个字节的密钥。密钥在这里可以说是一种充填物,经它对明文的充填而转变成密文,解密就是将密钥分离出来。
通常伪随机数用随机函数来产生,这样就产生一个问题,破解者可以通过阅读程序知道你的随机函数并得到全部的随机数组成员。如果你的加密过于简单,他可以用随机数组逐字节的与你的密文进行运算,实现破解,那你的密文就危险了。如何使他不能得逞?这里给出两个方法,可以有效的对付他。
1 多次加密法。一个明文字节用两个以上的密钥字节进行加密,如果使用多个随机函数来生成密钥最好,随机函数种子要和密码相关。如果用同一函数要使用不同的区段,各区段的起点(对应不同的种子)一定是密码相关的也就是动态的、随加密者的密码动态变化的。这样处理的结果是破解几乎无计可施。
2 序列重排法。通过运算得到了密钥的随机数组,不直接使用它,对随机数组的序列进行重新排列,实际作用是建立新的数组,这个重排最好用其它随机数组来完成,随机函数种子要和密码相关。如果使用相同的函数要使用不同的区段,各区段的起点(对应不同的种子)最好是密码相关的也就是动态的、随加密者的密码动态变化的。这样生成的随机数组,对破解者来说就是真随机数组了,你就可以实现一次一密的安全加密了。
3 随机函数随机函数内部参数动态化。让它内部参数和用户密码相关,这样破解者将无法复现伪随机数组供破解使用,实际是对随机函数簇中的一个进行调用,如果是多个参数将更好,但要确保随机函数的发散性不被破坏或影响。
如果加密程序编排得当,破解无从下手。只能用暴力破解。这里是这样对付他们的。无论密码正确与否都将进行解密操作,如果密码正确可以解密,如果错误将毁坏密文。所以破解者必须判断结果,从而给他造成大麻烦。
其实防止暴力破解、穷举法的最有效措施,对文件进行二次加密即可。破解者无法判断中间结果的是否成功:),而且一次加密后也不会有空白为分析提供方便。但如果采用单一密码进行二次加密,窃密者知晓后可设计专门的程序进行二次解密。保险的做法是二次加密采用不同的密码,使其彻底绝望。当然这是要牺牲加密速度的做法,用户要根据具体情况选择加密方案。
防止暴力破解、穷举法的另一方法是加长密码的位数。这个方法肯定有效但是给使用者也造成了使用上的麻烦。你可以这样做,让程序自动对密码加首尾字符串,而首尾串表写在文本文件里供使用者拷贝,然后修改中间部分即可,需要通讯双方约定好其内容,并可经常更改。因为是自动添加的你就可以做长一些,可以用一些冷僻的汉字啊符号啊什么的做密码。密码增加许多位这对窃密者是个大麻烦,破解时间将是超级天文数字,最终迫使他夹着尾巴逃掉。 这里密码的位数增加对运算速度几乎没有什么影响。
好的加密程序应该不怕算法公开,甚至源程序公开,在完全透明的情况下,破译者对秘文仍无计可施。