验证UltraVNC中d3des库DES测试向量结果不符的问题
关于VNC兼容d3des库的DES实现差异问题
我正在研究VNC服务器仍在使用的老旧DES库d3des,原本以为它是标准DES的正确实现,但它的加密结果和Python、C#、Java里的标准DES实现都不一致,而后三者的结果是统一的。
我用NIST文档《Validating the Correctness of Hardware Implementations of the NBS Data Encryption standard》里的首个测试向量做了C++测试:
Key: 01 01 01 01 01 01 01 01
Plain: 95 F8 A5 E5 DD 31 D9 00
Cipher: 80 00 00 00 00 00 00 00
测试程序代码如下(省略仅用于打印的printx()函数):
void sampledes(unsigned char* key, unsigned char* plain) { unsigned char msg[8]; deskey(key, EN0); des(plain, msg); printx("key: ", key, 8); printx("plain: ", plain, 8); printx("msg: ", msg, 8); } int main() { sampledes( new unsigned char[] { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, new unsigned char[] { 0x95, 0xf8, 0xa5, 0xe5, 0xdd, 0x31, 0xd9, 0x00 } ); }
程序输出为:
key: 1 1 1 1 1 1 1 1 plain: 95 f8 a5 e5 dd 31 d9 0 msg: 3e 5a 14 8d cd f e9 ad
这个结果和预期的Cipher值完全不符,我一开始怀疑是字节序问题,试了各种明文字节排列方式,但都没得到正确结果。另外,d3des.c自带的测试向量运行结果也和预期不一致,我猜测过原代码可能不是以字节数组作为数据来源,但调整字节顺序后还是没用。
注:我不是要在新场景里用过时的DES,只是因为VNC协议的密码认证必须用这个算法,需要实现兼容的VNC客户端。
后来查看d3des.c的注释才发现,这个版本是修改过的D3DES(V5.09),移除了双长度和三长度支持,还反转了bytebit[]数组,变成忽略每个字节的最高位而非最低位,但自带的测试向量没更新,这就解释了结果差异的原因。
我最终用两种方法解决了问题:
- 把UltraVNC的C代码封装成DLL,从.NET代码里调用;
- 修改密码格式后直接用.NET原生的DES实现。
内容的提问来源于stack exchange,提问作者lzydrmr
相关产品推荐
相关产品推荐

