首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法用SessionKey解密3 3DES

无法用SessionKey解密3 3DES
EN

Stack Overflow用户
提问于 2017-01-09 16:35:23
回答 2查看 595关注 0票数 1

我正在开发一个C项目来读/写Desfire非接触式卡。现在,我实现了身份验证,并且能够从卡中读取数据,但它是用3 3DES加密的。

我想解密下一条消息:

代码语言:javascript
复制
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 (在身份验证步骤中生成)是:

代码语言:javascript
复制
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模式,我可以解密消息,我有办法知道它是正确的。它应该被解密:

代码语言:javascript
复制
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中提到的)。无论如何,它似乎不起作用,但它稍微做到了,这是令我困惑的。我得到:

代码语言:javascript
复制
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

什么时候

代码语言:javascript
复制
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部分和这些函数的源代码。但我只能访问老版本..。会不会是问题所在?

EN

回答 2

Stack Overflow用户

发布于 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实现将自动完成这一任务,有些则必须由您自己完成。

如果这不起作用,您将需要在问题中提供更多的信息。

票数 2
EN

Stack Overflow用户

发布于 2017-01-09 17:12:55

您可能不需要3键32位,而只需要3*32位中的1位,并且字节顺序很好--“最好的问候”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41552636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档