我需要在 PC 和支持 RSA 加密和使用 SHA1 签名的设备之间建立安全通信。由于我已经在应用程序的其他部分使用了 Crypto++,因此我也想为此使用 Crypto++。
该设备非常原始,但允许执行我在其上编写的程序。它内置了原始 RSA 和 SHAa 函数;但是,它可以使用的内存很少,准确地说是 2K 字节。
我必须对来自 PC 的消息进行加密和签名。然后设备解密并验证消息。然后设备将回复加密消息并在其上签名。PC 将解密该消息并随后对其进行验证。我已经使用内置函数在设备内部使用 SHA1 实现了原始 RSA 加密、签名和验证。消息足够短,可以在单轮中完成。
但是,我不知道如何在不涉及 OAEP 或 PKCS#1 的情况下使用 Crypto++ 使用原始 RSA 加密消息。有人可以向我展示一些示例代码吗?万分感谢!
我想保护我的数据不被未经授权的人更改或读取。环顾四周,我发现 Authenticated Encryption(AE) 是一个解决方案。
我知道我可以使用 CCM、GCM 或 EAX 中的任何一个在 Crypto++ 中进行 AE。但我注意到他们使用相同的密钥来加密和解密数据。我不想那样,我宁愿使用非对称密钥来加密和解密我的数据。
如果我使用非对称算法对数据进行签名,然后使用对称算法对其进行加密,我将实现我想要的(这应该是安全的,因为它是AtE方法,对吧?)。
但在我这样做之前,是否有任何加密库可以满足我的需求?
我第一次玩 Cryptopp,我找到了一个编码为十六进制的例子......一切都很好。现在我想将生成的 std::string 解码为原始字符串,但我得到的只是空字符串。
#include "stdafx.h"
#include "../cryptopp562/sha.h"
#include "../cryptopp562/filters.h"
#include "../cryptopp562/hex.h"
#include <iostream>
#include <string>
int main() {
CryptoPP::SHA1 sha1;
std::string source = "Panawara";
std::string hash = "";
std::string original= "" ;
CryptoPP::StringSource(source, true, new CryptoPP::HashFilter(sha1, new CryptoPP::HexEncoder(new CryptoPP::StringSink(hash))));
std::cout << hash;
std::cout << "\n";
CryptoPP::StringSource (hash, new CryptoPP::HexDecoder(new CryptoPP::StringSink(original))); // the result is always empty String
std::cout << original;
std::cout << "\n";
system("pause");
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Crypto++ 库中的 AES 加密:
CBC_Mode<AES>::Encryption e;
Run Code Online (Sandbox Code Playgroud)
我有一个需要加密的二进制数据块。该类似乎提供了ProcessData
为此目的调用的方法:
virtual void ProcessData(byte *outString, const byte *inString, size_t length);
Run Code Online (Sandbox Code Playgroud)
看起来最后一个参数是输入数据的大小。不清楚的是为什么该方法不返回加密数据的大小。是否假设输出数据块的大小与输入数据块的长度完全相同?即使输入数据的大小只有一个字节,这是否有效?问候。
我编写了一些包装函数来使用 crypto++ 加密/解密文件。我尝试在 wiki 中查找,但可以找到我的答案。我想知道是否需要显式销毁创建的对象?
我在 wiki 中发现,某些对象在传递给函数时会为您销毁,但是那里没有我确切使用的示例,所以我只是想确定一下。
CryptoPP::AutoSeededRandomPool prng;
//Key generation
byte key[AES::DEFAULT_KEYLENGTH];
prng.GenerateBlock(key, sizeof(key));
//IV generation
byte iv[AES::BLOCKSIZE];
prng.GenerateBlock(iv, sizeof(iv));
//print key
encoded.clear();
StringSource(key, sizeof(key), true, new HexEncoder(new StringSink(encoded)));
cout << "key: " << encoded << endl;
cout << "Size of key: " << sizeof(key) << endl;
//print iv
encoded.clear();
StringSource(iv, sizeof(iv), true, new HexEncoder(new StringSink(encoded)));
cout << "iv: " << encoded << endl;
cout << "Size of iv: " << sizeof(iv) << endl;
//See function below
encrypt_file(inFile, …
Run Code Online (Sandbox Code Playgroud) 情况
我有两个任意来源,比如说StringSource
来自签名的一个和FileSource
来自相应签名文件的一个。我现在想验证当前执行的文件签名,如下所示:
bool VerifyFile(const ECDSA<ECP, SHA512>::PublicKey &key,
const std::string &filename,
const std::string &signatureString) {
std::string fileContentString;
FileSource(filename.c_str(), true,
new CryptoPP::StringSink(fileContentString));
bool result = false;
StringSource(signatureString + fileContentString, true,
new SignatureVerificationFilter(
ECDSA<ECP, SHA512>::Verifier(key),
new ArraySink((byte *) &result, sizeof(result))
) // SignatureVerificationFilter
);
return result;
}
Run Code Online (Sandbox Code Playgroud)
我的问题
我不想将文件的内容显式提取到字符串中,然后进行串联并随后进行验证。
问题
有没有一种方法可以将两个任意源传递给验证实体,其中一个表示签名,另一个表示签名内容(可能是文件或字符串)?
到目前为止我尝试过的
我尝试重定向Source::TransferAll(...)
到 a ,但没有成功。Redirecter
SignatureVerificationFilter
我有一个以这种方式创建的签名:
size_t siglenth = _signer.MaxSignatureLength();
QByteArray signature(siglenth, 0x00);
signature.reserve(siglenth);
siglenth = _signer.SignMessage(_prng,
(const CryptoPP::byte*) (message.constData()),
message.length(), (CryptoPP::byte*) signature.data());
Run Code Online (Sandbox Code Playgroud)
我的签名大小为 64,包含:
ECCD530E5F232B7C566CA5322F990B3D55ED91156DF3845C4B9105BFE57606DDD68F332A0A5BF7CAB673E4970D10109B72F11457ACD78CED11457ACD7894ED
从我在dsa.h
文件中阅读的内容来看,这个签名目前是DSA_P1363
格式。我需要将其转换为DSA_DER
格式。
要执行此操作,我尝试:
QByteArray derSign(70, 0xFF);
size_t converted_size = CryptoPP::DSAConvertSignatureFormat(
(CryptoPP::byte*) (derSign.data()), sizeof(derSign.data()), CryptoPP::DSA_DER,
(CryptoPP::byte*) (signature.data()), sizeof(signature.data()), CryptoPP::DSA_P1363);
Run Code Online (Sandbox Code Playgroud)
此转换的输出如下所示。它似乎只是签名的第一部分。它的大小为 8,包含:
300D020500ECCD53
怎么了?
谢谢。
我是 Crypto++ 的新手,想将我在网上找到的文本加密代码“转换”为 Crypto++ 文件加密。基本上,图像文件只是一堆需要分块读取的文本,对吗?
我想读取图像文件并使用CryptoPP::AES对其进行加密:
void encryptImage(std::filesystem::path const& file) {
std::ifstream inpf(file.string().c_str(), std::ios::binary);
CryptoPP::AutoSeededRandomPool rnd;
int keyLength = CryptoPP::AES::DEFAULT_KEYLENGTH; // 16 bytes = 128 bit key
int defBlockSize = CryptoPP::AES::BLOCKSIZE;
// Generate a random key
CryptoPP::byte key[CryptoPP::AES::DEFAULT_KEYLENGTH];
rnd.GenerateBlock(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
// Generate a random IV
CryptoPP::byte iv[CryptoPP::AES::BLOCKSIZE];
rnd.GenerateBlock(iv, CryptoPP::AES::BLOCKSIZE);
char plainText[] = "Hello! How are you.";
int messageLen = (int)strlen(plainText) + 1;
//encrypt
CryptoPP::CFB_Mode<CryptoPP::AES>::Encryption cfbEncryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH, iv);
cfbEncryption.ProcessData((CryptoPP::byte*)plainText, (CryptoPP::byte*)plainText, messageLen);
}
Run Code Online (Sandbox Code Playgroud)
如果我正确理解这段代码,它会设置一个随机密钥和一个随机 IV(不知道那是什么意思)并使用CFB_MODE::Encryption方法来加密来自纯 …
我正在寻找最快的 SHA1 实现,因为我必须对其进行数百万次计算。我尝试了boost::uuids::detail::sha1和OpenSSL SHA1,我发现 OpenSSL 比 boost 快 2.5 倍。我还检查了Crypto++,它比其他两个慢得多。以下是我检查他们表现的方法:
#include "openssl/sha.h"
void sha1_ossl (const unsigned char* data) {
unsigned char hash[20];
for (long i=0; i<100000000; ++i) {
SHA1(data, 64, hash);
if ((unsigned int)hash[0]==0 && (unsigned int)hash[1]==0 && (unsigned int)hash[2]==0 && (unsigned int)hash[3]==0)
break;
}
}
Run Code Online (Sandbox Code Playgroud)
#include <boost/uuid/detail/sha1.hpp>
void sha1_boost (const unsigned char* data) {
boost::uuids::detail::sha1 sha1;
unsigned hash[5];
for (long i=0; i<100000000; ++i) {
sha1.process_bytes(data, 64);
sha1.get_digest(hash);
sha1.reset(); …
Run Code Online (Sandbox Code Playgroud) 我确实使用下面的代码生成了一个签名,但是,我想要一个 IEEE P1336(长度 80)格式的签名
guard let signData = SecKeyCreateSignature(
key,
SecKeyAlgorithm.ecdsaSignatureMessageX962SHA256,
signatureString.data(using: .utf8)! as CFData, &error) else {
let e = error!.takeRetainedValue() as Error
print("Signing Error \( e.localizedDescription)")
return nil
}
let signedData = signData as Data
let signedString = signedData.base64EncodedString(options: [])
Run Code Online (Sandbox Code Playgroud)