You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

验证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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:05:16