【问题标题】:Is there a way to generate large primes in C#, without the use of an external library?有没有办法在 C# 中生成大素数,而不使用外部库?
【发布时间】:2011-12-10 11:13:50
【问题描述】:

我需要为密码学项目生成大素数。我注意到 .NET 4.0 有一些内置的加密原语(例如 RSA),它们使用随机生成的大素数(RSA 的 p,q)。他们都使用一个公共的内置库,它是公共的,可以从他们的类范围之外访问,还是我必须使用一个外部库(我知道有简单的算法用于素性测试,我只是不想实施比我必须做的更多。)。

【问题讨论】:

  • @Corbin - 并非所有素数都是奇数(但大的会是)
  • 我想我说错了。但是,2 不是唯一的非奇数吗?
  • 是的,2 是唯一的偶数。
  • 2 是最奇怪的素数 ...

标签: .net cryptography rsa primes biginteger


【解决方案1】:

在 .NET v4(及更高版本)中,Microsoft 提供了一个新程序集 System.Numerics.dll,其中包括一个 BigInteger 类型。但是它没有提供任何检查素数的方法。

Mono(从 1.0 之前开始)还提供了一个位于其 Mono.Security.dll 程序集中的 [BigInteger][3] 类型。您可以按原样使用,也可以将质数检查方法(存在几种方法)移植到新的 Microsoft BigInteger 类型。

他们是否都使用一个公共的内置库,该库是公共的,可以从他们的类范围之外访问

是的,RSACryptoServiceProviderDSACryptoServiceProvider 都调用 CryptoAPI 来执行此操作。但是 CAPI 不会公开它自己的 BigInteger 代码(甚至是本地代码),所以它不会帮助你。

【讨论】:

    【解决方案2】:

    在您需要的范围内生成一个大数。测试它是否是素数。如果不是,请拒绝并重复。

    对于测试,只需使用质数高达 1500 的试除法,然后切换到 Miller-Rabin。使用正确实施的 Miller-Rabin,发生硬件故障的可能性大于错误地将复合标记为素数。

    【讨论】:

      猜你喜欢
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多