当前位置: 首页 > 知识库问答 >
问题:

什么决定了不同加密算法中的BIGNUM大小?

锺离烈
2023-03-14

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

例如:

  1. 每日生活津贴签名
typedef struct DSA_SIG_st {
    BIGNUM *r;
    BIGNUM *s;
} DSA_SIG;
typedef struct ECDSA_SIG_st {
    BIGNUM *r;
    BIGNUM *s;
} ECDSA_SIG;
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 */ ;
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;
};

OpenSSL中的< code>BIGNUM是:

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;
};

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

共有1个答案

莫英卓
2023-03-14

首先,您不分配实际的bn-

对于使用数字(而不仅仅是位模式)的密码算法,您使用的数字取决于算法。对于RSA,请参阅维基百科文章,如果指向RSA实验室的PKCS1链接不再有效(后EMC和Dell),请使用稳定的IETF重复RFC 2313、2437、4347、8047。ANSI/X9和ISO中还有其他RSA标准,但它们使用较少,并且没有显着差异。对于DSA,请参阅维基百科和(免费)FIPS。对于ECDSA,您可以看到SECG的付费X9.62或免费SEC1,但实际上这只是DSA对(大)类Weierstrass形式椭圆曲线的直接适应。对于DSA和ECDSA,签名中出现的值都是计算的,而不是选择的,尽管它们受到每次操作nonce k的影响,该nonce k可以并且通常是随机选择的,均匀地在[1, n-1]中,其中n是子群顺序(大小)。注意,对于最常用于ECDSA的“素数”曲线,如P-256和P-384,曲线的设计使子群顺序等于曲线顺序,而曲线顺序又接近但不等于底层素数场的模数。然而,这是这些特定曲线的属性,而不是ECDSA或ECC的一般属性。

实际上,所有算法的密钥都应该通过直接调用适当的密钥生成函数或使用< code>EVP_PKEY_* API来生成(在OpenSSL中),或者从通过正确实现的过程生成它们的一些其他软件或系统导入。类似地,签名应该通过直接或经由< code>EVP调用签名函数来创建,或者从正确创建它们的其他设备接收。所有的OpenSSL代码都是免费的(包括语音和啤酒),所以你可以看看它,看看它做了什么;有些人(包括我)发现,在一个有良好的源代码级调试器的系统中编译这样的代码,并逐步查看它做了什么,至少有时是有帮助的。

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

 类似资料:
  • 我正在尝试使用画布元素,但高度不能超过像素。如果我尝试使用像素,我会在IE11中得到。这在Chrome中工作正常。画布用于PDF生成,我真的没有时间将生成移动到服务器。 我在谷歌上搜索了一下,看起来大小可能会因平台和浏览器的不同而有所不同。 是浏览器分配的内存和内存设置决定了这一点吗? 编辑:我在这里找到了一些信息: 看起来我可以有两倍的尺寸。也许这只是为了IE9。

  • 在JavaServlet环境中,哪些因素是同时用户数量的瓶颈。 服务器每个端口允许的HTTP连接数 还有其他因素吗? 编辑:为了不考虑业务逻辑,假设只有一个servlet在Log4j上打印一行。 我的Tomcat服务器能同时处理6000个HTTP连接吗?为什么不呢(文件处理?每个请求的CPU时间?) 为每个连接生成的垃圾量是否会产生影响?例如,如果Tomcat为每个HTTP连接创建并留下20KB的

  • 我有两台Linux机器(都是虚拟机),一台有12GB内存,另一台有8GB内存。 我尝试在两台机器上启动相同的java程序,并尽可能地使用最大堆大小(使用-Xmx标志)。以下是我得到的结果。 12GB 机器容量: 9460MB 8GB 机器容量: 4790MB 如果我指定的最大堆大小超出了上述限制,我会得到以下错误。 我检查了两个系统中的空闲内存(使用< code>free命令),得到如下结果。 <

  • 问题内容: 我有两台linux机器(都是VM),一台有12GB内存,另一台有8GB内存。 我试图在两台机器上启动相同的Java程序,并且最大可能的最大堆大小(使用-Xmx标志)。以下是我得到的结果。 12GB机器:9460MB 8GB机器:4790MB 如果我指定的最大堆大小超出了限制,我将得到以下错误。 我检查了两个系统中的可用内存(使用命令),然后得到关注。 12GB机器:大约3GB可用空间。

  • 问题内容: 是否有一个针对JavaScript或内置函数的bignum库,我可以像这样包含 ? 我认为我的用户更喜欢在网页上输入数字,然后等待7秒钟才能得到结果,而不是下载一个可执行文件并单击一堆“此可执行文件可能会损害您的计算机”警告屏幕以进行安装。 我考虑过根据biginteger或建立自己的基础。还是建议您从JavaScript调用Java bignum库(例如apfloat)? 问题答案:

  • 我已经尝试使用cipher.getinstance(“rsa/ecb/pkcs1padding”),但没有给出预期的结果。 感谢所有的帮助。祝你有美好的一天。