【问题标题】:LockBox3 Generate the same RSA Key PairsLockBox3 生成相同的 RSA 密钥对
【发布时间】:2015-10-25 14:53:52
【问题描述】:

我最近决定遇到 LockBox3 加密组件集,并遵循有关如何使用以下链接生成 RSA 密钥对的简单文档:

http://lockbox.seanbdurkin.id.au/Generate+an+RSA+key

(官方文档)

当我应用该过程时,我能够生成公钥和私钥并导出到文件。

但是当我决定使用相同的代码生成新的密钥对时,它仍然是相同的公钥和私钥(完全相同)

通常情况下不应该这样,我们应该能够生成无限不同的密钥对,以防私钥因某些原因泄露。

是否有任何其他步骤可以生成全新的密钥对或者这是一个错误?

我正在使用 Delphi XE6 并运行 Lockbox 3 组件(SourceForge 提供的最新版本)

提前致谢

【问题讨论】:

  • 不要使用密码箱来生成加密密钥。时期。 “uTPLb_Random”中的代码显然不安全。
  • @CodesInChaos:你能具体点吗? uTPLb_Random 中的哪些内容不安全?

标签: delphi cryptography key rsa lockbox-3


【解决方案1】:

在生成之前随机化你的种子。为获得最佳结果,请勿使用内置的随机化程序。

【讨论】:

    【解决方案2】:

    uTPLb_Random 单元中的 TRandomStream.Randomize 方法中出现输入错误。现在它已修复(请参阅uTPLb_Random.pas on GitHub)。

    procedure TRandomStream.Randomize();
    {$IFDEF SMWINDOWS} //Should be MSWINDOWS
    var
      hProv: THandle;
      dwProvType, dwFlags: DWORD;
      Provider1: string;
      hasOpenHandle: boolean;
    {$ENDIF}
    begin
    {$IFDEF SMWINDOWS} //Should be MSWINDOWS
      Provider1 := Provider;
      dwProvType := PROV_RSA_FULL;
      dwFlags := CRYPT_SILENT;
      hasOpenHandle := CryptAcquireContext(hProv, nil, PChar(Provider), dwProvType, dwFlags);
      try
        if (not hasOpenHandle) or (not CryptGenRandom(hProv, SizeOf(FValue), @FValue)) then
      FValue := TimeStampClock();
      finally
        if hasOpenHandle then
          CryptReleaseContext(hProv, 0);
      end;
      Crunch();
    {$ENDIF}
    end;
    

    修正后每次生成不同的密钥。

    【讨论】: