我的程序中嵌入的相同公钥作为char数组,在x86(256字节)和从RSA_size()返回的ARM926(252字节)中获得不同的密钥大小。 256是预期的,并且在x86上确实运行良好,当然在调用RSA_public_decryption()时在ARM中失败,如下所示。
unsigned char pubkbuf[] =
"-----BEGIN PUBLIC KEY-----\n"
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1E+0NuRsVNULh3SFsTvV\n"
"7vFrDs97YvrCFvLc01ZTE79CW8LokGoYhQUwhM+nuD4+JlpozTwVCNHOfp31thrt\n"
"vAwKmGLIi2UpGUJktTCHcB8lcP0xMY8+Q1Z/l4N5LP7LvHozXrlws8dEtOvJiPez\n"
"pQCuBoKl6Xpr8tHHiLiALaXueWhJ7xxuyZZUyk8xWbQufiqXz+MFJImLHQOyC9zc\n"
"W64QG0lu4QqLBOA/QzuuIbdZqPcydH+pW1GWBuPEVBe3nxooTSBl+R0xHZPzGCdq\n"
"GhecCciJLFtt8/C+05teXDWCPBSqJqZv47l1zEIiqjKWJ5k8A9yx76+EpcGN1Cx9\n"
"CQIDAQAB\n"
"-----END PUBLIC KEY-----\n"
;
int ksz = sizeof (pubkbuf);
bio = BIO_new_mem_buf (pubkbuf,ksz);
RSA* rsapubkey = RSA_new();
PEM_read_bio_RSA_PUBKEY(bio, &rsapubkey, NULL, NULL);
dump_buffer_hex (rsapubkey,272);
printf("key size= %d\n", (RSA_size(rsapubkey));
hdrbuf = (unsigned char*) malloc (RSA_size(rsapubkey));
hdrsz = RSA_public_decrypt (sigsz, sigbuf,
hdrbuf,
rsapubkey,
RSA_PKCS1_PADDING);
尝试过不同版本的编译器,gcc-4.1 / gcc-4.7(带/不带-m32 x86)和不同版本的libcrypto,libssl(x86中的32位和64位)。都得到了相同的结果。需要你的帮助来解决问题。
答案 0 :(得分:1)
添加一些缺少的括号,我在mac上以32位模式获得256字节,在64位模式下获得segfault。
我发现添加了
#include <openssl/pem.h>
修复了段错误并得到了256.令人惊讶!
起初我怀疑你使用sizeof(pubkbuf)
计算的额外空字节(你可以将-1传递给BIO_new_mem_buf
以让它为你做strlen
)。然后我想也许你应该使用PEM_read_bio_RSA_PUBKEY
的返回值而不是第二个arg,虽然我无法在任何地方找到任何doco。
所以#include是我最好的猜测。
OpenSSL看起来像是一桶笑声。