【问题标题】:Convert Integer back to SecByteBlock?将整数转换回 SecByteBlock?
【发布时间】:2015-04-03 18:50:39
【问题描述】:

我正在使用 Crypto++ 库:

DH dh;
AutoSeededRandomPool rnd;
SecByteBlock priv(dh.PrivateKeyLength());
SecByteBlock pub(dh.PublicKeyLength());

这会使用 diffie-hellman 生成私钥和公钥:

dh.GenerateKeyPair(rnd, priv, pub);

在这里,我将无法读取的私钥和公钥转换为 Integer(数字,例如 123)

// SecByteBlock -convert-> Integer
Integer a, b;
a.Decode(priv.BytePtr(), priv.SizeInBytes());
b.Decode(pub.BytePtr(), pub.SizeInBytes());

我从Integer 转换回SecByteBlock 的代码是什么?

Integer -convert-> SecByteBlock

【问题讨论】:

  • 如果你从一个不太安全的类型构造它,SecByteBlock 的想法会不会丢失?如果我理解名称(API 严重缺乏信息),那么这个想法是这个块在安全内存中。当您从不安全的内存中生成它时,大部分安全性都会丢失。
  • @MaartenBodewes - Integer 也将 bignum 字节存储在基于 SecBlock 的类型中(SecByteBlockSecBlock<byte> 的类型定义)。根据对源代码的粗略阅读,唯一的安全功能是在释放时将内存归零;我没有看到它阻止交换到磁盘的证据。我想,例如,面对 Heartbleed 式攻击归零可以提供一些好处,但在 OP 问题的背景下,真正缓解泄漏密钥材料的方法显然是使用 HSM 而不是软件加密库无论如何。
  • @softwariness 这是很好的信息,谢谢。即使我家里没有 HSM(无论如何也不适合我的笔记本电脑:))
  • @MaartenBodewes 说得好 ;-)
  • @Maarten - 良好的观察力;你不是第一个。 Crypto++ 有很多自我记录的代码和一个 wiki 来尝试填补空白。您可以在 Crypto++ Wiki 找到 wiki。

标签: c++ cryptography crypto++ diffie-hellman


【解决方案1】:

要从Integer 中提取字节,请使用MinEncodedSizeEncode 方法(see the Crypto++ documentation)。注意编码是大端的。

这是一个将其包装起来的示例方法(假设 Integer 是无符号的,适用于这种情况):

void UnsignedIntegerToByteBlock(const Integer& x, SecByteBlock& bytes)
{
    size_t encodedSize = x.MinEncodedSize(Integer::UNSIGNED);
    bytes.resize(encodedSize);
    x.Encode(bytes.BytePtr(), encodedSize, Integer::UNSIGNED);
}

你可以这样使用它:

Integer a;
// ...
SecByteBlock bbA;
UnsignedIntegerToByteBlock(a, bbA);

【讨论】:

  • “注意编码是大端” - 我们开始为 Integer 类添加 一些 小端支持;见Integer Patch。但是支持没有扩展到各种EncodeDecode方法。
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 2019-08-17
  • 2014-06-18
相关资源
最近更新 更多