我的印象是 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");
}
这给了我一个结果;
a7c5832cf6390bcf75612e46c55759167e02173b2c6741ec4779af5d88488df8bfa6a6ba4c
fbc93d730dd3b4e681fca34d23c862712954ec85c087d9b36efa725b942fa7d8383019bcba
d467a1b31a3b0aeccf85cf1b4e4600801e3d40db75640f7e56f9bbb2a525d58e6decd02400
2049cadef9feea23f72f0fef72e9d2a5e9209011b7726422561f8fdfc7e983c28b600ff875
14b6ea4bb59addfaf8492ba71261d3837d9ae82507ab2f6cb7aaa0fe647f5d8d469b7a5e83
7b3bdf9994be8e621cdb04cec955ddd44170b9899daec891b492562b0df3d30d50367c710d
81400aefadb494d6f13d37237cf015280879d787de4d58ef3a5d61a200dd68642fdf
然后我使用了相同的方法private.pem并做了我认为在 Python 中等效的操作;
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
这给了我一个非常不同的结果;
ac3de0ad667f26912b71baaf3f0c84198482a1822ef05f1d0b339a9e13be0fdc74c446bf74
0e14d07edbff1d893eb9a9745ee42501c50a7a0ec1352f96bf72c603afe6d4709ef3ea936a
4cda182dfc70d0a76967e79120f02e017e8f9aa30b1b444b5fe46396d6908e1e55febb948e
69cc1dcd9f9fbd44f449056d0655489834b564216c81c19f193548a53c77af8683d4c77d06
为什么 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 中没有看到任何类型的填充选项。
大话西游666
相关分类