数字签名如何处理大整数?
How does a digital signature handle big-integers?
数字签名如何处理大整数?
为了复杂性,数字签名使用大整数作为参数。
从上图看,除了变量a
,所有变量都是(或可以是)大整数。当需要验证签名时,如何处理计算问题?
Ya
、S1
、S2
和 q
是大整数。在大整数之间进行计算真的很难。有一种方法可以减少计算时间,否则人们将无法使用数字签名。
有谁知道如何处理大整数??
你所说的“big-integer”,也称为“bignum”算法,与 AES 等对称加密相比,就每个字节处理的 CPU 个周期而言,确实很慢。但是,在 public 密钥加密中,例如在数字签名中,协议的设计方式最大限度地减少了 bignum 算术的使用。例如,要对一条非常大的消息进行数字签名,bignum 算术不会应用于整个消息。取而代之的是,该消息首先由加密强度高的散列函数压缩,该散列函数生成一个小的摘要,例如 384 位。然后,bignum 算法只应用于这个小摘要。哈希函数非常快。例如,在 2015 年发布的 Intel SkyLake CPU 上,如 Core i7 6700K,散列函数每字节消息大约需要以下 CPU 周期数:MD5 - 5,SHA1 - 4 , SHA2-384 - 5, SHA3-384 - 11.
其他基于public密钥密码学的安全协议也是如此,比如在TLS中:bignum算法只在会话开始时使用,而进一步的数据传输不涉及bignum算法。并且有针对“会话恢复”的 TLS 协议的扩展,有助于进一步减少 bignum 算术的使用。
In computer science, arbitrary-precision arithmetic, also called
bignum arithmetic, multiple-precision arithmetic, or sometimes
infinite-precision arithmetic, indicates that calculations are
performed on numbers whose digits of precision are limited only by the
available memory of the host system. This contrasts with the faster
fixed-precision arithmetic found in most arithmetic logic unit (ALU)
hardware, which typically offers between 8 and 64 bits of precision.
(source: Wikipedia article on Arbitrary-precision arithmetic)
一些编程语言需要一个库来处理大数运算,而其他语言则内置了这个库。例如,您可以直接使用Python编程语言来进行算术运算大量而不用担心链接库。 Python 支持“bignum”整数类型,可以处理任意大的数字。在Python2006年发布的2.5版本,或者以后的版本中,这个类型被称为long,与int类型分开,但是解释器会自动使用更合适的类型。 在Python,你只需要进行标准的数学运算,任何超过32位限制的数字都会自动透明地转换为bignum。
您可以找到 List of libraries that support "bignum" arithmetic for various programming languages at Wikipedia。
经过搜索我找到了解决方案。
这个想法是使用带有三个参数的 pow() 。
原公式为:
v2 = (pow(y_a,s1)*pow(s1,s2))%q
当 pow() 函数只有两个参数时,它没有三个参数那么快。在这种情况下 pow() 只有 y_a 和 s1 两个参数。
新公式为:
v2 = pow(y_a,s1,q)%q * pow(s1,s2,q)%q
使pow()有3个参数,计算速度大幅提升
数字签名如何处理大整数?
为了复杂性,数字签名使用大整数作为参数。
从上图看,除了变量a
,所有变量都是(或可以是)大整数。当需要验证签名时,如何处理计算问题?
Ya
、S1
、S2
和 q
是大整数。在大整数之间进行计算真的很难。有一种方法可以减少计算时间,否则人们将无法使用数字签名。
有谁知道如何处理大整数??
你所说的“big-integer”,也称为“bignum”算法,与 AES 等对称加密相比,就每个字节处理的 CPU 个周期而言,确实很慢。但是,在 public 密钥加密中,例如在数字签名中,协议的设计方式最大限度地减少了 bignum 算术的使用。例如,要对一条非常大的消息进行数字签名,bignum 算术不会应用于整个消息。取而代之的是,该消息首先由加密强度高的散列函数压缩,该散列函数生成一个小的摘要,例如 384 位。然后,bignum 算法只应用于这个小摘要。哈希函数非常快。例如,在 2015 年发布的 Intel SkyLake CPU 上,如 Core i7 6700K,散列函数每字节消息大约需要以下 CPU 周期数:MD5 - 5,SHA1 - 4 , SHA2-384 - 5, SHA3-384 - 11.
其他基于public密钥密码学的安全协议也是如此,比如在TLS中:bignum算法只在会话开始时使用,而进一步的数据传输不涉及bignum算法。并且有针对“会话恢复”的 TLS 协议的扩展,有助于进一步减少 bignum 算术的使用。
In computer science, arbitrary-precision arithmetic, also called bignum arithmetic, multiple-precision arithmetic, or sometimes infinite-precision arithmetic, indicates that calculations are performed on numbers whose digits of precision are limited only by the available memory of the host system. This contrasts with the faster fixed-precision arithmetic found in most arithmetic logic unit (ALU) hardware, which typically offers between 8 and 64 bits of precision. (source: Wikipedia article on Arbitrary-precision arithmetic)
一些编程语言需要一个库来处理大数运算,而其他语言则内置了这个库。例如,您可以直接使用Python编程语言来进行算术运算大量而不用担心链接库。 Python 支持“bignum”整数类型,可以处理任意大的数字。在Python2006年发布的2.5版本,或者以后的版本中,这个类型被称为long,与int类型分开,但是解释器会自动使用更合适的类型。 在Python,你只需要进行标准的数学运算,任何超过32位限制的数字都会自动透明地转换为bignum。
您可以找到 List of libraries that support "bignum" arithmetic for various programming languages at Wikipedia。
经过搜索我找到了解决方案。 这个想法是使用带有三个参数的 pow() 。 原公式为:
v2 = (pow(y_a,s1)*pow(s1,s2))%q
当 pow() 函数只有两个参数时,它没有三个参数那么快。在这种情况下 pow() 只有 y_a 和 s1 两个参数。
新公式为:
v2 = pow(y_a,s1,q)%q * pow(s1,s2,q)%q
使pow()有3个参数,计算速度大幅提升