- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
对于提出这个问题的不礼貌,我提前表示歉意,但我已经被困了很长时间,我正在努力弄清楚下一步该怎么做。本质上,我正在尝试对某些数据执行 ElGamal 加密。我得到了一个临时 key 对的公共(public)部分和第二个静态 key ,以及一些数据。如果我的理解是正确的,这就是执行加密所需的全部内容,但我正在努力弄清楚如何使用 Crypto++。
我没完没了地寻找示例,但在 Google 上几乎找不到零示例。 Ohloh 没有多大帮助,因为我只是找回了无数页的 cryptopp ElGamal 源文件,我似乎无法弄清楚(我对使用 Crypto++ 比较陌生,直到大约 3 天前甚至还没有听说过 ElGamal)。
我能找到的最接近的示例来自 CryptoPP 包本身,如下所示:
bool ValidateElGamal()
{
cout << "\nElGamal validation suite running...\n\n";
bool pass = true;
{
FileSource fc("TestData/elgc1024.dat", true, new HexDecoder);
ElGamalDecryptor privC(fc);
ElGamalEncryptor pubC(privC);
privC.AccessKey().Precompute();
ByteQueue queue;
privC.AccessKey().SavePrecomputation(queue);
privC.AccessKey().LoadPrecomputation(queue);
pass = CryptoSystemValidate(privC, pubC) && pass;
}
return pass;
}
但是,这似乎对我没有太大帮助,因为我不知道如何插入我已经计算出的值。我不确定我是否正在努力理解 Elgamal 的工作原理(完全有可能),或者在使用我从 CryptoPP 获得的东西时我是否只是个白痴。谁能帮我指出正确的方向?
最佳答案
I have been given the public part of an ephemeral key pair and a second static key, as well as some data.
我们在这里无法真正帮助您,因为我们对应该做什么一无所知。
临时 key 对可能用于模拟 key 交换,而静态 key 长期用于签署临时交换。除此之外,任何人都在猜测发生了什么。
你会碰巧知道 key 是什么吗?临时 key 是 Diffie-Hellman key ,静态 key 是 ElGamal 签名 key 吗?
If my understanding is correct, this is all I need to perform the encryption, but I'm struggling to figure out how using Crypto++.
对于加密示例,我要作弊并使用 RSA encryption example并将其移植到 ElGamal。这与复制和粘贴一样困难,因为 RSA 加密和 ElGamal encryption遵守 PK_Encryptor
和 PK_Decryptor
接口(interface)。查看PK_Encryptor
和 PK_Decryptor
类的详细信息。 (请记住,您可能需要 ElGamal 或 Nyberg-Rueppel (NR) 签名示例)。
Crypto++ 有一个基于 ElGamal 的密码系统。密码系统会在对称 key 下加密一大块明文,然后在 ElGamal key 下加密对称 key 。不过,我不确定它遵循什么标准(可能是 IEEE 的 P1363)。请参阅 elgamal.h 中的 SymmetricEncrypt
和 SymmetricDecrypt
.
key 大小人为较小,因此程序运行速度很快。 ElGamal 是一个离散对数问题,因此其 key 大小在实践中应为 2048 位或更高。 2048 位得到 ECRYPT(亚洲)、ISO/IEC(全局)、NESSIE(欧洲)和 NIST(美国)的支持。
如果您需要保存/保留/加载您生成的 key ,请参阅 Keys and Formats在 Crypto++ 维基上。简短的回答是调用 decryptor.Save()
和 decryptor.Load()
;并远离 {BER|DER}
编码。
如果需要,您可以使用标准的string
而不是SecByteBlock
。如果您有兴趣通过 cout
和 friend 将内容打印到终端,则 string
会更容易。
最后,Crypto++ Wiki 上现在有一个页面涵盖了以下程序的源代码主题。请参见 Crypto++ 的 ElGamal Encryption .
#include <iostream>
using std::cout;
using std::cerr;
using std::endl;
#include <cryptopp/osrng.h>
using CryptoPP::AutoSeededRandomPool;
#include <cryptopp/secblock.h>
using CryptoPP::SecByteBlock;
#include <cryptopp/elgamal.h>
using CryptoPP::ElGamal;
using CryptoPP::ElGamalKeys;
#include <cryptopp/cryptlib.h>
using CryptoPP::DecodingResult;
int main(int argc, char* argv[])
{
////////////////////////////////////////////////
// Generate keys
AutoSeededRandomPool rng;
cout << "Generating private key. This may take some time..." << endl;
ElGamal::Decryptor decryptor;
decryptor.AccessKey().GenerateRandomWithKeySize(rng, 512);
const ElGamalKeys::PrivateKey& privateKey = decryptor.AccessKey();
ElGamal::Encryptor encryptor(decryptor);
const PublicKey& publicKey = encryptor.AccessKey();
////////////////////////////////////////////////
// Secret to protect
static const int SECRET_SIZE = 16;
SecByteBlock plaintext( SECRET_SIZE );
memset( plaintext, 'A', SECRET_SIZE );
////////////////////////////////////////////////
// Encrypt
// Now that there is a concrete object, we can validate
assert( 0 != encryptor.FixedMaxPlaintextLength() );
assert( plaintext.size() <= encryptor.FixedMaxPlaintextLength() );
// Create cipher text space
size_t ecl = encryptor.CiphertextLength( plaintext.size() );
assert( 0 != ecl );
SecByteBlock ciphertext( ecl );
encryptor.Encrypt( rng, plaintext, plaintext.size(), ciphertext );
////////////////////////////////////////////////
// Decrypt
// Now that there is a concrete object, we can check sizes
assert( 0 != decryptor.FixedCiphertextLength() );
assert( ciphertext.size() <= decryptor.FixedCiphertextLength() );
// Create recovered text space
size_t dpl = decryptor.MaxPlaintextLength( ciphertext.size() );
assert( 0 != dpl );
SecByteBlock recovered( dpl );
DecodingResult result = decryptor.Decrypt( rng, ciphertext, ciphertext.size(), recovered );
// More sanity checks
assert( result.isValidCoding );
assert( result.messageLength <= decryptor.MaxPlaintextLength( ciphertext.size() ) );
// At this point, we can set the size of the recovered
// data. Until decryption occurs (successfully), we
// only know its maximum size
recovered.resize( result.messageLength );
// SecByteBlock is overloaded for proper results below
assert( plaintext == recovered );
// If the assert fires, we won't get this far.
if(plaintext == recovered)
cout << "Recovered plain text" << endl;
else
cout << "Failed to recover plain text" << endl;
return !(plaintext == recovered);
}
您还可以从 PrivateKey
创建 Decryptor
,如下所示:
ElGamalKeys::PrivateKey k;
k.GenerateRandomWithKeySize(rng, 512);
ElGamal::Decryptor d(k);
...
还有一个来自PublicKey
的Encryptor
:
ElGamalKeys::PublicKey pk;
privateKey.MakePublicKey(pk);
ElGamal::Encryptor e(pk);
您可以按如下方式将 key 保存到磁盘和从磁盘加载 key :
ElGamalKeys::PrivateKey privateKey1;
privateKey1.GenerateRandomWithKeySize(prng, 2048);
privateKey1.Save(FileSink("elgamal.der", true /*binary*/).Ref());
ElGamalKeys::PrivateKey privateKey2;
privateKey2.Load(FileSource("elgamal.der", true /*pump*/).Ref());
privateKey2.Validate(prng, 3);
ElGamal::Decryptor decryptor(privateKey2);
// ...
key 是 ASN.1 编码的,因此您可以使用类似 Peter Gutmann 的 dumpasn1
的方式转储它们:
$ ./cryptopp-elgamal-keys.exe
Generating private key. This may take some time...
$ dumpasn1 elgamal.der
0 556: SEQUENCE {
4 257: INTEGER
: 00 C0 8F 5A 29 88 82 8C 88 7D 00 AE 08 F0 37 AC
: FA F3 6B FC 4D B2 EF 5D 65 92 FD 39 98 04 C7 6D
: 6D 74 F5 FA 84 8F 56 0C DD B4 96 B2 51 81 E3 A1
: 75 F6 BE 82 46 67 92 F2 B3 EC 41 00 70 5C 45 BF
: 40 A0 2C EC 15 49 AD 92 F1 3E 4D 06 E2 89 C6 5F
: 0A 5A 88 32 3D BD 66 59 12 A1 CB 15 B1 72 FE F3
: 2D 19 DD 07 DF A8 D6 4C B8 D0 AB 22 7C F2 79 4B
: 6D 23 CE 40 EC FB DF B8 68 A4 8E 52 A9 9B 22 F1
: [ Another 129 bytes skipped ]
265 1: INTEGER 3
268 257: INTEGER
: 00 BA 4D ED 20 E8 36 AC 01 F6 5C 9C DA 62 11 BB
: E9 71 D0 AB B7 E2 D3 61 37 E2 7B 5C B3 77 2C C9
: FC DE 43 70 AE AA 5A 3C 80 0A 2E B0 FA C9 18 E5
: 1C 72 86 46 96 E9 9A 44 08 FF 43 62 95 BE D7 37
: F8 99 16 59 7D FA 3A 73 DD 0D C8 CA 19 B8 6D CA
: 8D 8E 89 52 50 4E 3A 84 B3 17 BD 71 1A 1D 38 9E
: 4A C4 04 F3 A2 1A F7 1F 34 F0 5A B9 CD B4 E2 7F
: 8C 40 18 22 58 85 14 40 E0 BF 01 2D 52 B7 69 7B
: [ Another 129 bytes skipped ]
529 29: INTEGER
: 01 61 40 24 1F 48 00 4C 35 86 0B 9D 02 8C B8 90
: B1 56 CF BD A4 75 FE E2 8E 0B B3 66 08
: }
0 warnings, 0 errors.
关于c++ - ElGamal 加密示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19974669/
对于提出这个问题的不礼貌,我提前表示歉意,但我已经被困了很长时间,我正在努力弄清楚下一步该怎么做。本质上,我正在尝试对某些数据执行 ElGamal 加密。我得到了一个临时 key 对的公共(publi
如何为 elgamal 签名方案找到生成器?大多数程序使用的值是好的生成器吗?还是有一种方法可以找到素数的生成器?如果是这样,如何?是否可以说质数至少有 1 个生成元? 最佳答案 使用 DSA 而不是
我已经基于 this 在 JavaScript 中实现了一个 ElGamal 方案(代码很糟糕,只是想快速测试一下)解释。 var forge = require('node-forge'); var
我正在使用 El Gamal 密码系统,我的目标是能够加密和解密长文本序列。 El Gamal 要求明文是一个整数。我使用字符串的 .getBytes() 方法将我的字符串转换为 byte[],然后从
嗨,我正在用 java 编写一个程序来测试 elgamal 加密的变体,但是我的问题不是加密/解密链本身,而是如何对给定的输入执行操作:文本文件。我有一个文本文件,其中包含一些单词(例如内容可以是:“
我有以下 ElGamal 加密方案 const forge = require('node-forge'); const bigInt = require("big-integer"); // Gen
我一直致力于加密字符串并将其显示为二维码(在对字符串进行 Base64 编码之后)。 我想使用PyCrypto中的ElGamal私钥-公钥加密模块进行加密,但问题是它没有导出功能将 key 保存到文本
我正在尝试使用 ElGamal 加密和解密文本文件以进行研究,但似乎无法使其正常工作。我有一组 1kb - 1mb 的文本文件,我使用 512 位作为我的 key 大小。我已经知道,就像 RSA 一样
我发现OpenSSL尚未实现ElGamal。但是,目前我需要使用OpenSSL来实现ElGamal。我只是想知道以前是否有人这样做过。这可能会帮助我减轻工作负担。如果没有,在 OpenSSL 中实现
我正在使用 Libgcrypt 和 Elgamal 来加密一个字节块,但我遇到了两个问题: 当我不使用填充并且我的字节块以零字节开始时,我在解密过程中丢失了第一个字节; 如果我使用填充,加密效果很好,
(这纯粹是出于学术目的) 我已经使用充气城堡实现了 RSA 和 ElGamal,但我不确定如何实现 EC ElGamal。充气城堡规范中的第 4.4 节说:“org.bouncycaSTLe.cryp
长话短说:我需要使用 ElGamal 加密来对编码数字执行乘法。 我目前正在将 Kotlin 与 OpenJDK 1.8 一起使用,并找到了一个名为 Bouncy CaSTLe 的 JCE 不错的提供
我创建了一个小程序来使用 Bouncy CaSTLe 1.47 API 生成 DSA/El Gamal PGP key 环。 key 生成非常顺利,没有错误。我使用装甲输出将私钥和公钥导出到一个文件中
要在 java 代码中使用 ElGamal 方案加密消息,我按以下步骤进行: Security.addProvider(new org.bouncycastle.jce.provider.Bouncy
我是一名优秀的程序员,十分优秀!