2

我正在尝试执行以下操作:

我有一个使用 ECC 生成标准 Rijndael 密钥的软件(不是AES... 有区别:AES 仅支持 128、192 和 256 位的密钥大小,而 Rijndael 最初支持 160 和 224 位。当我在看这个软件的时候,这让我一开始觉得很痛苦。)我已经能够确定它做了以下事情:

它有几种模式,但在最弱的模式下,它使用 ECC secp160r1 生成 160 位密钥(因此是 Rijndael 和NOT AES)。我已经能够在我自己的软件中获取“公共”值并使用私钥,并且使用 openssl 调用,能够生成相同的密钥并解密我需要解密的数据。

在最好(最强/最难,你有什么)模式下,它几乎做同样的事情,但是,它使用 ECC sect571k1 生成一个密钥,并且只占用它为 Rijndael 256 位密钥生成的 72 个字节的前 32 个字节(在这种情况下,您可以说 AES256)。

但是,在另一种模式下,它似乎在做同样的事情,但是当我尝试像以前一样做同样的事情时,我没有得到相同的共享密钥。

如果您使用 Alice 和 Bob 的标准定义:

da = Alice's secret key
db = Bob's secret key
Qa = Alice's public key
Qb = Bob's public key
S  = Shared secret

我有:

daQb --> The public value sent from Alice.
db   --> My "secret" key.
Qb   --> My "public" key.
Sc   --> The "correct" shared secret as computed by above program

我检查了我的 Qb 和 daQb 是否在 sect283k1 曲线上。如果我使用 sect283r1,事情就会失败,并且我的点不会使用 Openssl EC_POINT、EC_KEY、EC_GROUP 函数在该曲线上注册(我现在会发布代码,但我面前没有它。只要我做,我会尝试在这里发布)。正如我所说,我已经能够重现其他两种模式,而且它似乎工作正常。但是,在这种模式下,当我计算密钥时,我得到 Sw --> 由我的程序计算的“错误”共享密钥。

所以,我的问题是:我是否有足够的信息来确定我是否使用了错误的数据库?我不认为我是,因为在其他两种情况下,我可以获得数据库并且它工作正常。不幸的是,我没有该程序的源代码。我正在尝试创建一个可以处理原始工具生成的数据的工具。

我曾想过尝试反转 Qb 并将数据乘以 daQb,但真正要做的就是让我得到 da,虽然这很有趣,但并没有让我找到一种可以在我必须确定 db 的共享密钥上使用它的方法,检查我的工作。

我想到的另一件事是,可能使用了与 sect283k1 类似的曲线,但不是 sect283k1(即可能是一些不同的 G?我不确定是否可以在该曲线上使用另一个生成器,但我不认为每条曲线只有一个生成器,但也许这是错误的,也许另一个生成器会产生不同的结果......即正确的结果)。

无论如何,我已经尝试了几件事,只是为了使用其他程序正在使用的相同数据生成相同的错误密钥数据。也许有一些远超 EC 数学知识的人(几乎任何人都会比我自己的更好,但我希望有人可以帮助我了解我所缺少的东西)可以告诉我一种可以调和我所得到的东西的方法其他工具得到什么。

不幸的是,我可以在设置 Rijndael 键之前停下来看看它将被设置为什么。我可以找到密钥的那部分并查看来自 ECDH_compute_key 操作的原始数据(这似乎本质上是 daQb 和 db 之间的 EC_POINT_mul (如果我对 Diffie-Hellman 密钥交换有足够的了解......我已经验证了这一点)无论如何使用一些openssl调用),并且我知道其他一些事情,但是我找不到可以帮助我了解操作的Bignum / EC代码。所以我正在寻找另一种给猫剥皮的方法.

感谢任何可以提供帮助的人。

4

0 回答 0