我正在使用Crypto++
库来使用C ++来加密128位消息及其公钥和来自磁盘的私钥。但是,当我调用我的函数时,程序将终止并显示错误消息:
在抛出一个实例后终止调用 'CryptoPP :: InvalidArgument'what():RSA / OAEP-MGF1(SHA-1):message 长度256超过此公钥的最大值
我不确定为什么当它们显然是128位时它认为我的消息是256位。以下是我的代码:
std::string encryptWithBothKeys(std::string key_name1, std::string key_name2, std::string plain){
std::string cipher1, cipher2;
AutoSeededRandomPool rng;
RSA::PublicKey pub_key;
RSA::PrivateKey priv_key;
loadPublicKey(key_name1, pub_key);
loadPrivateKey(key_name2, priv_key);
RSAES_OAEP_SHA_Encryptor e_pub(pub_key);
RSAES_OAEP_SHA_Encryptor e_priv(priv_key);
StringSource ss1(plain, true,
new PK_EncryptorFilter(rng, e_pub,
new StringSink(cipher1)
)
);
StringSource ss2(cipher1, true,
new PK_EncryptorFilter(rng, e_priv,
new StringSink(cipher2)
)
);
return cipher2;
}
void load(const std::string& filename, BufferedTransformation& bt){
FileSource file(filename.c_str(), true /*pumpAll*/);
file.TransferTo(bt);
bt.MessageEnd();
}
void loadPrivateKey(const std::string& filename, PrivateKey& key){
ByteQueue queue;
load(filename, queue);
key.Load(queue);
}
void loadPublicKey(const std::string& filename, PublicKey& key){
ByteQueue queue;
load(filename, queue);
key.Load(queue);
}
在主要功能中我称之为:
std::string encrypted_msg = encryptWithBothKeys("their.pub", "my.key", "0123456789ABCDEF");
有什么建议吗?
编辑:在第一次加密大小为256之后变成密文。我想我需要弄清楚为什么它会增加大小。
答案 0 :(得分:1)
我不确定为什么当它们显然是128位时它认为我的消息是256位。以下是我的代码:
这些是字节,而不是位。
您使用的RSA模数是多少?我猜它是一个2048位的密钥,它是256字节,由于OAEP填充而留下了大约214字节。
问题就变成了,plain
和cipher1
的大小在此期间:
StringSource ss1(plain, true,
new PK_EncryptorFilter(rng, e_pub,
new StringSink(cipher1)
)
);
我的猜测是plain1
足够小。但是,当填充和加密时,它会扩展为256字节cipher1
。因此,执行此操作时,消息cipher1
太大了:
StringSource ss2(cipher1, true,
new PK_EncryptorFilter(rng, e_priv,
new StringSink(cipher2)
)
);
此外,如果以上使用PK_DecryptorFilter
?您确定要再次加密吗?如果是,那你为什么要使用e_priv
?
使用私钥加密不是有效的加密操作。如果您希望"使用私钥进行加密"事情,它通常意味着你想要一个 恢复概率签名方案(PSSR) 。 Crypto ++提供了几个。