- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对来自 Botan 加密库的 c++ mc-eliece 实现有问题。在整个互联网上似乎几乎只有一个例子,并带有指向它的链接。
https://www.cryptosource.de/docs/mceliece_in_botan.pdf
但是这个例子已经有 6 年的历史了,因此它已经完全过时了,Botan 文档没有提供任何其他的。
问题基本上是,不幸的是函数名称和规范随着时间的推移而变化,因此在我尝试使用它们时出现了一些编译器错误。通过研究 header 实现,我设法揭开了其中一些的神秘面纱。但现在,坦率地说,我在墙前。
如果任何熟悉 Botan MC-Eliece 实现的人能给我一个提示,如何调用当前函数,那就太好了。
这是我的带有标记的代码。我删除了很多不必要的代码和其他实现,使其更具可读性。如果没有必要的模块,您也将无法使其运行,但我会尝试以某种方式将其写下来,让拥有 Botan 库的人应该能够运行它。
//to compile: g++ -o mc_eliece mc_eliece.cpp -Wall -I/usr/local/include/botan-2/ -I/home/pi/projects/RNG_final/ -ltss2-esys -ltss2-rc -lbotan-2
#include <iostream>
#include <botan/rng.h>
#include <botan/system_rng.h>
#include <botan/mceies.h>
#include <botan/mceliece.h>
int main() {
Botan::size_t n = 1632; // Parameters for key generation
Botan::size_t t = 33;
// initialize RNG type
Botan::System_RNG rng; // is a standard Botan RNG
// create a new MCEliece private key with code length n and error weigth t
Botan::McEliece_PrivateKey sk1(rng, n, t); // actually works!
// derive the corresponding public key
Botan::McEliece_PublicKey pk1(*dynamic_cast<Botan::McEliece_PublicKey*>(&sk1)); // actually works!
// encode the public key
std::vector<uint8_t> pk_enc = pk1.subject_public_key(); // actually works!
// encode the private key
Botan::secure_vector<uint8_t> sk_enc = sk1.private_key_bits(); // had to replace sk1.pkcs8_private_key()
// encryption side: decode a serialized public key
Botan::McEliece_PublicKey pk(pk_enc);
McEliece_KEM_Encryptor enc(pk); // does not work, can't find a working corresponding function in the header
// perform encryption -> will find out if it works after upper case had been solved
std::pair<secure_vector<Botan::byte>,secure_vector<Botan::byte> > ciphertext__sym_key = enc.encrypt(rng);
secure_vector<Botan::byte> sym_key_encr = ciphertext__sym_key.second;
secure_vector<Botan::byte> ciphertext = ciphertext__sym_key.first;
// code used at the decrypting side: -> will find out if it works after upper case had been solved
// decode a serialized private key
McEliece_PrivateKey sk(sk_enc);
McEliece_KEM_Decryptor dec(sk);
// perform decryption -> will find out if it works after upper case had been solved
secure_vector<Botan::byte> sym_key_decr = dec.decrypt(&ciphertext[0],
ciphertext.size() );
// both sides now have the same 64-byte symmetric key.
// use this key to instantiate an authenticated encryption scheme.
// in case shorter keys are needed, they can simple be cut off.
return 0;
}
感谢您提前提供任何帮助。
最佳答案
McEliece 单元测试可以作为引用(link)。
基于该代码,您的示例可以重写如下:
#include <botan/auto_rng.h>
#include <botan/data_src.h>
#include <botan/hex.h>
#include <botan/mceies.h>
#include <botan/mceliece.h>
#include <botan/pkcs8.h>
#include <botan/pubkey.h>
#include <botan/x509_key.h>
#include <cassert>
#include <iostream>
int main() {
// Parameters for McEliece key
// Reference: https://en.wikipedia.org/wiki/McEliece_cryptosystem#Key_sizes
Botan::size_t n = 1632;
Botan::size_t t = 33;
// Size of the symmetric key in bytes
Botan::size_t shared_key_size = 64;
// Key-derivation function to be used for key encapsulation
// Reference: https://botan.randombit.net/handbook/api_ref/kdf.html
std::string kdf{"KDF1(SHA-512)"};
// Salt to be used for key derivation
// NOTE: Pick salt dynamically, Botan recommds for example using a session ID.
std::vector<Botan::byte> salt{0x01, 0x02, 0x03};
Botan::AutoSeeded_RNG rng{};
// Generate private key
Botan::McEliece_PrivateKey priv{rng, n, t};
std::vector<Botan::byte> pub_enc{priv.subject_public_key()};
Botan::secure_vector<Botan::byte> priv_enc{Botan::PKCS8::BER_encode(priv)};
// Encrypting side: Create encapsulated symmetric key
std::unique_ptr<Botan::Public_Key> pub{Botan::X509::load_key(pub_enc)};
Botan::PK_KEM_Encryptor encryptor{*pub, rng, kdf};
Botan::secure_vector<Botan::byte> encapsulated_key{};
Botan::secure_vector<Botan::byte> shared_key1{};
encryptor.encrypt(encapsulated_key, shared_key1, shared_key_size, rng, salt);
std::cout << "Shared key 1: " << Botan::hex_encode(shared_key1) << std::endl;
// Decrypting side: Unpack encapsulated symmetric key
Botan::DataSource_Memory priv_enc_src{priv_enc};
std::unique_ptr<Botan::Private_Key> priv2{
Botan::PKCS8::load_key(priv_enc_src)};
Botan::PK_KEM_Decryptor decryptor{*priv2, rng, kdf};
Botan::secure_vector<Botan::byte> shared_key2{
decryptor.decrypt(encapsulated_key, shared_key_size, salt)};
std::cout << "Shared key 2: " << Botan::hex_encode(shared_key2) << std::endl;
assert(shared_key1 == shared_key2);
return 0;
}
我针对 2.15.0 测试了这段代码。示例输出:
$ g++ -g $(pkg-config --cflags --libs botan-2) test.cpp
$ ./a.out
Shared key 1: 32177925CE5F3D607BA45575195F13B9E0123BD739580DFCF9AE53D417C530DB115867E5E377735CB405CDA6DF7866C647F85FDAC5C407BB2E2C3A8E7D41A5CC
Shared key 2: 32177925CE5F3D607BA45575195F13B9E0123BD739580DFCF9AE53D417C530DB115867E5E377735CB405CDA6DF7866C647F85FDAC5C407BB2E2C3A8E7D41A5CC
与您提供的代码相比,我更改了一些注释:
Botan::Private_Key
也是 Botan::Public_Key
(reference)。因此,我们不需要将生成的私钥转换为公钥。相反,我们可以调用 subject_public_key
直接在私钥上获取公钥编码。private_key_bits
获取序列化工作的原始私钥位,但在互操作性方面使用 PKCS8 可能更健壮。所以我会使用 Botan::PKCS8::BER_encode
出于这个原因,在私钥上。McEliece_PublicKey
直接从公钥编码对我不起作用,因为构造函数需要原始公钥位而不是 x509 公钥编码。出于这个原因,我不得不使用 Botan::X509::load_key
.McEliece_KEM_Encryptor
已被删除 (reference):Add generalized interface for KEM (key encapsulation) techniques. Convert McEliece KEM to use it. The previous interfaces McEliece_KEM_Encryptor and McEliece_KEM_Decryptor have been removed. The new KEM interface now uses a KDF to hash the resulting keys; to get the same output as previously provided by McEliece_KEM_Encryptor, use "KDF1(SHA-512)" and request exactly 64 bytes.
Botan::PK_KEM_Encryptor
,它以公钥为参数,从公钥中推断出要使用的加密算法。从代码中可以看出,这种方式变得更加灵活,我们不必在生成 key 后引用 McEliece。如果我们想切换到不同的算法,我们只需要改变 key 生成部分,而不是 key 封装部分。McEliece_KEM_Decryptor
.Typically salt is a label or identifier, such as a session id.
关于c++ - Botan MC-Eliece 实现失败,因为已弃用实现示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63678081/
有什么区别 MyClass mc = MyClass(); 和 MyClass mc; 在 C++ 中? 最佳答案 第一个调用复制构造函数,以临时对象作为参数 - MyClass() 创建临时对象。
刚刚升级到 XCode 8 并将我的设备升级到 iOS 10,然后我在第一次输入任何文本字段时收到此消息。 [MC] System group container for systemgroup.co
我在 docx/document.xml 文件中看到这两个 and 元素,每个元素都包含一个元素。他们似乎以某种方式在 docx 中复制图片。为什么不是每张图一个?我正在尝试以编程方式替换图片。使用
我在为 MC mod 中具有图 block 实体的 block 添加“onBlockActivated”事件时遇到问题。该事件应该允许您将特定项目存储在 block 内或从 block 中取出它。我已
我需要获得两个字段之间的最大和最小值。我将 JPA 2.1 与 EclipsLink 结合使用。 这是我的简化查询: SELECT GREATEST(c.min, mc.max), LEAST(c.m
当我使用以下代码时,出现错误消息: [NSURLConnection sendAsynchronousRequest:request queue:myQueue completionHandler:^
嗨,我正在尝试将R的ddply库中的plyr与MC包一起使用。它似乎并没有加快计算速度。这是我运行的代码: require(doMC) registerDoMC(4) getDoParWorkers(
十年来,我一直在等量使用Fedora和Ubuntu,从我安装的午夜指挥官那里发现了一个细微但令人讨厌的差异。当您使用Fedora更改目录中的目录,然后退出时,它已经为您完成了chdir,但是在Ubun
这个问题在这里已经有了答案: How can I add the French trademark symbol (MD)? (3 个答案) 关闭 9 年前。
给定一个像 Marty Mcfly 这样的字符串,是否有正则表达式或其他单行解决方案来将 'f' 大写以便我得到 Marty McFly? 我总是可以指望名字和姓氏之间的空格,姓氏的第一个字母(即 M
public void arrowstick(PlayerInteractEvent event) { Player p = event.getPlayer();
private int[] myStuff; /** Precondition: myStuff contains int values in no particular order. /*/ p
我正在尝试将数据写入文件,但它没有出现,但我知道程序正在完成。我建立一个可写文件,从命令参数中获取名称 FILE *outFilePtr; 然后我通过以下方式创建文件: outFilePtr=fo
我正在尝试编写一种算法,使用蒙特卡洛方法求解积分。然而对于给定的输入数据,计算结果与预期不同;我计算表达式 exp(-ax^2),a = 1 并且点在 [0.5, 1] 范围内。我期望得到的结果大约是
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
进程文件: mc or mc.exe 进程名称: Kittyfeet MouseCount 进程类别:存在安全风险的进程 英文描述: mc.exe is an application by
使用 R 函数 parallel::mclapply,我发现参数 mc.cores 可以选择大于逻辑核心的数量(如 parallel::detectCores),导致加速比逻辑核心的数量更大。这是一个
DISTRIB_ID=Ubuntu DISTRIB_RELEASE=8.10 DISTRIB_CODENAME=intrepid DISTRIB_DESCRIPTION="Ubuntu 8.10" 这
在午夜指挥官 (mc) 的目录树中是否有一个键盘快捷键可以让我向上一级,这将使我免于进入.. ? 如下所示 - 假设我在一个包含大量内容的目录中,一直向上滚动很痛苦。它可以点击,但没有什么比键盘快捷键
在使用 CreateJS 的 Adobe AnimateCC 中,我在第一帧上有一个名为 disclaimer_btn 的 mc ,第一帧上的MC称为discTxt 。我希望能够将鼠标悬停在dis
我是一名优秀的程序员,十分优秀!