【问题标题】:Inconsistent RSA encryption length result不一致的 RSA 加密长度结果
【发布时间】:2019-01-11 03:12:52
【问题描述】:

我正在使用外部库 OpenSSL-Universal 使用 RSA_PKCS1_PADDING 加密密码。不幸的是,char 编码结果的输出长度不一致。假设我有 2048 位模数,我期望的长度结果是 128,否则它将无法解密回纯文本。

BIGNUM *xponent = BN_new();
    BIGNUM *modulus = BN_new();
    BN_hex2bn(&xponent,xponentInHex);
    BN_hex2bn(&modulus,modInHex);

    RSA *rsa = RSA_new();
    rsa->e = xponent;
    rsa->n = modulus;
    char encoded[1024] = {0};

    RSA_public_encrypt(
        (int)strlen(charString),// from len
        (const unsigned char *)charString, // from
        (unsigned char *)encoded, // to
        rsa,
        RSA_PKCS1_PADDING
    );

    RSA_free(rsa);
NSLog(@"%lu", strlen(encoded));

如果我的工具有什么问题,或者如果您对不一致的长度结果有一些解释,请告诉我

【问题讨论】:

    标签: ios objective-c openssl rsa


    【解决方案1】:

    来自RSA_public_encrypt 的加密输出不是字符串,因此您无法使用strlen 检查它的长度。我希望您确实意识到 strlen 会将加密输出中看到的任何 '\0' 视为字符串的结尾,并将返回该点之前的字节数作为字符串的长度。但是,加密缓冲区可以有有效字节,可以是 '\0'。

    另外,请注意 RSA_public_encrypt 返回您应该使用的加密数据的长度。

    【讨论】:

    • 我假设你没有尝试使用 Universal-openssl pod。
    • 我的回答是基于你的帖子:NSLog(@"%lu", strlen(encoded));。所以,我假设你正在使用 strlen。但是,RSA_public_encrypt 不能返回字符串。
    【解决方案2】:

    可以尝试使用Objective-C-RSA第三方库,或者阅读源码自行实现。

    【讨论】:

    • hummm.. 实际上我使用 openssl-universal 实现 rsa,因为我已经有了模数键和指数。但是感谢您的建议
    猜你喜欢
    • 2016-07-15
    • 2013-08-15
    • 2010-12-02
    • 2013-07-16
    • 2020-11-03
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多