3des的密钥key和初始化向量iv的问题
最近要改造公司一个程序的加密部分,之前用的是固定key和iv的方式,现在要改成动态key和iv,编程环境是vc2005,有2个问题请教:
1、C#中好像有现成的库函数能生成key和iv,但是在vc中怎么生成key和iv,难道是随机生成一个24字节和8字节的数字就行了吗?(请注意不是加解密过程中的子key)
2、关于iv,3des的CBC模式要求提供一个8字节的数字,以便明文和密码相同的情况下生成的密文也不相同。
引用网上一段讨论:
“
在CBC(不光是DES算法)模式下,iv通过随机数(或伪随机)机制产生是一种比较常见的方法。iv的作用主要是用于产生密文的第一个block,以使最终生成的密文产生差异(明文相同的情况下),使密码攻击变得更为困难,除此之外iv并无其它用途。因此iv通过随机方式产生是一种十分简便、有效的途径。此外,在IPsec中采用了DES-CBC作为缺省的加密方式,其使用的iv是通讯包的时间戳。从原理上来说,这与随机数机制并无二致。
昨天晚上仔细考虑了一下DES的几种工作方式的差异,觉得其应用范围有一定的差异。由于是对称密钥算法,我们假定密钥是安全的。对于密码本模式(ECB),也即最常用的DES模式,仅使用共同的密钥进行数据的加、解密。对于相同的明文,其密文是完全相同的。这为密码攻击留下了一定的可乘之机。以银行系统的密码为例,其一般采用6位以内的数字作为帐户密码,因此其密码空间为0~999999。完全可以通过已知密文进行攻击。假定存储密文的数据库也是安全的(排除内部作案的可能性),则攻击的途径主要来自数据传输的过程。通过类似888888之类常用密码的密文的截取与辩识,完全可以获得客户的重要信息!如果采用CBC模式加密传输数据、某随机值作为iv,则即使是相同密码加密后所得的密文也不相同,短时间内破解密码的可能性降到最低。在这一过程中,密钥并不传输,而通过iv对数据进行动态加密,传输iv实际起到的是相当于密钥协商的作用。
因此,如需对密文进行保存的,可以简单地采用ECB模式,也可采用CBC模式,但需同时记录加密时所用的iv值作为参考数据。更简单的笨办法是使用某一固定的常量串作为iv使用,这样的话两种模式即完全相同了(当然,不可避免会出现密文相同的问题)。如主要用途是保证数据传输过程中的信息安全,则最好采用CBC模式,同时将iv作为数据包头的一部分传输,在一次交易完成后即重新生成iv。
”
其大意是:ECB模式,通过截取几组常用密码的明文和密文用以对比,还是有机会解出明文,如果用CBC模式,增加随机iv,在数据包头传输,可以降低可能性。
我的问题是,如果我能截取数据包里的密文,那也能截取包头里的iv了,这样我还是可以通过对比明文和密码解出明文啊,这样iv不是失去意义了?是我的理解有误还是网上那段讨论没说清楚啊?
我的思路是每次登录时动态生成key和iv,通过其他加密方式发送给服务器,之后的通讯都以这个key和iv加解密,直到下次登录更换key和iv,现在关键的问题是我不知道怎么动态生成key和iv,请给位兄弟帮忙!谢谢!