【发布时间】:2017-01-09 16:35:23
【问题描述】:
我正在开发一个 C 项目来读/写 Desfire 非接触式卡片。 现在我实现了身份验证,并且能够从卡中读取数据,但它是使用 3DES 加密的。
我想解密下一条消息:
EB 54 DF DD 07 6D 7C 0F BD D6 D1 D1 90 C6 C7 80 92 F3 89 4D 6F 16 7C BF AA 3E 7C 48 A8 71 CF A2 BD D0 43 07 1D 65 B8 7F
我的 SessionKey(在身份验证步骤中生成)是:
44 E6 30 21 4A 89 57 38 61 7A B8 7C A9 91 B2 C0
我知道 IV={ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
有了这些信息,我可以去here,选择3DES,CBC模式,我可以解密消息,我有办法知道它是正确的。 应该是,解密:
10 1a 01 31 32 ae 03 de 39 b0 00 97 7f 65 e9 43 93 89 53 5c 9e 04 a9 3f 95 71 24 0f 0a 9b f7 ee d4 5b 1b c6 78 7a f4 36
无论如何,我尝试使用 OpenSSL des 库来实现 C 代码,但我发现了下一个困难:
我需要 3 个 8 字节的密钥,但我有 1 个 16 字节的 SessionKey 长。
我尝试将 SessionKey 拆分为 Key1/Key2/Key1,但没有成功。 我已经阅读了很多关于它的信息,我发现的唯一线索是我必须从我的 16 字节会话密钥(将其作为密码)生成这 3 个密钥,但我觉得它对我来说太先进了。 如果这是唯一的方法,是否有任何关于 ossl 密钥派生(evp_bytestokey)的教程?有没有其他办法?
谢谢
编辑: 所以,现在我处于一个非常奇怪的位置。正如你们中的许多人所指出的,我已经从会话密钥中获取了前 8 个字节作为密钥 3(这就是我使用 Key1/Key2/Key1 所指的内容)。无论如何,它似乎不起作用,但它确实起作用了,这让我感到困惑。 我明白了:
Decrypted : 11 1B 00 30 33 AF 02 DF DE 01 00 00 00 01 01 00 14 C1 26 8F 03 20 20 41 00 30 39 01 00 00 00 00 00 00 00 00 00 00 75 B1
什么时候
Expected : 10 1a 01 31 32 ae 03 de de 01 00 00 00 01 01 00 14 c1 26 8f 03 20 20 41 00 30 39 01 00 00 00 00 00 00 00 00 00 00 75 b1
所以我得到了预期的结果,前 8 个字节与 01 进行异或运算。这有什么意义吗?正如在 OSSL 文档中所说:请注意,libcrypto 中同时存在 DES_cbc_encrypt() 和 DES_ncbc_encrypt()。我建议你只使用 ncbc 版本(n 代表新的)。请参阅 OpenSSL DES 手册页的 BUGS 部分和这些函数的源代码。 但是我只能访问旧版本...可能是问题吗??
【问题讨论】:
标签: encryption openssl rfid mifare 3des