【问题标题】:What determines the BIGNUM size in different crypto algorithms?什么决定了不同加密算法中的 BIGNUM 大小?
【发布时间】:2020-06-14 21:26:27
【问题描述】:

我使用 OpenSSL。 我看到不同的 openssl 类型使用 BIGNUM 类型。

例如:

  1. DSA 签名
typedef struct DSA_SIG_st {
    BIGNUM *r;
    BIGNUM *s;
} DSA_SIG;
  1. ECDSA 签名
typedef struct ECDSA_SIG_st {
    BIGNUM *r;
    BIGNUM *s;
} ECDSA_SIG;
  1. 椭圆曲线私钥
struct ec_key_st {
    int version;
    EC_GROUP *group;
    EC_POINT *pub_key;
    BIGNUM *priv_key;
    unsigned int enc_flag;
    point_conversion_form_t conv_form;
    int references;
    int flags;
    EC_EXTRA_DATA *method_data;
} /* EC_KEY */ ;
  1. RSA 结构
struct rsa_st {
    /*
     * The first parameter is used to pickup errors where this is passed
     * instead of aEVP_PKEY, it is set to 0
     */
    int pad;
    long version;
    const RSA_METHOD *meth;
    /* functional reference if 'meth' is ENGINE-provided */
    ENGINE *engine;
    BIGNUM *n;
    BIGNUM *e;
    BIGNUM *d;
    BIGNUM *p;
    BIGNUM *q;
    BIGNUM *dmp1;
    BIGNUM *dmq1;
    BIGNUM *iqmp;
    /* be careful using this if the RSA structure is shared */
    CRYPTO_EX_DATA ex_data;
    int references;
    int flags;
    /* Used to cache montgomery values */
    BN_MONT_CTX *_method_mod_n;
    BN_MONT_CTX *_method_mod_p;
    BN_MONT_CTX *_method_mod_q;
    /*
     * all BIGNUM values are actually in the following data, if it is not
     * NULL
     */
    char *bignum_data;
    BN_BLINDING *blinding;
    BN_BLINDING *mt_blinding;
};

BIGNUM 在 OpenSSL 中是:

struct bignum_st {
    BN_ULONG *d;                /* Pointer to an array of 'BN_BITS2' bit
                                 * chunks. */
    int top;                    /* Index of last used d +1. */
    /* The next are internal book keeping for bn_expand. */
    int dmax;                   /* Size of the d array. */
    int neg;                    /* one if the number is negative */
    int flags;
};

我不明白如何为特定算法选择 bignums 以及 bignum 数组的大小?

【问题讨论】:

    标签: openssl bignum


    【解决方案1】:

    首先你不要自己分配实际的 bn->d 值; BN_* 例程为您执行此操作,并根据需要重做/更改它。对于未过时的 OpenSSL 版本,这些结构(以及几乎所有其他结构)是不透明的,您根本无法直接访问它们,尽管我可以理解想要了解它们。

    对于使用数字(而不仅仅是位模式)的加密算法,您使用的数字取决于算法。对于 RSA,请参阅the wikipedia article,如果与 RSA 实验室的 PKCS1 链接不再有效(在 EMC 和戴尔之后),请改用稳定的 IETF 重复 RFC 2313、2437、4347、8047。来自 ANSI/X9 和 ISO 的 RSA 标准还有其他标准,但它们使用较少且没有显着差异。对于 DSA,请参阅 again wikipedia 和(免费)FIPS。对于 ECDSA,您可以从SECG 看到付费的 X9.62 或免费的 SEC1,但实际上它只是将 DSA 直接改编为(大)类 Weierstrass 形式的椭圆曲线。对于 DSA 和 ECDSA,出现在签名中的值是计算出来的,从不挑选,尽管它们受到每个操作随机数 k 的影响 ,随机数 k 可以而且通常是随机挑选的,在 [1 , n-1] 其中 n 是子组阶数(大小)。请注意,对于 ECDSA 最常用的“素数”曲线,如 P-256 和 P-384,曲线的设计使得子组阶等于曲线阶,而曲线阶又接近但不等于底层素数场。然而,这是那些特定曲线的属性,而不是一般的 ECDSA 或 ECC。

    在实践中,所有算法的密钥都应该通过直接调用适当的密钥生成函数或使用EVP_PKEY_* API 来生成(在 OpenSSL 中),或者从其他软件或系统导入正确实施的流程。类似地,签名应该通过直接或通过EVP调用签名函数来创建,或者从其他正确创建它们的东西接收。所有 OpenSSL 代码都是免费的(包括语音和啤酒),因此您可以查看它并了解它的作用;有些人(包括我)发现至少有时在具有良好源级调试器的系统中编译此类代码并逐步查看它的作用是有帮助的。

    标准警告:如果您只是想玩加密货币或 OpenSSL 等特定实现,请自行解决。如果您要编写旨在提供安全性的软件,请不要通过猜测或反复试验来完成;要么使用由知道自己在做什么的人编写的(现有)软件,要么雇用或咨询这些人。 非常很容易编写看起来可以工作并通过测试但实际上不安全的“安全”软件,并且(与您不同)真正了解该主题并知道如何发现这些缺陷的人将是你或你用户的敌人。

    【讨论】:

      猜你喜欢
      • 2013-04-21
      • 2017-06-06
      • 2020-03-06
      • 2011-10-26
      • 2016-02-16
      • 1970-01-01
      • 2012-12-10
      • 2014-08-23
      相关资源
      最近更新 更多