我的印象是 PyCrypto 是 OpenSSL 的直接包装器,但我似乎得到了意想不到的结果。我用 C 写了一个简单的测试;int main() { const unsigned char test[] = "TEST_TEST_TEST"; FILE *privateFile = fopen("private.pem", "r"); RSA *privateRsa = PEM_read_RSAPrivateKey(privateFile, NULL, NULL, NULL); unsigned char *target = malloc(512); int len = RSA_private_encrypt(strlen(test), test, target, privateRsa, 1); for (int i = 0; i < 256; i++) { printf("%02x", target[i]); } printf("\n");}这给了我一个结果;a7c5832cf6390bcf75612e46c55759167e02173b2c6741ec4779af5d88488df8bfa6a6ba4cfbc93d730dd3b4e681fca34d23c862712954ec85c087d9b36efa725b942fa7d8383019bcbad467a1b31a3b0aeccf85cf1b4e4600801e3d40db75640f7e56f9bbb2a525d58e6decd024002049cadef9feea23f72f0fef72e9d2a5e9209011b7726422561f8fdfc7e983c28b600ff87514b6ea4bb59addfaf8492ba71261d3837d9ae82507ab2f6cb7aaa0fe647f5d8d469b7a5e837b3bdf9994be8e621cdb04cec955ddd44170b9899daec891b492562b0df3d30d50367c710d81400aefadb494d6f13d37237cf015280879d787de4d58ef3a5d61a200dd68642fdf然后我使用了相同的方法private.pem并做了我认为在 Python 中等效的操作;from Crypto.Cipher import PKCS1_v1_5from Crypto.PublicKey import RSA这给了我一个非常不同的结果;ac3de0ad667f26912b71baaf3f0c84198482a1822ef05f1d0b339a9e13be0fdc74c446bf740e14d07edbff1d893eb9a9745ee42501c50a7a0ec1352f96bf72c603afe6d4709ef3ea936a4cda182dfc70d0a76967e79120f02e017e8f9aa30b1b444b5fe46396d6908e1e55febb948e69cc1dcd9f9fbd44f449056d0655489834b564216c81c19f193548a53c77af8683d4c77d06为什么 python 包装器不会产生与底层 C 库相同的结果?我猜我在 Python 方面做了一些不正确的事情,但我不知道那可能是什么。编辑:为了清楚起见,C 代码正在返回我想要的内容,我需要让 Python 返回相同的内容。在进行更多挖掘时,我认为我的问题是我需要RSA_PKCS1_PADDING在 Python 代码中指定。当我尝试在 C 端解密时,我回来了;4144797508:error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01:rsa_pk1.c:103:4144797508:error:04067072:rsa routines:RSA_EAY_PUBLIC_DECRYPT:padding check failed:rsa_eay.c:773:奇怪的是,我在 pycrypto API 中没有看到任何类型的填充选项。
2 回答
大话西游666
TA贡献1817条经验 获得超14个赞
为什么 Python 实现不会产生与 C 代码相同的结果?因为您使用的是 PKCS #1.5 签名算法。
PKCS #1.5 要求在签名之前向消息添加随机填充。因此,多次签署同一条消息每次都会给出不同的值——如果您重复运行 Python 版本,您将看到该值。OpenSSL 文档是一个难以理解的泥潭,所以我不能确切地说明为什么每次使用 C 版本都会获得相同的签名,但我怀疑您没有初始化随机数生成器或其他东西。
添加回答
举报
0/150
提交
取消