我是一名加密新手,但是一直在使用128位RSA加密卡数据的卡访问系统上工作。

我有一个示例(来自卡),其中包含1024位加密数据。
我也有公钥(1024位),(奇怪的是)它被放置在访问控制硬件中。我100%确信它是一个公共(而不是私有)密钥。

第一次尝试将OpenSSL与二进制密钥一起使用密钥失败: >
我知道我可能需要格式化/准备密钥,但是我不确定如何做。

有什么想法吗?

编辑
要值多少钱?公钥是:

➤ openssl rsautl -decrypt -in ptt.enc.key -inkey ptt.pub.key -out ptt.dec.hex
unable to load Private Key
➤ 11636:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:648:Expecting: ANY PRIVATE KEY


加密的卡值为: ,防止滥用。卡必须每天左右刷新。

根据系统文档:


“通过将服务的公共密钥添加到建筑物的公共密钥来控制建筑物的访问。设备“


并且:


”使用768或1024位私钥的RSA加密的服务的“收费设备”允许颁发徽章每天向用户展示”


我同意-这似乎是异步密钥系统(分配公钥,然后使用私钥进行加密)的反面-也许他们正在做一些不同的事情(RSA签名?)-这就是我要确定的。 />
$ PUBKEY =“x31353737443032393837433633413935423531414531343934333038333441454146334632453046344346384336383837414336433844373332443739343832363034464331384441373741394343314635344438303633454145364534324134314232453034443136363338353644373630454142454343464237383342414531443433453145303243353031314538323342323446323931384639384134393632413837354430444639344638303938413141333044433934313330334639384142413139453646393936353937454441443746303343414239313545443442353842374241414432384330423637353933434446434342353339394142”


希望这个编辑将提供整个情况比较清楚 - 我很欣赏你的见解和帮助

评论

您怎么知道它是128位?您列出的公共密钥有128个字节,即1024位。

你是完全正确的-我确实提到我是加密货币菜鸟。所以它们是1024位:)

如mikeazo所指示,$ \; $“ 128位” $ \ mapsto $“ 1024位” $ \:\:$。 $ \; \; \; \; \; $

这不仅是题外话,而且由于许多原因也是错误的。没有公开指数;公钥表示为128字节的字符串,但在采用大端方式时不是有效的公用模数,因为这是一个1031位整数,可被2631907整除(在采用小端方式时可能是正确的)。 br />
在ReverseEngineering.SE上,您的问题可能会更好,因为它更多地是关于逆向工程而非加密理论。如果您愿意,我可以将其迁移到那里。

#1 楼

RSA公用密钥由两部分组成:模数m(两个大质数p和q的乘积)和公用指数e(较小且通常为固定数,通常为3或65537)。 RSA私钥由与公钥和私钥d相同的模数m构成,其数字选择为xed≡x(mod m)。通常,d将与m大致相同或略短。 (或者,也可以存储质数p和q,并与e一起计算模数m和私有指数d。)无论如何,您的1024位数字看起来就像它可能是模数(尽管是这样,但肯定不应该有任何小因素)。您确定硬件中没有存储其他数字可以作为私有指数吗?

还确定设备实际上是在进行RSA加密而不是RSA签名吗?从表面上看就像“用私钥加密”(尽管使两个操作安全所需的填充方案的细节差别很大)? ,但根据您所提供的额外信息以及我可以一眼从Vigik网站上收集到的信息,看来他们正在做的事情可能是这样的:


收费服务拥有私钥,而访问控制设备具有相应的公钥。该卡可能没有任何一个密钥,也可能根本没有加密。
对卡进行充电后,充电服务会创建一条消息,指出该卡已获授权访问特定位置,直到一个特定的时间。然后,它使用私钥对该消息签名,并将签名的消息发送到卡。
当使用卡请求访问时,它会将签名的消息传输到访问控制设备,以验证该授权对该位置有效,未过期并且签名正确。

至少,这或多或少是我设计这样的系统的方式。这种设计的一个优点是,卡和访问控制设备都不需要知道私钥,因此即使其中任何一个被盗和分析,也不会受到损害。 (收费服务确实需要私钥,但是大概可以比卡片和访问控制设备更好地保护它,甚至可以通过在远程服务器上进行实际签名来实现。)它也不需要卡片本身来做加密,这使它们的实现更容易,更便宜。拥有自己的私钥,在授权消息中包含相应的公钥,并要求访问控制设备要求零知识证明该卡确实知道其声称拥有的私钥,这将使卡真正变得无法克隆,甚至是暂时无法克隆无需进行认真的逆向工程工作即可提取密钥。)

评论


嘿,谢谢。根据维基百科的文章(并由我在代码中看到的证实):fr.wikipedia.org/wiki/Vigik>使用RSA加密(使用768或1024位私钥)的服务的“收费设备”允许将徽章发行用户。 >通过将服务的公共密钥添加到系统来控制建筑物的访问。我不确定它是加密的还是签名的-有什么办法可以告知?我确定的是,这里拥有的是公钥。

–swx
13-10-20在18:34

根据您提供的额外信息,看来他们可能正在执行RSA签名。 (当然,他们是否做得正确是另一回事。)特别是,该卡似乎可能包含私钥,或者(更可能是)仅包含收费服务发行的预签名令牌,然后,访问控制设备使用公共密钥进行验证。

–伊尔马里·卡洛宁(Ilmari Karonen)
13-10-21在16:54

非常感谢@Ilmari Karonen的更新!因此,从理论上讲,如果我拥有(来自访问控制单元的)公共密钥-卡上具有1024位签名,则从理论上讲,我应该能够通过公共密钥验证卡签名-这将证明理论?在这种情况下,我想这都是一个完整的循环-我将如何去做呢?再次感谢。

–swx
13-10-21在18:19

就我们所知,您仍然没有公共指数,对吗?

–mikeazo
13-10-21在18:36

@swx:您可能拥有的是模数。 (可能是模数和公共指数以某种方式编码到单个位串中,但我对此表示怀疑。)公共指数可能被硬编码到RSA实现中。如果找不到类似的内容,建议您尝试使用最常见的值(65537 = 0x10001和3)。您还需要弄清楚模数是如何编码的。它可以是大端或小端格式,也可以是一些有趣的混合端格式,也可以是类似BER的格式。您可以通过尝试将其分解为一个因素进行检查-有效的RSA模数不应有任何小的因素。

–伊尔马里·卡洛宁(Ilmari Karonen)
13-10-22在11:29