我正在开发一个C项目来读/写Desfire非接触式卡。现在,我实现了身份验证,并且能够从卡中读取数据,但它是用3 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,0x00}
有了这些信息,我可以去这里,选择3 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代码,我发现了下一个困难:
我需要每个8字节的3个键,但我有一个16字节长的SessionKey。
我试图将SessionKey拆分为Key1/Key2/Key1 1,但没有成功。我读了很多关于它的文章,唯一的线索是我必须从我的16字节SessionKey (以它作为密码)生成这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因此,我得到了预期的结果XORing前8个字节与01。这说得通吗?与OSSL一样,它说:在libcrypto中同时有一个DES_cbc_encrypt()和一个DES_ncbc_encrypt()。我建议您只使用ncbc版本(n表示新的)。请参阅OpenSSL DES手册中的BUGS部分和这些函数的源代码。但我只能访问老版本..。会不会是问题所在?
发布于 2017-01-09 17:31:51
也许加密是双密钥3 3DES,在这种情况下重复前8字节,字节0-7作为字节16-23:44 E6 30 21 4A 89 57 38 61 7A B8 7C A9 91 B2 C0 44 E6 30 21 4A 89 57 38。
有些3 3DES实现将自动完成这一任务,有些则必须由您自己完成。
如果这不起作用,您将需要在问题中提供更多的信息。
发布于 2017-01-09 17:12:55
您可能不需要3键32位,而只需要3*32位中的1位,并且字节顺序很好--“最好的问候”
https://stackoverflow.com/questions/41552636
复制相似问题