为什么Crypto ++认为我的消息比它们大?

时间:2015-12-02 04:54:49

标签: c++ crypto++

我正在使用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之后变成密文。我想我需要弄清楚为什么它会增加大小。

1 个答案:

答案 0 :(得分:1)

  

我不确定为什么当它们显然是128位时它认为我的消息是256位。以下是我的代码:

这些是字节,而不是位。

您使用的RSA模数是多少?我猜它是一个2048位的密钥,它是256字节,由于OAEP填充而留下了大约214字节。

问题就变成了,plaincipher1的大小在此期间:

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 ++提供了几个。